我正在学习Ivan Bratko的《Prolog Programming for Artificial Intelligence》第三章的练习。
练习3.13的要求是:
建议为运算符(‘was’, ‘of’, ‘the’)定义合适的定义,以便能够编写如下条款:
diana was the secretary of the department.
然后询问Prolog:
?- Who was the secretary of the department.
Who = diana
?- diana was What.
What = the secretary of the department.
这个练习的答案是:
:- op(300, xfx, was).:- op(200, xfx, of).:- op(100, fx, the).
然而,我不确定术语’diana was the secretary of the department’的结构会是什么样子。我知道优先级最高的运算符是表达式的主要函子,所以在这种情况下,主要函子将是’was’。
我对术语结构的回答是:
was(diana, of(the(secretary, the(department))).
我不知道我的答案是否正确,所以我想知道是否有人能帮助澄清这一点。
回答:
一个ISO谓词是write_canonical/1
[swi-doc],它以规范的方式打印这样的表达式,例如:
?- write_canonical(Who was the secretary of the department).was(_,of(the(secretary),the(department)))true.
所以我们看到the/1
比of/2
和was/2
更紧密地绑定。
当然,这不仅仅是Prolog的猜测,你在op/3
[swi-doc]调用中定义了优先级。第一个参数是优先级。文档说明:
Precedence
是一个介于0到1200之间的整数。(…)对于x
,参数的优先级必须严格低于运算符。术语的优先级为0,除非其主要函子是一个运算符,在这种情况下,优先级是该运算符的优先级。用括号括起来的术语( ... )
的优先级为0。
因此,如果优先级较低,它会更紧密地绑定。括号的优先级为0
,因此对所有其他运算符具有“优先权”。
由于你的定义中the/1
运算符的优先级为100
,因此the
会更紧密地绑定,而of/2
会在比the/1
更高的层次上绑定,was/2
会在语法树中比of/2
更高的层次上绑定。
因此,如果你想添加一个事实,说diana
是部门的秘书,你应该编写如下事实:
was(diana, of(the(secretary), the(department))).
然后我们可以查询如下:
?- Who was the secretary of the department.Who = diana.