在练习中解释Prolog的操作员

时间:2013-03-28 17:49:40

标签: prolog

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

  

使用以下短语实现以下两个运算符具有 :   彼得有约翰的车回答诸如以下问题:谁拥有X的内容

现在,我知道在英语中这听起来很糟糕,因为在英语中我们通常说:“彼得有约翰的车”,但我是意大利人,我试图用英语翻译意大利语。 我希望这个概念很清楚。

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

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

peter has car of john.

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

  

? - 彼得有约翰的车。

     

真。

或者:

  

? - X的Z为Y

     

X =彼得,

     

Y = car,

     

Z =约翰。

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

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

参考短语:彼得有约翰的汽车所以这意味着Prolog首先评估这部分句子:约翰的车(因为运营商的优先级较低)尊重有运营商),如果是真的,那么它评估: pater(先前的evalutatuion的结果)。

简而言之,我可以用这种方式解释原句:

彼得有(约翰的车)

这是对的吗?

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

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

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

1 个答案:

答案 0 :(得分:4)

  

这是对的吗?   是

xfx表示运算符在其分支上“支配”,而xfyyfx代表“列表构造”,意味着允许链接表达式相同< / em>优先。

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

我看到of可能使用xfy,比如'peter有mary john of car`。 之后

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