Sorts the list represented by Y using the predicate represented by X - and attempts to unify the result with Z. The predicate represented by X must indicate whether the second argument is equal, less than or greater than the third argument - by unifying the first argument with an atom which has the value =, < or >.
Examples
?- predsort(compare, [s,d,f,a,a,a,z], X).
X = [a,a,a,d,f,s,z]
yes
?- predsort(compare, [s,d,f,a,a,a,z], [a,a,a,d,f,s,z]).
yes
?- predsort(compare, [s,d,f,a,a,a,z], [s,d,f,a,a,a,z]).
no
?- predsort(compare, [], []).
yes compare_desc(X,Y,Z) :- Y@<Z, X='>'.
compare_desc(X,Y,Z) :- Y@>Z, X='<'.
compare_desc(X,Y,Z) :- Y==Z, X='='.
compare_desc(asc,X,Y,Z) :- Y@<Z, X='>'.
compare_desc(asc,X,Y,Z) :- Y@>Z, X='<'.
compare_desc(asc,X,Y,Z) :- Y==Z, X='='.
compare_desc(desc,X,Y,Z) :- Y@<Z, X='<'.
compare_desc(desc,X,Y,Z) :- Y@>Z, X='>'.
compare_desc(desc,X,Y,Z) :- Y==Z, X='='.
?- predsort(compare_desc, [s,d,f,a,a,a,z], X).
X = [z,s,f,d,a,a,a]
yesNote: This behaviour is different than the SWI version. SWI version removes duplicates.
?- predsort(compare_desc(asc), [s,d,f,a,a,a,z], X).
X = [z,s,f,d,a,a,a]
yes compare_retryable('>',_,_).
compare_retryable('<',_,_).
compare_retryable('=',_,_).
Note: This behaviour is different than the SWI version. SWI version backtracks to find alternative solutions.
?- predsort(compare_retryable, [s,z], X).
X = [s,z]
yes