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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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