2009-09-23 127 views
13

我斷言P1返回值一個接一個像這樣經過:如何在Prolog中找到所有解決方案?

-? P1(ARGUMENTS, RETURN). 
-? RETURN = 1; 
-? RETURN = 2; 
-? RETURN = 3; 
-? fail. 

我也有另外一個謂語P2:

P2(ARGUMENTS, LIST) :- P1(ARGUMENTS, RETURN),... % SOMEHOW HERE I NEED TO INSERT ALL VALUES OF RETURN TO LIST. 

如何找到所有的RETURN的值,並將其分配到LIST

+0

這是有關嗎?:http://stackoverflow.com/questions/1445490/expand-a-query-into-a-list-in-prolog – 2009-09-23 19:52:56

+0

謝謝,這有助於! – Asterisk 2009-09-23 20:00:50

回答

16

使用findall來實現:

P2(ARGUMENTS, LIST) :- findall(X, P1(ARGUMENTS, X), LIST). 

這與由安德斯·林達爾掛bagof function mentioned in the question。上有兩個功能(和第三功能setof)之間的關係很好的解釋here

爲了說明差異考慮 一個小例子:

listing(p). 

p(1,3,5). 
p(2,4,1). 
p(3,5,2). 
p(4,3,1). 
p(5,2,4). 

請嘗試以下的目標。 (答案 顯示已被修改,以節省 空間。)

?- 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 

謂詞bagofsetof產量 集合了 在球門自由變量的個人綁定。 setof 產生 集合的分類版本,沒有重複。若要避免綁定變量,請使用 存在量詞表達式。對於 例如目標 bagof(Z,X^Y^p(X,Y,Z),Bag)詢問 「的Z的,使得存在一個 的X袋及存在Y使得 p(X,Y,Z)」。 findall行爲像bagof 與所有自由變量自動 存在量化。此外 findall返回空列表[]那裏 是沒有目標滿意,而bagof 失敗。

相關問題