Ich bin auf der Suche nach einem Prädikat, das funktioniert wie dies:
?- subset([1,2,3], X).
X = [] ;
X = [1] ;
X = [2] ;
X = [3] ;
X = [1, 2] ;
X = [1, 2, 3] ;
X = [2, 3] ;
...
Ich habe gesehen, einige subset
Implementierungen, aber Sie funktionieren alle, wenn Sie wollen, um zu überprüfen, ob eine Liste eine Teilmenge der anderen, nicht, wenn Sie möchten, zum erzeugen der Teilmengen. Irgendwelche Ideen?
InformationsquelleAutor der Frage arubox | 2011-02-06
Geht hier eine Implementierung:
Wird, generiert alle Teilmengen, aber nicht in der Reihenfolge, die auf Ihrem Beispiel.
Als pro-Kommentator Anfrage geht hier eine Erklärung:
Die erste Klausel ist der base case. Es besagt, dass die leere Liste ist eine Teilmenge der leeren Liste.
Die zweiten und Dritten Ziffern Regeln mit Rekursion. Die zweite Klausel besagt, dass, wenn zwei Listen haben den gleichen Kopf und der Schwanz des rechten Liste eine Teilmenge der Schwanz der linken Liste, dann in der rechten Liste eine Teilmenge der in der linken Liste.
Die Dritte Klausel besagt, dass, wenn wir überspringen den Kopf von der linken Liste, und die Liste rechts ist eine Teilmenge der Schwanz der linken Liste, dann in der rechten Liste eine Teilmenge der in der linken Liste.
Den Verfahren, die oben gezeigt erzeugt bestellten sets. Für ungeordnete Sätze, die Sie verwenden könnten
permutation/3
:InformationsquelleAutor der Antwort gusbro
Auf http://www.probp.com/publib/listut.html finden Sie eine Implementierung des Prädikats genannt
subseq0
das tut, was Sie wollen:Eine kurze Erklärung:
subseq0(X, Y)
überprüft, ob Y ist eineUntergruppeTeilfolge von X, währendsubseq1(X, Y)
überprüft, ob Y ist eine richtigeUntergruppeTeilfolge von X.Da die Standard-Darstellung einer Gruppe ist eine Liste mit eindeutigen Elementen, können Sie es verwenden, um alle Teilmengen wie in der folgenden Beispiel:
InformationsquelleAutor der Antwort Nubok
Set ist eine Sammlung von verschiedene Objekte per definition. Eine Teilmenge Verfahren sollte sich keine Gedanken über die Reihenfolge der Elemente im Satz(in der Argumentation). Eine richtige Lösung(swi-prolog) Aussehen könnte:
Für die Frage ?- Teilmenge([1,2,3], E) erzeugen:
Hoffe, es wird helfen!
InformationsquelleAutor der Antwort Volodymyr Ostruk
können wir auch testen durch löschen der Untergruppe Element aus dem super set.
Beispiel:
InformationsquelleAutor der Antwort durga
InformationsquelleAutor der Antwort