insert(X,[],[X]). insert(X,[Y|Ys],[X,Y|Ys]) :- X < Y. insert(X,[Y|Ys],[Y|Zs]) :- X >= Y , insert(X,Ys,Zs). isort([],[]). isort([X|Xs],Zs) :- isort(Xs,Ys), insert(X,Ys,Zs). %% ---------------------------------------------------------------------- %% doesn't preserve order; %% moves potential mins closer to the front minandrem(X,[X],[]). minandrem(M1,[X|Xs],[X|Ys]) :- minandrem(M1,Xs,Ys), M1 < X. minandrem(X,[X|Xs],[M1|Ys]) :- minandrem(M1,Xs,Ys), M1 >= X. ssort([],[]). ssort(Xs,[Y|Zs]) :- minandrem(Y,Xs,Ys), ssort(Ys,Zs). %% ---------------------------------------------------------------------- alllt(_,[],[]). alllt(P,[X|Xs],[X|Ys]) :- X < P, alllt(P,Xs,Ys). alllt(P,[X|Xs],Ys) :- X >= P, alllt(P,Xs,Ys). allgte(_,[],[]). allgte(P,[X|Xs],[X|Ys]) :- X >= P, allgte(P,Xs,Ys). allgte(P,[X|Xs],Ys) :- X < P, allgte(P,Xs,Ys). append([],Ys,Ys). append([X|Xs],Ys,[X|Zs]) :- append(Xs,Ys,Zs). qsort([],[]). qsort([X|Xs],Ys) :- alllt(X,Xs,Xs1), qsort(Xs1,Xs1s), allgte(X,Xs,Xs2), qsort(Xs2,Xs2s), append(Xs1s,[X|Xs2s],Ys).