35

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

誰かがこの演算子が何をするのかを説明できますか?また、そのような特別な演算子の事前定義されたリストとそれらが何をするのかをどこで見つけることができますか?

4

8 に答える 8

100

それにもかかわらず、上記の答えはここでいくつかの説明に値すると思います。

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

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

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

上記のリンクされたプロローグ辞書から例を取り上げるには:数値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

于 2009-12-23T17:18:21.730 に答える
27
?- 2+3 =:= 6-1.
true.

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

また、ドキュメントhttp://www.swi-prolog.org/pldoc/man?predicate=is/2を参照してください。

于 2009-09-13T11:09:14.797 に答える
20

既存の回答を補足するために、いくつかの追加のポイントを述べたいと思います。

演算子は演算子です

まず、演算子 =:=は、その名前が示すように、演算子です。Prologでは、述語を使用しcurrent_op/3て演算子について詳しく知ることができます。例えば:

?-current_op(Prec、Type、=:=)。
Prec = 700、
タイプ=xfx。

これは、演算子の=:=優先順位が700で、タイプ xfxがであることを意味します。これは、それがバイナリ中置演算子であることを意味します。

これは、必要に応じて、と同等の用語を記述 できることを意味しますどちらの場合も、用語の関手はであり、用語アリティは2です。これを確認するために使用できます。=:=(X, Y) X =:= Y=:=write_canonical/1

?-write_canonical(a =:= b)。
=:=(a、b)

述語は演算子ではありません

ここまでは順調ですね!これはすべて、純粋に構文上の機能です。ただし、実際に質問しているのは述語 (=:=)/2であり、その名前は=:=であり、2つ の引数を取ります。

他の人がすでに説明したように、述語 (=:=)/2は2つの算術式の算術的等式を示します。その引数が同じ数に評価される場合、それは真実です。

たとえば、変数を引数として使用して、解決策を求める最も一般的なクエリを試してみましょう。

?-X =:= Y.
エラー:引数が十分にインスタンス化されていません

したがって、この述語は結果の生成に使用できないため、真の関係ではありません。これは、この述語の非常に深刻な欠点であり、一般に「宣言型プログラミング」と呼ばれるものと衝突します。

述語は、両方の引数が完全にインスタンス化される非常に特殊な状況でのみ機能します。例えば:

?-1 + 2 =:= 3.
真。

このような述語は、特定の使用モードでのみ使用できるため、モードと呼びます。初心者の大多数にとって、モード化された述語は、プログラムを手続き的に考える必要があるため、使用するのは悪夢です。これは、最初は非常に難しく、後でも難しいままです。また、モデレートされた述語は、純粋な述語を使用できるすべての方向で使用できるわけではないため、プログラムの一般性を大幅に制限します。

制約はより一般的な代替手段です

Prologはまた、算術制約の形ではるかに一般的な算術述語を提供します。

たとえば、整数の場合は、PrologシステムのCLP(FD)制約を試してください。最も重要なCLP(FD)制約の1つは、算術等式を示し、と呼ばれ (#=)/2ます。と完全に類似して(=:=)/2演算子は 中置(#=)/2演算子としても定義されているため、次のように記述できます。

| ?-1 + 2#=3。

はい

私は1つの特定の例としてGNUPrologを使用しており、他の多くのPrologシステムもCLP(FD)実装を提供しています。

制約の主な魅力は、その一般性にあります。たとえば、とは対照的に(=:=)/2述語 (#=)/2は次のようになります。

| ?-X + 2#=3。

X = 1

| ?-1 + Y#=3。

Y = 2

そして、最も一般的な質問をすることもできます。

| ?-X#=Y。

X = _#0(0..268435455)
Y = _#0(0..268435455)

これらの述語がPrologに自然に溶け込み、すべての方向で照会できる整数式間の関係として機能することに注意してください。

関心のあるドメインに応じて、より低レベルの算術述語を使用する代わりに、CLP(FD)、CLP(Q)、CLP(B)などを使用することをお勧めします。

、およびも参照してください。

偶然にも、演算子 =:=はCLP(B)によってまったく異なる意味で使用されています。

?-sat(A =:= B + 1)。
A = 1、
sat(B =:= B)。

これは、演算子述語を区別する必要があることを示しています。上記の場合、述語 sat/1は与えられた式を命題式として解釈し、この文脈で=:=は、ブール式の同等性を示します。

于 2017-04-21T13:15:06.937 に答える
5

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

于 2009-09-13T09:02:11.573 に答える
4

その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
于 2019-01-30T20:35:31.710 に答える
1

Erlangから、構文はほとんどPrologに似ているので、注釈を付けるのは良いことだと思います。

=:=式は完全に等しいという意味です。

JavaScriptのよう===に、変数のタイプが同じであるかどうかを確認するためにも使用できます。基本的に=:=は同じロジックですが、Prolog、Erlangなどの関数型言語で使用されます。

多くの情報はありませんが、何らかの形で役立つことを願っています。

于 2020-11-06T22:49:54.460 に答える
0

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

于 2014-03-14T10:21:01.373 に答える
-2

最初の演算子=:=チェックは等しいですか?たとえば、 ここに画像の説明を入力します

trueを返しますが、falseを返します ここに画像の説明を入力してください

于 2017-04-21T12:36:59.643 に答える