?序言拒绝假设推理查询?

我怀疑 ?Prolog 的主要实现 teyjus 可能有点被遗弃,但是 ?Prolog 是一个迷人的 Prolog,它应该让你使用高阶逻辑、假设推理和其他东西,这就是为什么我尝试使用它。

文件“example.sig”:

sig example.

kind person, language type.

type hans person.
type german, french, italian language.

type grade person -> o.
type take person -> language -> o.

文件“example.mod”:

module example.

(grade P) :- (take P german), (take P french).
(grade P) :- (take P german), (take P italian).

take hans french.

但是,当我编译和加载它时,虽然它似乎可以工作,但假设的推理查询被拒绝:

[example] ?- take X Y.

The answer substitution:
Y = french
X = hans

More solutions (y/n)? y

no (more) solutions

[example] ?- grade X.

no (more) solutions

[example] ?- (take hans german) => (grade hans).
(1,19) : Error : Symbol => is not permitted within terms

我在那里期待一个“是”。我究竟做错了什么?

回答

当前版本的 Teyjus 不允许直接将查询中的含义输入到顶层。Gopalan Nadathur 和我的书(Programming with Higher-Order Logic)在附录中提到了这个问题和解决方法(见下面的摘录)。

A.4.2 与本书假设的语言的偏差(第 287 页)

[...]

Teyjus 不允许在顶级目标中使用暗示。这是一个特性,当编译模型也扩展到这些目标时,将来可能会发生变化,但就目前而言,这意味着某些示例(例如第 3.2 节中的示例)无法直接使用该系统运行。请注意,暗示仅在顶级目标中是不允许的:它们可以在出现在程序子句主体中的目标中自由使用。因此,可以通过首先构建合适的程序子句,然后使用它来提出所需的查询来克服此限制。例如,而不是提出查询

?- p a => p b => p X.

可以创建子句

test X :- p a => p b => p X.

然后使用查询

?- test X.


以上是?序言拒绝假设推理查询?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>