Home フォーラム AZ-Prologサポート掲示板 AZ-Prologのシンタックスについて 返信先: AZ-Prologのシンタックスについて

#58842
WEBサイト管理者
キーマスター

お問い合わせありがとうございます。

結論から言いますとオペレータの振舞いの取り決め(仕様)です。
解決方法としてはオペレータ登録されているアトムは()で囲うこ とで そのアトムそのものとして扱われます。
 
 | ?-A = '=',(A== '=' -> true).
 Syntax error
 | ?-A = (=),(A==(=) -> true).
 A = =
 yes

====以下説明====
1. A = B -> true.
B がオペレータではないため OK

 

2. A = == .
= は infix として読み、== はオペレータであり、同様の強度(xfx,700)であるため、
本来エラーになる筈だが、次 Token が終端があるため、オペレータ扱いにせず( POSTFIXでもない)、
= (A,==) と理解するため OK

 

3. A = == -> true.
= infix として読み、== はオペレータであり、同様の強度(xfx,700)であり、
次 Token(->)が終端 or 区切り文字ではないため NG

つまり、= や == , > , < 等は xfx 700 で定義されているので入れ子にはならない。

 
| ?-read(X),display(X).<br />
|: A = B == C.<br />
Syntax error ---- Backtrace<br />
(read(X_9),display(X_9)) ?-
and や or は yfx 500 で定義されているため入れ子になる。
 
| ?-read(X),display(X).
|: X is A and B or C.
is(X_87,or(and(A_89,B_91),C_ 93))
X = X_87 is A_89 and B_91 or C_93
以下のようにすると、期待する動作となりますが、 オペレータの定義を
変更することになるので先に記述した解決策が望ましいでしょう。
 
| ?-op(700,xfy,=).
yes
| ?-op(700,xfy,==).
yes

| ?-read(X),display(X).
|: A = == -> true.
->(=(A_84,==),true)
X = A_84= == ->true
 

ご確認ください。

上部へスクロール