Ich versuche, einen Code zu erstellen, der alle Teilmengen eines Satzes in der Reihenfolge generiert. Das heißt, sollteLänge geordnete Untergruppen?
X = [];
X = [1];
X = [2];
X = [3];
X = [1,2];
X = [1,3];
X = [2,3];
X = [1,2,3].
Die innere Ordnung nicht so wichtig ist, nur erzeugen subset([1,2,3], X)
Aufruf, dass die kleinsten Untergruppen aufgeführt sind erste (dh ist mir egal, wenn [2,3] vor [1 kommt , 2], nur dass 1, [2] und [3] sind vor [2,3]).
-
Ich habe bisher zwei Ansätze ausprobiert. Zuerst habe ich versucht, das Prädikat selbst zu machen ...
subset([], []).
subset(List, []).
subset(List, [N]) :-
member(N, List).
subset(List, [N|Rest]) :-
!,
nth0(I, List, N),
findall(E, (nth0(J, List, E), J > I), NewList),
subset2(NewList, Rest).
... aber es kommt nicht einmal annähernd so wie geplant. Zweitens habe ich versucht, das powerset (mit this subset predicate) und die Bestellung mit list_to_ord_set/2, aber ich konnte es auch nicht funktionieren.
Hilfe?
Sie brauchen den Schnitt nicht, wenn Sie 'assign ([], []).' Anstelle Ihrer ersten Regel verwenden? Wenn Sie die letzte Auswertung loswerden wollen, die aus irgendeinem Grund 'false' ausgibt, können Sie einfach die Reihenfolge der zweiten und dritten' assign' Regeln ändern. Es ändert die Reihenfolge, ist aber immer noch gültig, je nachdem was OP wünscht. – Fatalize
@Fatalize: der Schnitt ist erforderlich, um doppelte Lösungen zu vermeiden, und die Anon var Unterlisten von Xs akzeptieren – CapelliC
Ich verstehe es nicht. Mit diesen Änderungen erhalte ich genau die gleichen Ergebnisse. Möchten Sie ein Beispiel angeben, das den cut und die anonyme Variable erfordert? – Fatalize