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/1
和 write_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
这里有什么错误,当第一个参数用括号括起来时,与逗号运算符有优先级冲突。
我不知道如何让它工作,你有什么想法吗?
:-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/1
和 write_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