web-dev-qa-db-ja.com

Prologの==と=の違いは何ですか?

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

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

28
JohnS

Prologの= "演算子"は、実際には、2つの用語が統合されたときに成功する述語(中置表記)=/2です。したがって、_X = 2_または_2 = X_は同じものになり、Xを2に統合することを目標としています。

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

追加:以下のJohnSのコメントによると、これらの目標に「not」が入り込んだときに何が起こるかを調べるのは興味深い。 AmziのNice set of examples をご覧ください!プロローグのドキュメント。

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

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

最後に、not(not(X = Y))が何をするかを考えてください。 XとY(任意の用語)を統合できれば、内部目標は成功し、二重否定も成功します。ただし、二重否定内の内側の目標をラップすると、成功する目標が生成されますif2つの用語を統一できます、ただしそれらの用語を統一せずに

not(not(X == Y))に同様のユーティリティがあるかどうかを検討するのは、読者の課題です。

33
hardmath

=統一の略で、他のメンバーと一致させるために自由変数をバインドしようとすることを意味します。例: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

prologはX-Y:Zを式5- [a、b、c]:yに適合させようとするためです。とても便利です。

述語を呼び出すときにユニフィケーションが使用され、いくつかのテクニックが続くことに注意してください:再帰的述語でアキュムレータの値を返したい場合、それを行うことができます:

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

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

==変数をバインドしようとせずに平等です。

5
m09