findall
これを達成するために使用します。
P2(ARGUMENTS, LIST) :- findall(X, P1(ARGUMENTS, X), LIST).
これは、Anders Lindahl がリンクしbagof
た質問で言及されている機能に関連しています。setof
2 つの関数 (および 3 番目の関数)の関係については、次の説明を参照してください。
違いを説明するために、ちょっとした例を考えてみましょう:
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