以这样的方式实现以下两个运算符 用以下短语:彼得有约翰的车回答问题,如: 谁有什么X
我有这个简单的程序,定义了两个操作符:有(指定谁拥有什么)和 (指定谁拥有什么)
这是Prolog源文件中的解决方案:
:- op(100, xfy, of).
:- op(200, xfx, has).
peter has car of john.
peter has car of mary.
car of john of mary.
正如我可以阅读与 write_canonical()功能相关的官方SWI Prolog文档:http://www.swi-prolog.org/pldoc/man?predicate=write_canonical%2F1
使用标准括号在当前输出流上写术语 前缀表示法(即忽略运算符声明)。原子那个 报价需要引用。
因此,如果我在write_canonical()函数中启动Prolog查询:
15 ?- write_canonical(peter has car of john).
has(peter,of(car,john))
true.
我知道Prolog如何解释自然语言形式,是不是?
在前一种情况下,它很简单,看起来很清楚,首先评估句子:(约翰的车),然后评估句子:彼得有(先前评估的结果)< /强>
具有以下解释:彼得有(约翰的车)
好的,这很清楚......现在我们来问我的问题。
如果我这样做:
16 ?- write_canonical(peter has car of john of mary).
has(peter,of(car,of(john,mary)))
true.
我如何用自然语言解释它? (如果这在自然语言中有任何意义)
在开始时II最初被解释为汽车属于约翰和玛丽的摊位......所以我试图介绍前一个例子中的3个事实,但如果在Prolog shell中我尝试执行:
10 ?- peter has car of john of mary.
false.
这似乎是假的。
自然语言的正确解释是什么?
答案 0 :(得分:1)
我在阅读您之前关于此问题和CapelliC答案的问题时做了双重考虑。应该实际阅读,
“彼得有一辆车,属于约翰, [约翰]属于玛丽。”你的解释应该是(使用write_canonical
)类似的东西:
has(peter, of(car, [john,marry]))
或者
has(peter, of(car, john)), has(peter, of(car, marry))
取决于你想要如何实现它,但是,如果它实际上是同一辆车(从你的例子中并不完全清楚)。
“彼得有约翰玛丽的车”当然不是传统的英语。