Permutierte Kombinationen der Elemente einer Liste - Prolog

8

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]

    
Simon 02.01.2011, 14:21
quelle

4 Antworten

10

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%     
hardmath 02.01.2011, 15:11
quelle
3

Es gibt ein vordefiniertes Prädikat namens Permutation ...

%Vor%

hoffe das hilft ..

    
AhmadAssaf 03.01.2011 05:57
quelle
3

Bleiben Sie rein, indem Sie comb/2 basierend auf same_length/2 definieren, prefix/2 , foldl/4 und select/3 :

%Vor%

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 !

%Vor%

Lassen Sie uns die obige Abfrage erneut mit der verbesserten Implementierung von comb/2 ! erneut ausführen.

%Vor%     
repeat 28.07.2015 09:17
quelle
0

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 :

%Vor%

Dann kann comb/3 rekursiv mit inselt/3 codiert werden.

    
Charles Stewart 02.01.2011 14:36
quelle

Tags und Links