爲了說明差異考慮 一個小例子:
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
謂詞bagof
和setof
產量 集合了 在球門自由變量的個人綁定。 setof
產生 集合的分類版本,沒有重複。若要避免綁定變量,請使用 存在量詞表達式。對於 例如目標 bagof(Z,X^Y^p(X,Y,Z),Bag)
詢問 「的Z
的,使得存在一個 的X
袋及存在Y
使得 p(X,Y,Z)
」。 findall
行爲像bagof
與所有自由變量自動 存在量化。此外 findall
返回空列表[]
那裏 是沒有目標滿意,而bagof
失敗。
這是有關嗎?:http://stackoverflow.com/questions/1445490/expand-a-query-into-a-list-in-prolog – 2009-09-23 19:52:56
謝謝,這有助於! – Asterisk 2009-09-23 20:00:50