Вопрос

Недавно я узнаю о Prolog, и я нахожу три типа, используемые для определения операторов Infix.

Каковы различия между XFX, XFY и YFX при указании типа оператора? Я погуглил проблему и не нашел ничего полезного.

Я попытался напечатать следующие коды в Prolog:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top