Запрос фактов из списка - PullRequest
       17

Запрос фактов из списка

2 голосов
/ 22 февраля 2011

Я новичок в прологе и хочу решить эту проблему.Предположим, у меня есть список, скажем
List т.е. [a,b,c]
, теперь у меня есть некоторые факты:
likes(a,banana).<br> likes(b,orange).<br> likes(c,apple).<br> likes(d,grapes).


Так что, если я сделаю запрос

?- my_functor(List,X).<br> X=[banana,orange,apple].


Спасибо.

1 Ответ

3 голосов
/ 22 февраля 2011

Рассмотрим:

?- 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 среди большинства других реализаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...