Определение инфиксного оператора Prolog - PullRequest
3 голосов
/ 18 февраля 2012

Я недавно узнал о Прологе и обнаружил, что три типа, используемые для определения инфиксных операторов, сбивают с толку.

В чем различия между xfx, xfy и yfx при указании типа оператора? Я погуглил о проблеме и не нашел ничего полезного.

Я попытался набрать следующие коды в Прологе:

:- op(500,yfx,is_alive).
is_alive(A,B) :- display([A,B]).
:- op(500,xfy,is_alive2).
is_alive2(A,B) :- display([A,B]).
:- op(500,xfx,is_alive3).
is_alive3(A,B) :- display([A,B]).

и вывод:

| ?- 1 is_alive 2.
'.'(1,'.'(2,[]))

yes
| ?- 1 is_alive2 2.
'.'(1,'.'(2,[]))

yes
| ?- 1 is_alive3 2.
'.'(1,'.'(2,[]))

yes

Результаты не показали мне никакой разницы.

Ответы [ 2 ]

5 голосов
/ 18 февраля 2012

Тип оператора управляет ассоциативностью, например, следует ли интерпретировать выражение «5 - 4 - 3» как «(5 - 4) - 3», что известно как левая ассоциативность или как «5 - (4»).- 3) ", что является правой ассоциативностью.

Если оператор минус должен работать, как обычно, ожидаемо, его необходимо определить как 'yfx', что делает его левоассоциативным.Другие типы, такие как 'xfx и' xfy ', являются вариациями этого.Подробнее на http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html.

3 голосов
/ 18 февраля 2012

Если ваш Prolog соответствует ISO, вы можете использовать write_canonical для анализа влияния приоритета операторов и ассоциативности. Например

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
...