Prolog - 运算符的绑定

cen*_*980 5 artificial-intelligence prolog

我正在做 Ivan Bratko 的“人工智能 Prolog 编程”中的练习。练习中说:

定义运算符“if”、“then”、“else”和“:=”,以便以下成为合法术语:

如果 X > Y 则 Z := X 否则 Z := Y

选择优先级,使“if”成为主要函子。

我无法确定运算符“then”和“else”中哪一个应该具有较低的优先级(并且绑定更强)。我对这个问题的回答是:

:- op(900, fx, if).
:- op(800, xfx, else).
:- op(700, xfx, then).
:- op(600, xfx, :=).
Run Code Online (Sandbox Code Playgroud)

(书中还指出“>”运算符的优先级为700)。

我认为“then”会比“else”绑定更强,但是这个练习的答案却另有说明:

:- op(900, fx, if).
:- op(800, xfx, then).   
:- op(700, xfx, else).  
:- op(600, xfx, :=).
Run Code Online (Sandbox Code Playgroud)

我不确定使“else”的优先级低于“then”背后的理由。任何见解都将不胜感激。

mat*_*mat 3

例如,考虑一下您的定义:

?- write_canonical(如果a则b否则c)。
如果(否则(那么(a,b),c))
真的。

以及书中的定义:

?- write_canonical(如果a则b否则c)。
如果(那么(a,else(b,c)))
真的。

进一步,根据您的定义:

?- write_canonical(如果a则(如果b则c)否则d)。
如果(否则(然后(a,如果(然后(b,c))),d))
真的。

以及书中的定义:

?- write_canonical(如果a则(如果b则c)否则d)。
如果(然后(a,else(如果(然后(b,c)),d)))
真的。

请特别注意,根据您的定义,if ... then ... else, 有时被解析为if(else(...,有时被解析为if(then(...!