お問い合わせありがとうございます。
結論から言いますとオペレータの振舞いの取り決め(仕様)です。
解決方法としてはオペレータ登録されているアトムは()で囲うこ とで そのアトムそのものとして扱われます。
| ?-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
ご確認ください。