Помещение всех результатов запроса в список в Прологе - PullRequest
13 голосов
/ 03 декабря 2010

Я хотел бы знать, как создать предикат, который помещает все результаты, полученные по какому-либо запросу (поэтому я получаю результат и нажимаю точку с запятой до тех пор, пока я не получу False) в списке.

Например, если янапишите foo(X,[1,2,3]). в каком-нибудь слушателе Пролога, скажем, результат будет

X=[11];
X=[22];
False.

Я хотел бы получить все эти результаты в списке, чтобы произошло что-то вроде следующего.

?-another_foo(X,[1,2,3]).
X=[[11],[22]].

another_foo каким-то образом использует foo для создания списка со всеми результатами из foo.Я просто не знаю как.

1 Ответ

16 голосов
/ 03 декабря 2010

Используйте встроенный предикат findall/3:

?-findall(X0, foo(X0, [1,2,3]), X).
X = [[11], [22]].

Вы можете определить свой another_foo/2:

another_foo(X, Input) :-
  findall(X0, foo(X0, Input), X).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...