Определение инфиксного оператора пролога

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

В чем разница между 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

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


person JasonLi    schedule 18.02.2012    source источник


Ответы (2)


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

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

person Mr. X    schedule 18.02.2012
comment
попробуйте выполнить (1 is_alive 2 is_alive 3) для каждого из ваших операторов, и вы увидите разницу - person DaveEdelstein; 18.02.2012

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

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
person CapelliC    schedule 18.02.2012