我正在完成Ivan的“人工智能Prolog编程”第三章中的练习。
练习3.13指出:
建议对运算符(“was”、“of”、“the”)有一个适当的定义,以便能够写出这样的子句: 戴安娜是该部门的秘书。。 然后问Prolog: -谁是这个部门的秘书 王妃 -戴安娜是什么 这个部门的秘书。
这项工作的答案是:
:- op(300, xfx, was).
:- op(200, xfx, of).
:- op(100, fx, the).然而,我不知道“戴安娜是这个部门的秘书”这个词的结构会是什么样子。我知道,优先级最高的算子是表达式的主函子,所以在这种情况下,主函子是“was”。
我对这个词的结构的回答是:
was(diana, of(the(secretary, the(department))).我不知道我的答案是否正确,所以我想知道是否有人能帮助澄清这一点。
发布于 2019-01-06 08:40:31
ISO谓词是以规范方式打印此类表达式的 [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的猜测,您可以在 [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.https://stackoverflow.com/questions/54059800
复制相似问题