Da es sehr viele Permutationen geben kann,
— so viel Speicherplatz gibt es auf der ganzen Welt nicht —
realisiert man in Prolog
den SlowSort mit der Tiefensuche.
Eine Permutation wird auf Sortierung getestet.
Bei Erfolg terminiert die Suche
(cut bzw. !).
Schlägt der Test
is_sorted
fehl, so wird Dank des internen Beweisverfahrens mittels
Backtracking
die nächst mögliche Permutation aufs Neue getestet.
Im Prinzip kann
permute
als zweistellige Relation betrachtet werden, die zu einer gegebenen Liste alle dazugehörigen Permutationen liefert
und
permute_
als dreistellige Hilfsrelation, die alle Listen mit gegebenen Wert
X
zurückgibt, wobei dieser Wert stets an einer anderen Stelle steht.
% ?-slowsort([1, 2, 1, 2, 4, 3, 5, 3, 4, 5], SL).
slowsort(L, SL) :- permute(L, SL), is_sorted(SL), !.
is_sorted([]).
is_sorted([_]).
is_sorted([X, X|Rest]) :- is_sorted([X|Rest]).
is_sorted([X, Y|Rest]) :- X < Y, is_sorted([Y|Rest]).
permute([], []).
permute([X|Rest], PL) :- permute(Rest, L), permute_(X, L, PL).
permute_(X, L, [X|L]).
permute_(X, [Y|L], [Y|PL]) :- permute_(X, L, PL).