Prolog查询返回H128
在下面的查询中,首先我得到的是Prolog查询返回H128,prolog,prolog-dif,Prolog,Prolog Dif,在下面的查询中,首先我得到的是X=H128,这是从哪里来的?还有,为什么它返回“是”?是因为变量X实际上没有定义,我们正在测试该条件吗 ?- not(X==3). X = H128 yes 您的查询正在使用未实例化的变量(X)。 当检查X是否用术语3实例化时,它(X==3)会失败,因为X未实例化 因此,not(X==3)将成功,因为prolog引擎无法证明X==3。 因此,您的prolog解释器返回“yes”(由于解释器的“否定为失败”方法),并且X保持未实例化 这就是为什么解释器显示X=H
X=H128
,这是从哪里来的?还有,为什么它返回“是”?是因为变量X
实际上没有定义,我们正在测试该条件吗
?- not(X==3).
X = H128
yes
您的查询正在使用未实例化的变量(X)。 当检查X是否用术语3实例化时,它(X==3)会失败,因为X未实例化 因此,not(X==3)将成功,因为prolog引擎无法证明X==3。 因此,您的prolog解释器返回“yes”(由于解释器的“否定为失败”方法),并且X保持未实例化
这就是为什么解释器显示X=H128,其中H128是一个虚拟的未实例化变量。是的,这是因为变量
X
不受第一个目标的约束,不(X==3)
。实际上,not/1
元谓词永远不会生成绑定,即使它成功了。这是因为not
的成功意味着内部目标失败。请注意,not(X=3)
将失败,因为X=3
可以在X
是免费的(并且可以绑定到值3)时成功。您的初衷是什么?可能您想声明X
不等于3。对于不等式,许多Prolog系统提供dif/2
?- dif(X,3).
dif(X,3).
在这个查询中,我们要求X
的值不等于3。那么哪些值是不相等的呢?实际上,有很多:想想1
,2
,术语3+3
,c
,列表[2,3,4]
,还有更多。因此,给出一个像X=4
这样的具体答案将排除许多其他有效答案。然而,这里的答案是:查询适用于所有不等于3的X
。因此,实际评估将推迟到稍后进行
?- dif(X,3), X = 3.
false.
在这里,我们得到了一个情况,X
得到了值3,这个值不成立
?- dif(X,3), X = 4.
X = 4.
这里接受了一个具体的有效值,并且去掉了dif(4,3)
的限制