2012-02-18 2 views
2

Я недавно узнал о Prolog, и я нахожу три типа, используемых для определения запутывающих операторов-инфикс.Определение оператора инфикса Prolog

Каковы различия между 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 

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

ответ

3

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

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

+0

Благодарим за ответ! – JasonLi

+2

попробуйте сделать (1 is_alive 2 is_alive 3) для каждого из ваших операторов, и вы увидите разницу – DaveEdelstein

2

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

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