1

我只是在学习序言,有一件事我无法理解。

假设我有以下程序

value(v).

a(X) :- not(value(X)).

所以a(v).给了我假的,因为value(v)可以证明是正确的。

a(w)给了我真实的,因为没有事实value(w),因此,即使尝试,也无法证明它是正确的。

在我的理解中,请求a(X).应该给我第一个无法证明的可能值value(X)。应该有无限的可能性,只有value(v)正确的。

但是为什么 Prolog 一直在回答false呢?

4

2 回答 2

2

首先,请使用 ISO 谓词(\+)/1 不是not/1.

其次,请不要(\+)/1用来表示术语的不相等性:在 Prolog 中不完整,因此在逻辑上(\+)/1不合理不是逻辑否定,而是表示“不可证明”。

在你的情况下:?- value(X).成功,所以它是可证明的,所以?- \+ value(X). 失败,尽管有使查询成功的实例化

特别是,?- \+ value(a). 成功

所以我们有:

?- \+ 值(V)。
的。

更具体的查询成功:

?- V = a , \+ 值(V)。
V = 一个

这显然与我们对纯关系所期望的逻辑属性背道而驰。请参阅

要表示项的不等式,请使用dif/2。如果您的 Prolog 系统不支持dif/2,请要求将其包含在内,或iso_dif/2用作逻辑上合理的安全近似值。有关详细信息,请参阅

于 2016-09-24T17:55:04.973 回答
1

Prolog 在“封闭世界假设”下运行——它只知道我们告诉它的内容。特别是,我们没有告诉它nowu任何其他东西,那么它怎么会向我们生产它们呢?为什么应该w在之前u,而不是反之?

唯一明智的可能是产生(X, dif(X,v)),但这将是一个不同问题的答案,即“如何使a(X)可证明?” ,而不是 Prolog 实际回答的那个,即a(X)可证明吗?” .

为了减轻您的认知负担,请将您脑海中的 Prolog 提示的回复从 重命名trueYes,并从重命名falseNo

Yes意味着 Prolog 告诉我们“是的,我可以证明它!”,并且No– “不,我无法证明它。”

将“不”重命名为,\+not_provable心理上。

于 2016-09-26T14:18:30.413 回答