3

我在 Prolog 中有以下关于自然语言的练习:

实现以下两个运算符hasof以这样的方式使用短语: peter has car of john回答以下问题:Who has What of X

现在,我知道在英语中这听起来很糟糕,因为在英语中我们通常说:“peter has john's car”,但我是意大利人,我试图将意大利语的请求翻译成英语。我希望这个概念是清楚的。

所以我找到了以下 Prolog 解决方案,保存在一个文件中:

:-op(200,xfx,has).
:-op(100,xfx,of).

peter has car of john.

之后我在 Prolog shell 中查阅这个文件,我可以执行以下操作:

?- 彼得有约翰的车。

真的。

或者:

?- X 有 Z 的 Y。

X = 彼得,

Y = 汽车,

Z = 约翰。

太好了,它工作,但我不太清楚它是如何工作的,我对操作员优先级有一些疑问:

运营商有 200 作为优先级值。 of运算符的优先级值为100 。

参考这句话:peter has car of john所以这意味着Prolog首先评估这部分句子:car of john(因为运算符的优先级较低,尊重has运算符),如果是真的,那么它会评估:pater has (先前评估的结果)。

几句话,我可以这样解读原文:

彼得有(约翰的车)

这是正确的吗?

另一个问题与运营商的类型有关。

在我的解决方案中,我对两个运算符都使用xfx类型,因为在这种句子中,我没有与多个运算符具有相同优先级的潜在歧义相关的问题(例如:a - b - c其中运算符 - 必须具有形式yfx )

我的问题是:我可以在我的 has 和 of 运算符上以某种方式使用 xfy 和\或 yfx 混合获得相同的结果吗?

4

1 回答 1

4

这是正确的吗?是的。

xfx意味着运算符“支配”其分支,而xfyyfx代表“列表构造”,在某种意义上允许链接相同优先级的表达式。

使用您的短语,您正在使用正确的操作声明,但如果您认为有必要,您可以使用其他关联说明符。

我看到 xfy 的可能用法of,例如“彼得有玛丽约翰的车”。后

:- op(100, xfy, of).
:- op(200, xfx, has).

我明白了

?- write_canonical(peter has car of john of mary).
has(peter,of(car,of(john,mary)))
true.
于 2013-03-28T18:31:41.610 回答