2016-09-24 67 views
1

我只是在学习序言,有一件事我不能理解我的头。Prolog统一不是()

假设我有以下程序

value(v). 

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

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

a(w)给我的真实,因为没有事实value(w),因此,即使在尝试时,它不能被证明是正确的。

据我了解,要求a(X).应该给我第一个可能的值,使得value(X)不可证实。应该有无限的可能性,因为只有value(v)是正确的。

但是为什么Prolog会继续回答false

+1

这取决于你如何查看***伪造***,什么是假的?你如何证明某件事是假的?一种观点认为,*不可证明的一切都是错误的*,这是一种观点,你可以想象你生活在一个真实的***可证明的世界里(这是有争议的课程)。在序言中,'\ +'运算符与否定作为失败语义,这正是我上面所描述的。希望能够给出一些线索。 – Limmen

+0

是的,如果我们将false定义为不可证明的话,那么Prolog可以通过提供它无法证明正确的例子来实现目标? – user3207838

+0

但我想问题是,Prolog总是希望让事情**真实**,在这种情况下,我们基本上会颠倒引擎? – user3207838

回答

2

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

其次,请不要使用(\+)/1表示方面的disequality(\+)/1在Prolog中是不完整的,因而没有逻辑上的声音。它是而不是逻辑否定,而是表示“not  可证明”。

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

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

因此,我们有:

 
?-  \+ value(V). 
false. 

更具体查询成功:

 
?- V = a, \+ value(V). 
V = a. 

这显然有悖于我们从纯粹的关系,期望逻辑性质。请参阅

为了表示术语disequality,使用dif/2。如果您的Prolog系统不支持dif/2,请询问其是否包含在内,或者使用iso_dif/2作为逻辑上合理的安全近似值。有关更多信息,请参阅

+0

好吧,我明白了。因此,为了实现我想要的功能,Prolog需要提出一个无法通过设计来解决的不可证实的例子。 所以基本上,人们可以在Prolog中实现这个(尽管可能不需要)并获得我提到的行为?还是我错过了一些基本的逻辑概念? – user3207838

+0

就你而言,只需使用'dif/2'或其他约束来表达不等式:'dif(X,v)'表明'X'与原子'v'有**不同**。这成功了,只要目标未知,就剩下剩余目标。对于其他领域,有类似的约束。例如,'X#\ = 3'表示'X'是一个**整数**,不同于3。 – mat

1

Prolog在“封闭的世界假设”下运作–它只知道我们告诉它的内容。特别的是,我们已经告诉过什么都没有关于否wu,或者其他的东西,那它怎么会产生它们给我们?并且为什么w应该在u之前,而不是反之呢?

明智的唯一的事可能是产生(X, dif(X,v)),但它会回答一个不同问题,即“如何使a(X)可证明的?”,而不是一个Prolog实际上正在回答,即“是a(X)可证明?”

为了减轻你的认知负担,在你的脑袋重命名的Prolog提示的答复从trueYes,并从falseNo

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

另外重命名为“不”为读为\+not_provable,精神上。