15

次のように値を次々に返す述語 P1 があります。

-? 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ですか?

4

1 に答える 1

17

findallこれを達成するために使用します。

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

これは、Anders Lindahl がリンクしbagofた質問で言及されている機能に関連しています。setof2 つの関数 (および 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と収量のコレクション。 重複のないコレクションのソートされたバージョンを生成します。変数のバインドを回避するには、存在量指定子式を使用します。たとえば、ゴール は「 が存在するよう な のバッグと、そのようなものが存在する」を求めます。 は、自動的に存在量化されたすべての自由変数と同じように機能します。さらに 、空のリストを返しますが、目標の満足度はありませんが、 失敗します。setofsetofbagof(Z,X^Y^p(X,Y,Z),Bag)ZXYp(X,Y,Z)findallbagoffindall[]bagof

于 2009-09-24T19:30:03.213 に答える