質問

Prologには特別な演算子がいくつかありますが、そのうちの1つは「is」ですが、最近===演算子に遭遇しましたが、どのように動作するのかわかりません。

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

ありがとう。

役に立ちましたか?

他のヒント

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

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

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

left 引数は、アトム、数値定数(右オペランドの評価結果と比較される)、または変数でなければなりません。 bound 変数の場合、その値は数値である必要があり、前の場合と同様に右側のオペランドと比較されます。 非バインド変数の場合、右側のオペランドの評価結果はその変数にバインドされます。後者の場合、変数をバインドするために 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 を使用します。

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

演算子は演算子です

まず、演算子 =:= は、名前が示すとおり、演算子です。 Prologでは、演算子 current_op / 3 を使用して、演算子の詳細を学ぶことができます。例:

?- current_op(Prec, Type, =:=).
Prec = 700,
Type = xfx.

これは、演算子 =:= precedence 700を持ち、タイプ  xfx であることを意味します。これは、バイナリ infix 演算子であることを意味します。

これは、できますしたい場合、  =:=(X、Y) のような用語を書くことを意味します X =:= Y と同様に両方のケースでは、用語の functor =:= であり、用語の arity は2です。これを確認するには、 write_canonical / 1 を使用できます。

?- write_canonical(a =:= b).
=:=(a,b)

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

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

他の人がすでに説明したように、述語  (=:=)/ 2 は、2つの算術式の算術的等価性を示します。引数は true iff であり、同じ引数に評価します。

たとえば、最も一般的な クエリを試してみましょう。これにより、変数を引数として使用して、あらゆる解決策を求めます:

?- X =:= Y.
ERROR: Arguments are not sufficiently instantiated

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

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

?- 1 + 2 =:= 3.
true.

これらの述語は moded と呼ばれます。これらの述語は、特定のモードでのみ使用できるためです。大半の初心者にとって、モード付き述語は、プログラムを手続き的に考えることを必要とするため、悪夢の使用になります。後でまた難しい。また、モード付き述語は、プログラムの汎用性を厳しく制限します。純粋な述語を使用できるすべての方向でそれらを使用することはできないためです。

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

プロローグは、算術制約の形で、より多くのより一般的な算術述語も提供します。

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

| ?- 1 + 2 #= 3.

yes

1つの特定の例としてGNU Prologを使用していますが、他の多くの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)などを使用することをお勧めします。代わりに

これは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

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

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

それはtrueを返します。 しかし、これはfalseを返します ここに画像の説明を入力

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top