web-dev-qa-db-ja.com

プロローグ演算子=:=

Prologにはいくつかの特別な演算子があり、そのうちの1つは「is」ですが、最近=:=演算子に出くわし、それがどのように機能するのかわかりません。

誰かがオペレーターが何をするのか、またそのような特別なオペレーターの事前定義されたリストとそれらが何をするのかをどこで見つけることができますか?

ありがとう。

25
nubela
?- 2+3 =:= 6-1.
true.

?- 2+3 is 6-1.
false.

また、ドキュメントもご覧ください http://www.swi-prolog.org/pldoc/man?predicate=is/2

25

それでも、上記の答えはここで少し説明するに値すると思います。

事前の注意事項:Prologの算術式は単なる用語であり(「すべてがPrologの用語です」)、評価されません自動的に。 (LISPのバックグラウンドがある場合は、引用リストを考えてください)。したがって、_3 + 4_は+(3,4)と同じで、それ自体では何もしません。 evaluateそれらの用語は個々の述語の責任です。

いくつかの組み込み述語は暗黙的な評価を行います。その中には、_=:=_やisなどの算術比較演算子があります。 _=:=_は両方の引数を評価して結果を比較しますが、isright引数のみを算術式として受け入れて評価します。

引数は、アトム、数値定数(右のオペランドの評価結果と比較される)、または変数のいずれかでなければなりません。 bound変数の場合、その値は数値である必要があり、前の場合と同様に右側のオペランドと比較されます。 nbound変数の場合、右側のオペランドの評価結果はその変数にバインドされます。後者の場合、変数をバインドするためにisがよく使用されます。

上記のリンクされたProlog辞書から例をピックアップするには:数値Nが偶数かどうかをテストするには、両方の演算子を使用できます。

_0 is N mod 2  % true if N is even
0 =:= N mod 2 % dito
_

ただし、操作の結果をキャプチャする場合は、最初のバリアントしか使用できません。 Xがバインドされていない場合:

_X is N mod 2   % X will be 0 if N is even
X =:= N mod 2  % !will bomb with argument/instantiation error!
_

経験則:算術比較だけが必要な場合は、_=:=_を使用します。評価の結果をキャプチャする場合は、isを使用します。

86
ThomasH

私は自分の答えを見つけました http://www.cse.unsw.edu.au/~billw/prologdict.html

5
nubela

そのISOコア標準の述語演算子は、統一(=)/ 2または構文の等価性(==)/ 2からブートストラップすることはできません。セクション8.7算術比較で定義されています。そしてそれは基本的に次のように動作します:

E =:= F :- 
    X is E, 
    Y is F, 
    arithmetic_compare(=, X, Y).

したがって、左側(LHS)と右側(RHS)の両方が、比較される前に評価される算術式でなければなりません。算術比較では、数値型全体を比較できます。だから私たちは:

   GNU Prolog 1.4.5 (64 bits)

   ?- 0 = 0.0.
   no

   ?- 0 == 0.0
   no

   ?- 0 =:= 0.0.
   yes
2

=:=は比較演算子です。A1=:= A2は、式A1とA2の値が等しい場合に成功します。 A1 == A2は、用語A1とA2が同一の場合に成功します。

0