Ast*_*isk 14 prolog prolog-setof
我有谓词P1,一个接一个地返回值,如下所示:
-? P1(ARGUMENTS, RETURN).
-? RETURN = 1;
-? RETURN = 2;
-? RETURN = 3;
-? fail.
Run Code Online (Sandbox Code Playgroud)
我还有一个名为P2的谓词:
P2(ARGUMENTS, LIST) :- P1(ARGUMENTS, RETURN),... % SOMEHOW HERE I NEED TO INSERT ALL VALUES OF RETURN TO LIST.
Run Code Online (Sandbox Code Playgroud)
如何查找所有值RETURN并将其分配给LIST?
Pes*_*sto 17
使用findall来实现:
P2(ARGUMENTS, LIST) :- findall(X, P1(ARGUMENTS, X), LIST).
Run Code Online (Sandbox Code Playgroud)
这与Anders Lindahl关联bagof的问题中提到的功能有关.上有两个功能(和第三功能之间的关系一个很好的解释setof)在这里:
为了说明差异,请考虑一个小例子:
Run Code Online (Sandbox Code Playgroud)listing(p). p(1,3,5). p(2,4,1). p(3,5,2). p(4,3,1). p(5,2,4).尝试以下目标.(答案显示已被修改以节省空间.)
Run Code Online (Sandbox Code Playgroud)?- bagof(Z,p(X,Y,Z),Bag). Z = _G182 X = 1 Y = 3 Bag = [5] ; Z = _G182 X = 2 Y = 4 Bag = [1] ; Z = _G182 X = 3 Y = 5 Bag = [2] ; Z = _G182 X = 4 Y = 3 Bag = [1] ; Z = _G182 X = 5 Y = 2 Bag = [4] ; No ?- findall(Z,p(X,Y,Z),Bag). Z = _G182 X = _G180 Y = _G181 Bag = [5, 1, 2, 1, 4] ; No ?- bagof(Z,X^Y^p(X,Y,Z),Bag). Z = _G182 X = _G180 Y = _G181 Bag = [5, 1, 2, 1, 4] ; No ?- setof(Z,X^Y^p(X,Y,Z),Bag). Z = _G182 X = _G180 Y = _G181 Bag = [1, 2, 4, 5] ; No目标中自由变量的单个绑定的谓词
bagof和setofyield集合.setof产生一个没有重复的集合的排序版本.要避免绑定变量,请使用存在量词表达式.例如,目标bagof(Z,X^Y^p(X,Y,Z),Bag)要求"袋子Z存在,X并且存在Y这样的p(X,Y,Z)". 与所有自由变量findall一样bagof,自动存在量化.另外findall返回一个空列表[],没有目标满意度,而bagof失败.