我在Prolog中有以下关于自然语言的练习:
现在,我知道在英语中这听起来很糟糕,因为在英语中我们通常说:"peter has john's car",但我是意大利人,我试着把意大利的请求翻译成英语。我希望这个概念是清楚的。实现以下两个操作符具有和的,以这样的方式使用短语:彼得有约翰的车回答问题,如:谁有X的什么
所以我找到了以下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以某种方式混合在我的有和操作符?
正确吗?是的。
对于您的短语,您使用了正确的op声明,但如果您认为有必要,您可以使用其他结合性说明符。 我看到xfx
表示操作符在其分支上"占主导地位",而xfy
或yfx
表示"链表构造",在某种意义上允许具有相同优先级的链表达式。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.