% ================================================================= :- pred constr(bool). :- mode constr(in). :- ignore constr/1. % ================================================================= % Program :- pred quicksort(list(int),list(int)). :- mode quicksort(in,out). quicksort([], []). quicksort([X | Xs], ResL) :- partition(X, Xs, Smalls, Bigs), % partition of the tail Xs quicksort(Smalls, Ls), % with respect to the pivot X. quicksort(Bigs, Bs), % X is NOT in Xs. concat4(Ls,X,Bs,ResL). :- pred partition(int,list(int),list(int),list(int)). :- mode partition(in,in,out,out). partition(X, [], [], []). partition(X, [Y | Ys], [Y | Ls], Bs) :- constr( (X>Y) ), partition(X, Ys, Ls, Bs). partition(X, [Y | Xs], Ls, [Y | Bs]) :- constr( (X= (H= % listmin(Ls,IsDefMinLs,MinLs), listmin(Bs,IsDefMinBs,MinBs), listmin(Xs,IsDefMinXs,MinXs), % is_asorted(Xs,B3), is_asorted(Ls,B4), is_asorted(Bs,B5) => constr(true). % %:- spec concat4(Xs,Y,Ys,Zs) ==> % listmin(Xs,IsDefMinXs,MinXs), listmin(Ys,IsDefMinYs,MinYs), listmin(Zs,IsDefMinZs,MinZs), % is_asorted(Xs,B3), is_asorted(Ys,B4), is_asorted(Zs,B5) => constr(true). % ================================================================= :- query ff1/0. % ================================================================= % Catamorphic abstraction :- cata_abs list(int) ==> listmin(Xs,IsDefMinXs,MinXs), is_asorted(Xs,B3). % =================================================================