2011-01-11 22 views
5

Wie kann ich alle möglichen Sätze der Elemente einer Liste mit der aktuellen Länge generieren?Erhalten Sie alle Sätze der Liste in Prolog

?- get_set(X, [1,2,3]). 
X = [1,1,1] ; 
X = [1,1,2] ; 
X = [1,1,3] ; 
X = [1,2,1] ; 
X = [1,2,2] ; 
X = [1,2,3] ; 
X = [1,3,1] ; 
X = [1,3,2] ; 
X = [1,3,3] ; 
..... 
X = [3,3,2] ; 
X = [3,3,3]. 

UPD: Es gibt eine gute Antwort von Sharky gegeben. Aber vielleicht ist es nicht das Beste. Hier ist eine andere:

get_set(X,L) :- get_set(X,L,L). 

get_set([],[],_). 
get_set([X|Xs],[_|T],L) :- member(X,L), get_set(Xs,T,L). 
+0

müssen Sie alle auf einmal erstellen oder nur die Beziehung definieren und einer Suche erlauben, alle Ergebnisse zu zeigen? –

Antwort

3

Bedenken Sie:

get_set(L0, L) :- 
    length(L, Len), 
    length(L0, Len), 
    apply_elem(L0, L). 

apply_elem([], _). 
apply_elem([X|Xs], L) :- 
    member(X, L), 
    apply_elem(Xs, L). 

Erläuterung:

Bestimmung der Länge der Eingabeliste L als Len uns eine Liste der eindeutigen Variablen generieren können, L0, über length/2. Dann wenden wir einfach Elemente L an alle Mitglieder von L0 über member/2 an, was Auswahlpunkte für Optionen übrig lässt, falls sie existieren (d. H. Wenn die Liste L eine Länge> 1 hat). Prolog wird zurückverfolgen, um alle möglichen Kombinationen von Elementen von L in die Liste L0, wie erforderlich, zu generieren.

2

Basierend auf Bibliothek Prädikat same_length/2, können wir es sicher in "beide" Richtungen arbeiten lassen!

einfach get_set/2 wie folgt definieren, mit maplist/2:

get_set(Xs,Ys) :- 
    same_length(Xs,Ys), 
    maplist(list_member(Ys),Xs). 

list_member(Xs,X) :- 
    member(X,Xs). 

Zuerst wird die Beispielabfrage durch die OP vorgeschlagen:

?- get_set(Xs,[1,2,3]). 
Xs = [1,1,1] ; 
Xs = [1,1,2] ; 
Xs = [1,1,3] ; 
Xs = [1,2,1] ; 
Xs = [1,2,2] ; 
Xs = [1,2,3] ; 
Xs = [1,3,1] ; 
Xs = [1,3,2] ; 
Xs = [1,3,3] ; 
Xs = [2,1,1] ; 
Xs = [2,1,2] ; 
Xs = [2,1,3] ; 
Xs = [2,2,1] ; 
Xs = [2,2,2] ; 
Xs = [2,2,3] ; 
Xs = [2,3,1] ; 
Xs = [2,3,2] ; 
Xs = [2,3,3] ; 
Xs = [3,1,1] ; 
Xs = [3,1,2] ; 
Xs = [3,1,3] ; 
Xs = [3,2,1] ; 
Xs = [3,2,2] ; 
Xs = [3,2,3] ; 
Xs = [3,3,1] ; 
Xs = [3,3,2] ; 
Xs = [3,3,3] ; 
false.      % terminates universally 

Lasst uns andersherum versuchen!

?- get_set([1,2,3],Ys). 
Ys = [1,2,3] ; 
Ys = [1,3,2] ; 
Ys = [2,1,3] ; 
Ys = [3,1,2] ; 
Ys = [2,3,1] ; 
Ys = [3,2,1] ; 
false.      % terminates universally