質問

簡単な質問がありました。 Prolog(すなわち ^)のsetofを使用した実存的予選。

Sicstusを使用すると(多くのWebサイトが主張しているものにもかかわらず)、Sは以下のコードで実際に定量化されているように見えます(Bog Standardを使用して、私はここに含まれていない事実の母親 /子の母親 /子の母親 /子):

child(M,F,C) :- setof(X,(mother(S,X)),C).

統一を使用して確認してください。

child(M,F,C) :- setof(X-S,(mother(S,X)),C).

したがって、次のコードでは、実存的な演算子が違いはないようです。

child(M,F,C) :- setof(X,S^(mother(S,X)),C).

なぜこれがなぜですか?そのとき、あなたが統一者を必要とする状況は何でしょうか?

ありがとう!

役に立ちましたか?

解決

わかりました、私はそれを完全に説明できるかどうかわかりませんが、試してみましょう。

それは、あなたが2つの関係を照会しているという事実に関係しています、 mother/2. 。の それ 使用したケース X-S テンプレートは結果セットに同様の効果があるため C 使用として S^ ゴールの前で。の X-S テンプレート内の両方の変数を使用しているため、xとsの各バインディングがCに含まれています。 S^ 目標の前では、「結果を構築するときにSのバインディングを無視する」と言っているからです。

しかし、3つの関係を照会すると、2つの違いがより明確になります。 SWIマニュアルにはこの例があります。

foo(a, b, c).
foo(a, b, d).
foo(b, c, e).
foo(b, c, f).
foo(c, c, g).

これで、例のように同様のクエリを実行します

setof(X-Z, foo(X,Y,Z), C).

setof(Z, X^foo(X,Y,Z), C).

そして、あなたは異なる結果を得る。

統一をチェックするだけではありません。 X-Z 結果セットを効果的に変更します。

それが役立つことを願っています。

編集: :上記の2つのクエリの結果を含めると、物事を明確にするかもしれません。最初のものは次のようになります:

?- setof(X-Z, foo(X,Y,Z), C).   
Y = b
C = [a-c, a-d] ;
Y = c
C = [b-e, b-f, c-g] ;
No

2番目のものは次のようになります:

?- setof(Z, X^foo(X,Y,Z), C).
Y = b
C = [c, d] ;
Y = c
C = [e, f, g] ;
No
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top