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)
的限制