Рассмотрим:
?- List=[a,b,c], findall(X, (member(Y, List), likes(Y, X)), Xs).
List = [a, b, c],
Xs = [banana, orange, apple].
Пояснение:
findall/3
называется предикатом «все решения», который стремится найти все возможные значения, которые нельзя отнести к первому аргументу (здесь это переменная X
) для решений для аргумента секунд ( здесь это соединение (member(Y, List), likes(Y, X))
), и все значения для X
помещаются в список, связанный с третьим аргументом (здесь это Xs
).
Обратите внимание, что внутреннее выражение, генерирующее значения для X
, является оператором, который возвращает для предоставления различных назначений для X
:
?- member(Y, [a,b,c]), likes(Y, X).
Y = a,
X = banana ;
Y = b,
X = orange ;
Y = c,
X = apple ;
false.
Протестировано с SWI-Prolog.
Обратите внимание, что findall/3
также появляется в GNU Prolog среди большинства других реализаций.