findall/3
ist wie:
findall(+Template, :Goal, -Bag)
wo:
Bag
die Liste der Ergebnisse ist, dass Sie möchte erhalten;
Goal
ist das Prädikat (oder die Kombination von Prädikaten), das erfolgreich sein sollte; und
Template
ist ein Ausdruck, der das Format der Ergebnisse beschreibt.
Nun wollen wir dieses Prädikat verwenden, um etwas Konstruieren zu tun:
- , die eine Unterliste von
L1
Sie suchen alle Elemente Y
in L1
ist, so ist die Vorlage eindeutig X1
und das Ziel wird bei l Osten enthält member(X,L1)
.So, jetzt oder findall/3
ist so geformt, wie:
findall(Y,(member(Y,L1),...),L3)
- , bei dem alle Elemente von
L3
sind Lösungen für Y
, wo alle Werte von L2
sind Lösungen für X
Da es mindestens eine X
in L2
sein sollte, so dass related(X,Y)
hält. Es bedeutet, dass wir ein once/1
erzwingen verwenden, der von dem Augenblick, wo man X
gefunden wird, unser Anruf beendet (und keine Wiederholungen von Y
auftreten), so daß X
ein Elemente (member/2
) von L2
und related/2
halten. ...
ist also gleich:
once((member(X,L2),rel(X,Y)))
Oder jetzt die Vollversion:
findall(Y,(member(Y,L1),once((member(X,L2),rel(X,Y)))),L3)
Beispiel:
zum Beispiel Gegeben:
rel(2,1).
rel(3,1).
rel(2,4).
rel(3,7).
Das Ergebnis ist:
?- L1=[1,4,5,6,7,8],L2=[2,3],findall(Y,(member(Y,L1),once((member(X,L2),rel(X,Y)))),L3).
L1 = [1, 4, 5, 6, 7, 8],
L2 = [2, 3],
L3 = [1, 4, 7].
So wird 1
nur einmal vorkommen, während es zwei X
s für Y=1
gibt, für die die Bedingung gilt.
Ihr Titel sagt, was zu verwenden ist ('findall/3') beschreiben Sie einfach Ihre Bedingung im zweiten Argument. Sie möchten alle 'X' finden, zum Beispiel,' member (X, L1) '(Ihre erste Bedingung), dann haben Sie eine konjunktive Bedingung, (b), einzuschließen. Sie können einen zusammengesetzten Ausdruck in 'findall/3' haben:' findall (X, (member (X, L1), ..., ...), L3) .' – lurker