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”背后的理由。任何见解都将不胜感激。
例如,考虑一下您的定义:
?- 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(...!