Wie kann ich alle möglichen Kombinationen der Elemente einer Liste generieren?
Zum Beispiel möchte ich angesichts der Liste [1,2,3] ein Prädikat mit der Form comb([1,2,3], L).
entwerfen, das die folgende Antwort für L zurückgeben soll:
[1]
[2]
[3]
[1,2]
[2,1]
[1,3]
[3,1]
[2,3]
[3,2]
[1,2,3]
[1,3,2]
[2,1,3]
[2,3,1]
[3,1,2]
[3,2,1]
Was Sie fordern, beinhaltet sowohl Kombinationen (Auswählen einer Teilmenge) als auch Permutationen (Umordnen der Reihenfolge) einer Liste.
Ihre Beispielausgabe impliziert, dass die leere Liste nicht als gültige Lösung betrachtet wird. Daher werden wir sie in der folgenden Implementierung ausschließen. Überdenken Sie, ob dies ein Versehen war. Auch diese Implementierung erzeugt die Lösungen in einer anderen Reihenfolge als Ihre Beispielausgabe.
%Vor%Getestet mit Amzi! Prolog:
%Vor%Es gibt ein vordefiniertes Prädikat namens Permutation ...
%Vor%hoffe das hilft ..
Bleiben Sie rein, indem Sie comb/2
basierend auf same_length/2
definieren, prefix/2
, foldl/4
und
select/3
:
Hier ist die Beispielabfrage des OP:
%Vor%Ok! Was aber, wenn die als erstes Argument angegebene Liste Duplikate enthält?
%Vor% Nicht ganz! Können wir obige redundante Antworten loswerden? Ja, verwenden Sie einfach selectd/3
!
Lassen Sie uns die obige Abfrage erneut mit der verbesserten Implementierung von comb/2
! erneut ausführen.
Hinweis: Dies ist leicht zu machen, wenn Sie ein Prädikat inselt(X,Y,Z)
geschrieben haben, das gilt, wenn eine Einfügung von Y
in X
ergibt Z
:
Dann kann comb/3
rekursiv mit inselt/3
codiert werden.
Tags und Links prolog