Prolog操作员在练习中的解释



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

实现以下两个操作符具有,以这样的方式使用短语:彼得有约翰的车回答问题,如:谁有X的什么

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

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

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

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

?-彼得有约翰的车。

或:

?

X = peter,

Y = car,

Z = john.

很好,它工作,但我不太清楚它是如何工作的,我对操作符优先级:

有一些问题

运算符的优先级值为200。的运算符的优先级值为100。

参考短语:peter has car of john,所以这意味着Prolog首先计算句子的这一部分:car of john(因为运算符具有较低的优先级),如果它是真的,那么它计算:pater has(前一次求值的结果)。

简而言之,我可以这样解释原句子:

peter has (car of john)

正确吗?

另一个问题与操作符的类型有关。

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

我的问题是:我可以获得相同的结果使用xfy和或yfx以某种方式混合在我的有和操作符?

正确吗?是的。

xfx表示操作符在其分支上"占主导地位",而xfyyfx表示"链表构造",在某种意义上允许具有相同优先级的链表达式。

对于您的短语,您使用了正确的op声明,但如果您认为有必要,您可以使用其他结合性说明符。

我看到of可能使用xfy,就像'peter has car of john of mary '。在

:- 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.

最新更新