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