我最近在学习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
结果显示我没有差异。
答案 0 :(得分:5)
运算符的“类型”控制关联性,例如表达式“5 - 4 - 3”是否应解释为“(5 - 4) - 3”,称为左关联性或“5 - (4 - 3)”,这是正确的相关性。
如果减运算符应该按预期工作,则需要将其定义为'yfx',使其成为左关联的。其他类型'xfx和'xfy'就是其中的变种。请参阅http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html。
答案 1 :(得分:3)
如果您的Prolog符合ISO标准,则可以使用write_canonical来分析运算符优先级和关联性的影响。例如
?- write_canonical(1+2*3).
+(1,*(2,3))
true.