我最近学习了Prolog,发现用于定义中缀运算符的三种类型令人困惑。
指定运算符类型时,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
结果对我来说没有差异。
运算符的"type"控制关联性,例如表达式"5-4-3"应解释为"(5-4)-3"(称为左关联性)还是"5-(4-3)"(即右关联性)。
如果减号运算符应该像通常预期的那样工作,则需要将其定义为"yfx",从而使其保持关联。其他类型如"xfx"one_answers"xfy"是对此的变体。更多信息,请访问http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html.
如果Prolog符合ISO,则可以使用write_canonical来分析运算符优先级和关联性的影响。例如
?- write_canonical(1+2*3).
+(1,*(2,3))
true.