【发布时间】:2019-08-20 03:15:39
【问题描述】:
我正在阅读 Pereira 和 Shieber 的《Prolog and Natural-Language Analysis》(pdf) 一书,我被问题 2.7 中的一句话困住了:
在语义网络表示中,我们经常想问 [...] “福特与 公司?”
修改您对语义网络的表示,以允许这种新的 类型的问题和前一个问题中的类型。提示:治疗 语义网络关系作为 Prolog 个体。这是一个重要的 Prolog 编程技术,有时在 哲学界。
我不熟悉这种reification 技术。
好的,让我们假设这个事实和规则数据库:
isa('Ole Black', 'Mustangs').
isa('Lizzy', 'Automobiles').
isa('Ford','Companies').
isa('GM','Companies').
isa('1968','Dates').
ako('Model T', 'Automobiles').
ako('Mustangs', 'Automobiles').
ako('Companies', 'Legal Persons').
ako('Humans', 'Legal Persons').
ako('Humans', 'Physical Objects').
ako('Automobiles', 'Physical Objects').
ako('Legal Persons', 'Universal').
ako('Dates', 'Universal').
ako('Physical Objects', 'Universal').
have_mass('Physical Objects').
self_propelled('Automobiles').
company(X) :- isa(X,'Companies').
legal_persons(X) :- ako(X,'Legal Persons').
如何编写查询,在上面的代码中发现'Ford' 和'Companies' 之间的关系是isa?
当然,我总是可以写类似的东西
fact(isa, 'Ford','Companies').
并查询?- fact(X, 'Ford','Companies').,但不知何故,我认为这不是正确的做法。
谁能解释我如何正确地做到这一点?
【问题讨论】:
-
"我如何编写一个查询,在上面的代码中发现 'Ford' 和 'Companies' 之间的关系是 isa?"您的意思是找到“绑定”两者的谓词吗?
-
如果我正确理解“绑定”的含义,是的,我如何找到绑定两个变量的谓词。
-
我没有尝试过,但根据这个答案 stackoverflow.com/a/8510861/131160> 和您的查询,我猜以下可能有效:
forall(fact(X, 'Ford', 'Companies'), writeln(X)) -
...但是“修改语义网络的表示”部分听起来您不应该真正编写这样的查询,而应该更改数据结构...不知道如何。 ..
-
@jcsahnwaldt 我不认为他想那样解决它,是否有一个 SWI-Prolog 函数可以打印出谓词。我找了它,但找不到任何东西
标签: prolog