Prolog - 运算符优先级问题

Prolog - Operator priority problems

这里有什么错误,当第一个参数用括号括起来时,与逗号运算符有优先级冲突。

我不知道如何让它工作,你有什么想法吗?

:-op(400, yfx, [eq]).
X*Y eq R:- number(X),number(Y),R is X*Y. % eq definition

:-2*3 eq R, writeln([2*3 eq R]).
:-(2*4) eq R, writeln([2*4 eq R]). %problems when the parameters are wrapped
:-eq(2*5,R), writeln([2*5 eq R]).
:-eq((2*6),R), writeln([2*6 eq R]). %fine here

输出:

[2*3 eq 6]
ERROR: c:/users/cravs/dropbox/programming/notes prolog/prolog scripts/identities2.pl:39:
    Full stop in clause-body?  Cannot redefine ,/2
[2*5 eq 10]
[2*6 eq 12]

您需要在 :- 和左括号之间添加一个 space:

:- (2*4) eq R, writeln([2*4 eq R]).
  ^

没有它,:-(2*4) 在规范语法中被解析为带有函子 ':-'/1 和参数 2*4 的术语。

要查看术语的解析方式,请尝试 read/1write_canonical/1

?- read(X), write_canonical(X).
:-(2*4) eq R, writeln([2*4 eq R]).                           % input
','(eq(:-(*(2,4)),_262),writeln('.'(eq(*(2,4),_262),[])))    % output