Setof / Bagofを使用して、Prologの実存的予選
-
22-09-2019 - |
質問
簡単な質問がありました。 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
所属していません StackOverflow