Prolog – 运算符优先级 – Bratko – 第三章

我正在学习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/1of/2was/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.

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注