Sie müssen existentiell die Argumente qualifizieren, die Sie in anstelle von anonymen Variablen nicht interessiert sind:
?- bagof(R,A^A1^A2^A3^A4^member(r(A,R),[r(A1,a), r(A2,b), r(A3,c), r(A4,d)]),Rs).
Rs = [a, b, c, d].
Dies ist notwendig, da bagof/3
(und setof/3
) für einen Beutel (Set) von Lösungen zurück jede Instantiierung der freien Variablen (dh der Variablen im Ziel, die nicht in der Vorlage enthalten sind). In Alternative können Sie das findall/3
Prädikat verwenden (die freie Variablen ignoriert):
?- findall(R,member(r(A,R),[r(A1,a), r(A2,b), r(A3,c), r(A4,d)]),Rs).
Rs = [a, b, c, d].
Aber beachten Sie, dass findall/3
gibt eine leere Liste, wenn es keine Lösungen gibt, während bagof/3
(und setof/3
) fehlschlagen, wenn es keine Lösungen gibt.
Eine weitere Alternative eine lange Liste von existentiell qualifizierten Variablen in Anrufen bagof/3
und setof/3
zu vermeiden, ist ein Hilfs Prädikat mit einem einzigen Satz, dessen Kopf nur listet die Argumente, die Sie interessiert sind, einzuführen. Zum Beispiel:
r(R) :-
member(r(_,R),[r(_,a), r(_,b), r(_,c), r(_,d)]).
?- bagof(R, r(R), Rs).
Rs = [a, b, c, d].
Wirklich nett 'Trick' zähmen bagof/3 beteiligt Syntax! – CapelliC
Ich denke auch so! Mehr über findall/3 v. Bagof/3 hier: http://www.swi-prolog.org/pldoc/man?predicate=findall/3. Vielen Dank! –