2

在下面的查询中,首先我得到X = H128的是,这是从哪里来的?另外为什么它返回是?是因为变量X实际上没有定义,我们正在测试那个条件吗?

?- not(X==3).
X = H128 
yes
4

3 回答 3

6

您的查询正在使用未实例化的变量 (X)。在检查 X 是否用术语 3 实例化时,它 (X==3) 失败,因为 X 未实例化。

因此,not(X==3) 将成功,因为 prolog 引擎无法证明 X==3。因此,您的序言解释器返回“是”(由于否定作为解释器的失败方法),并且 X 仍未实例化。

这就是解释器显示 X = H128 的原因,其中 H128 是一个未实例化的虚拟变量。

于 2011-07-12T19:31:39.840 回答
3

你的初衷是什么?您可能想声明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)删除限制。

于 2011-07-13T23:32:44.413 回答
2

是的,这是因为变量X不受第一个目标的约束,not(X==3). 实际上,not/1元谓词永远不会产生绑定,即使它成功了。那是因为成功not意味着内在目标失败。请注意,这not(X=3)会失败,因为在空闲X=3时可以成功X(并且可以绑定到值 3)。

于 2011-07-12T19:35:30.117 回答