将查询的所有结果放在Prolog的列表中

vuz*_*zun 14 prolog

我想知道如何创建一个谓词,将所有结果从一些查询中获取(所以我得到一个结果并按分号直到我得到False)在列表中.

例如,如果我foo(X,[1,2,3]).在一些Prolog听众中写,假设结果是

X=[11];
X=[22];
False.
Run Code Online (Sandbox Code Playgroud)

我想把所有这些结果都列在一个列表中,所以会发生类似下面的事情.

?-another_foo(X,[1,2,3]).
X=[[11],[22]].
Run Code Online (Sandbox Code Playgroud)

another_foo会以某种方式使用foo创建一个包含foo所有结果的列表.我只是不知道如何.

pts*_*pts 17

使用内置谓词 findall/3:

?-findall(X0, foo(X0, [1,2,3]), X).
X = [[11], [22]].
Run Code Online (Sandbox Code Playgroud)

你可以定义你的 another_foo/2:

another_foo(X, Input) :-
  findall(X0, foo(X0, Input), X).
Run Code Online (Sandbox Code Playgroud)