2

これは、Prolog での統合に関する過去の試験の問題です。それらが統合されたかどうか、そしてインスタンス化されたかどうかを言うことになっていました。

f(a,g(b,a)) and f(X,g(Y,X))

これはかなり a = X, g(b,a) = g(Y,X) を統一し、非常に簡単です

f(g(Y),h(c,d)) and f(X,h(W,d)) 

h(c,d) は h(W,d) と統合しますが、g(Y) =/ X のためにこれが統合するとは思いません。大文字の X は解決策が見つかるまで検索するため、X = g(Y) である可能性はありますか?

4

1 に答える 1

4

はい、それは統合します。それは、評価される用語であるためです。また、あなたが指摘した最初の例でg(Y)も同様です。a

プロローグ インタープリターで評価を確認できます。

?- f(g(Y),h(c,d)) = f(X,h(W,d)).
X = g(Y),
W = c.

統合プロセスは、深さ優先の方法で機能し、メンバーを統合し、それ以上の組み合わせが不可能になるまで、利用可能な回答をそれぞれ返します。

これは、統合メソッドが に対して呼び出されf(g(Y),h(c,d)) = f(X,h(W,d))、利用可能なマッチングを見つけることを意味します: g(Y) = X, h(c, d) = h(W, d)

次に、 に対して統合が実行されます。g(Y) = Xそれ以上の可能な削減がないため、 が返されますX = g(Y)

次に、同じメソッドが matching に対して呼び出され、h(c, d) = h(W, d)が得られます。c = W他の一致は得られないため、結果は になりW = cます。

統合後の回答が返され、通常、false一致がない場合、またはそれ以上の一致が不可能な場合にポイントに戻されます。

CapelliC が指摘したように、変数Yは、統合プロセスの後もバインドされていません。統合は、バインドされていない変数に対して実行されます。つまり、次のことを意味します。

  • return の統一。 は項であり、バインドされていない var ではないため、統一を継続できh(c, d) = h(W, d)ます。h(_) = h(_)h

  • の統一はd = d用語の一致であり、帰属や拘束を形成するものではありません。

  • フォームの統一はc = W属性を形成し、変数Wは以前にバインドされていなかったため、用語cにバインドされます-そうでない場合は比較が実行されます。

  • の統一は、X = g(Y)単に非束縛変数Xを項g(Y)g(Y)束縛し、 への利用可能な統一がないため、束縛されていない変数を持つ項g(Y)です。

よろしく!

于 2012-12-13T22:29:33.617 に答える