0

次のように除算演算子を実装します。Aは12div6div2結果は次のとおりです。A=4

したがって、タイプyfxに属する中置演算子を作成する必要があると思います。この演算子は、最初に6 div 2を計算し、次に12 div result(6 div 2)を計算する必要があるためです。

説明を明確にしたいと思います...概念を手続き的に説明したことは知っていますが、引数に対して実行される操作の優先順位を他にどのように表現するかがわかりませんでした...

さて、私は(私は願っていますが)yfx形式の演算子が正しいと思います...

問題は、この演算子を説明する方法がわからないことです。

前の演習では、次のように演算子を定義しました。

op(600,xfx,has).

/* perter has information */
has(peter, information).

Ivan Bratkoの本で読むことができるように:

オペレーター定義は、操作またはアクションを指定しません。原則として、操作やデータはオペレーターに関連付けられていません。

ですから、計算を行う演算子を定義することはできないと思います。

ですから、私の運動の解決策は次のようなものになると思います。

op(600,yfx,div).

div(X div Y, Division) :- Division is X/Y.

しかし、うまく機能しないでください。さらに、これは彼らが私に実装を求めているということではないと思います。

4

1 に答える 1

2

divは事前に宣言された演算子のようで、すでに整数除算を行っているので、結合法則を変更するだけで十分です。

これがデフォルトです:

?- current_op(P,A,div).
P = 400,
A = yfx.

振る舞い

?-  A is 12 div 6 div 2.
A = 1.

好きなように変更します。

?- [user].
|: :-op(400,xfy,div).
|: % user://1 compiled 0,04 sec, 1 clauses
true.

そして、あなたは得るでしょう

?- A is 12 div 6 div 2.
A = 4.

事前定義された演算子を変更することは悪い習慣であることに注意してください。しかし、is/2評価に演算子を追加する標準的な方法があるかどうかはわかりません。

SWIの編集-Prologには算術演算を追加する方法があります。

?- X is 12 mydiv 6 mydiv 2.
X = 4.

:- op(400,xfy,mydiv).
:- arithmetic_function(mydiv/2).
mydiv(A,B,C) :- C is A div B.
于 2013-03-26T19:26:49.063 に答える