36

誰かが Prolog==の と演算子の違いを説明できますか? =X が Y と統合することをX = Y意味し、X が既に Y と統合されているか、統合できる場合は true であることは知っていますが、これが とどのように異なるのかわかりません==

フォローアップ:それ(受け入れられた回答を参照)は理にかなっています。X \= Yもう 1 つ質問ですが、が true でX \== Yfalse である (またはその逆)という状況はありますか? つまり、X \= Y統合できないかどうか、または現在統合されていないかどうかをテストしますか?

4

2 に答える 2

42

Prologの=「演算子」は、実際には=/2、2 つの用語が統合されたときに成功する述語 (中置表記を使用) です。したがって、同じことになるX = 2か、2と統合することが目標です。2 = XX

==演算子」は、2 つの項がそれ以上の統一なしで既に同一である場合にのみ成功するという点で異なります。したがって、変数に以前に値 2 が割り当てられているX == 2場合にのみ真になります。X

追加: 以下の JohnS のコメントによると、これらの目標に「ない」が混ざるとどうなるかを調べるのは興味深いことです。Amzi! にある素晴らしい例のセットを参照してください。プロローグのドキュメント。

\=は、2 つの項が統合できないこと、つまり統合が失敗することを意味します。失敗としての否定のすべてのアプリケーションと同様に、「統一されていない」ことは、用語間の統一をもたらしません(そしてできません)。

\==は、2 つの用語が同一ではないことを意味します。ここでも、これが成功しても統合は行われません。

最後にどうするかを考えnot(not(X = Y))ます。X と Y (これは任意の項である可能性があります) を統合できれば、内部の目標は成功し、その二重否定も成功します。ただし、内側のゴールを二重否定の内側にラップすると、2 つの項を統一できてもそれらの項を統一しない場合に成功するゴールが生成されます。

not(not(X == Y))同様の有用性があるかどうかを考えるのは、読者の課題として残されています。

于 2011-11-22T00:08:54.180 に答える
7

= は統一を表し、自由変数をバインドして他のメンバーと一致させようとすることを意味します。例: A = h(X) は、A が自由であれば A を項 h(X) に変換し、A が 5 にバインドされている場合は失敗します。例:

X-Y:Z = 5-[a, b, c]:y

あなたにあげます

X = 5, Y = [a, b, c] and Z = y

プロローグは XY:Z を式 5-[a, b, c]:y に適合させようとするためです。とても便利です。

述語を呼び出すときに単一化が使用され、いくつかの手法が続くことに注意してください。たとえば、再帰述語でアキュムレータの値を返したい場合は、それを実行できます。

recursive_predicate([], Accumulator, Accumulator).
recursive_predicate(Input, Accumulator, Output) :- %recursive stuff.

最初の句は 3 番目と 2 番目の引数を統合しようとするため、3 番目が空いている場合、2 番目と同じ値になります。

== は、変数をバインドしようとしない等価です。

于 2011-11-22T00:05:37.223 に答える