我在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以某种方式在我的运算符和运算符上获得相同的结果吗?
答案 0 :(得分:4)
这是对的吗? 是
xfx
表示运算符在其分支上“支配”,而xfy
或yfx
代表“列表构造”,意味着允许链接表达式相同< / 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.