Ввод всех результатов запроса в список в Prolog

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

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

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

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

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

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

Ответ 1

Используйте встроенный предикат 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).