2012-02-18 93 views
2

我最近在学习有关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 2012-02-18 11:53:42

+2

尝试对您的每个操作员进行操作(1 is_alive 2 is_alive 3),您将看到不同 – DaveEdelstein 2012-02-18 14:55:07

2

如果您的Prolog符合ISO标准,则可以使用write_canonical来分析运算符优先级和关联性的影响。例如

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