检查列表是否有序

Check if list is ordered

我正在尝试比较 listinteger 的元素,看看它们是否有序。我正在使用 Amzi!

我尝试了几次,但没有任何效果...:(

ordered([X]).
ordered([N|[N1|L]]) :- N <= N1, ordered([N1|L]).

ordered_([X]).
ordered_([Head,Head1|Tail]) :- Head <= Head1, ordered_([Head1|Tail]).

两个 return no 如果输入此列表:

ordered([1,2,3,4]).
ordered_([1,2,3,4]).

我知道我需要比较 headhead of the tail

看起来不应该比

更复杂
ordered( []      ) .
ordered( [_]     ) .
ordered( [X,Y|Z] ) :- X =< Y , ordered( [Y|Z] ) .

此处涵盖算术比较谓词:http://www.amzi.com/manuals/amzi/pro/ref_math.htm#MathematicalComparisons

使用@=</2compare/3检查术语标准顺序中的事物顺序:http://www.amzi.com/manuals/amzi/pro/ref_manipulating_terms.htm#StandardOrder

一个紧凑的替代方案:

ordered(L) :- \+ ( append(_,[A,B|_], L), A > B ).

最受好评的解决方案的更有效替代方案,比较三个而不是将更大的元素追加回列表

is_sorted([]).
is_sorted([X, Y, Z|T]) :- X =< Y, Y =< Z, is_sorted(T).
is_sorted([X, Y|T]) :- X =< Y, is_sorted(T).