我只是在学习序言,有一件事我无法理解。
假设我有以下程序
value(v).
a(X) :- not(value(X)).
所以a(v).给了我假的,因为value(v)可以证明是正确的。
a(w)给了我真实的,因为没有事实value(w),因此,即使尝试,也无法证明它是正确的。
在我的理解中,请求a(X).应该给我第一个无法证明的可能值value(X)。应该有无限的可能性,只有value(v)正确的。
但是为什么 Prolog 一直在回答false呢?
我只是在学习序言,有一件事我无法理解。
假设我有以下程序
value(v).
a(X) :- not(value(X)).
所以a(v).给了我假的,因为value(v)可以证明是正确的。
a(w)给了我真实的,因为没有事实value(w),因此,即使尝试,也无法证明它是正确的。
在我的理解中,请求a(X).应该给我第一个无法证明的可能值value(X)。应该有无限的可能性,只有value(v)正确的。
但是为什么 Prolog 一直在回答false呢?
首先,请使用 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用作逻辑上合理的安全近似值。有关详细信息,请参阅prolog-dif。
Prolog 在“封闭世界假设”下运行——它只知道我们告诉它的内容。特别是,我们没有告诉它no、w或u任何其他东西,那么它怎么会向我们生产它们呢?为什么应该w在之前u,而不是反之?
唯一明智的可能是产生(X, dif(X,v)),但这将是一个不同问题的答案,即“如何使a(X)可证明?” ,而不是 Prolog 实际回答的那个,即“a(X)可证明吗?” .
为了减轻您的认知负担,请将您脑海中的 Prolog 提示的回复从 重命名true为Yes,并从重命名false为No。
Yes意味着 Prolog 告诉我们“是的,我可以证明它!”,并且No– “不,我无法证明它。”
也将“不”重命名为,\+在not_provable心理上。