Prolog: zufällige Permutation
Ich versuche eine zufällige Permutation mit Prolog zu bekommen. Aber das Problem ist
?- permutation([1,2,3,4],L).
gibt immer L = [1, 2, 3, 4]
als erste Antwort. Ich könnte dies mithilfe der Abfrage beheben
?- L1=[1,2,3,4], permutation(L1,L2), dif(L1,L2).
Aber das gibt mir immer L2 = [1, 2, 4, 3]
als erste Antwort.
Wie kann ich eine zufällige Permutation in SWI Prolog erhalten?
Ist das nicht [1,2,3,4]
zufällig genug? Sieht für mich zufällig aus!
Aber ich weiß, was du meinst - du willst eine Permutation, die zufälliger aussieht .
Warum nicht selbst rollen? Wählen Sie einfach das nächste Element aus einer immer kleiner werdenden "Eingabeliste".
Das ist etwas mühsam. Vielleicht gibt es elegantere Wege?
look_random_dammit([],[]) :- !.
% note that [PickedElement|PermutedList] APPENDS "PickedElement"
% to list being constructed. Appending or prepending does not
% really make a difference here though:
look_random_dammit(ListRemainder,[PickedElement|PermutedList]) :-
ListRemainder \== [],
length(ListRemainder,Length),
succ(Max,Length),
% We are now leaving logicland and asking an oracle to give
% use a random number. "Buckle your seatbelt Dorothy, 'cause
% Kansas is going bye-bye!"
random_between(0,Max,PickedIndex),
nth0(PickedIndex,ListRemainder,PickedElement),
length(Prefix,PickedIndex),
% Constructing a remainder list is probably slow
append([Prefix,[PickedElement],Suffix],ListRemainder) ,
append(Prefix,Suffix,ListRemainderNext),
look_random_dammit(ListRemainderNext,PermutedList).
Und so:
?- look_random_dammit([1,2,3,4],P).
P = [2,3,1,4] ;
false.
?- look_random_dammit([],P).
P = [] ;
false.
?- look_random_dammit([1,1,1,2,2],P).
P = [2,1,1,2,1] ;
false.
Wenn wir auch die Informationen darüber beibehalten würden, welche Elemente in der Gleichung ausgewählt wurden, könnten wir ein Prädikat schreiben, das "die Permutation umkehrt", da beim Erstellen keine Informationen verloren gingen.