Пролог - приоритетные задачи оператора - PullRequest
1 голос
/ 23 сентября 2019

В чем здесь ошибка, есть проблемы, когда первый параметр заключен в скобки, есть конфликт приоритетов с оператором запятой.

Я не могу понять это, у вас есть какие-либоидеи?

:-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]

1 Ответ

1 голос
/ 23 сентября 2019

Вам нужен пробел между :- и открывающей скобкой:

:- (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
...