2

我最近在学习 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

结果对我来说没有什么不同。

4

2 回答 2

5

运算符的“类型”控制关联性,例如表达式“5 - 4 - 3”是否应解释为“(5 - 4) - 3”,这称为左关联性或“5 - (4 - 3)” ",这是右结合性。

如果减号运算符按通常预期工作,则需要将 is 定义为 'yfx',使其具有左关联性。'xfx 和 'xfy' 等其他类型是对此的变体。更多信息请访问http://www.cse.unsw.edu.au/~billw/cs9414/notes/prolog/op.html

于 2012-02-18T11:46:58.603 回答
2

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

?- write_canonical(1+2*3).
+(1,*(2,3))
true.
于 2012-02-18T13:35:57.660 回答