冻结/ 2的意外行为


11

我在玩谓词freeze/2frozen/2

?- freeze(X,a=a), frozen(X,Goal).
?- freeze(X,a=a), freeze(Y,b=b), X=Y, frozen(X,Goal).

(x86_64的版本4.5.1)给出了以下答案:

| α-冻结(X,a = a),冻结(X,目标)。
目标= prolog:freeze(X,user:(a = a)),
prolog:freeze(X,user:(a = a))吗?;
没有
| α-冻结(X,a = a),冻结(Y,b = b),X = Y,冻结(X,目标)。
Y = X,
目标=(用户:(a = a),序言:冻结(X,用户:(b = b))),
序言:冻结(X,用户:(a = a)),
prolog:freeze(X,user:(b = b))吗?;
没有

现在没想到!Goal = prolog:freeze(X,user:(a=a))

期望的是版本8.0.3 给出的答案:

α-冻结(X,a = a),冻结(X,目标)。
目标=用户:(a = a),
冻结(X,a = a)。
α-冻结(X,a = a),冻结(Y,b = b),X = Y,冻结(X,目标)。
X = Y,
目标=(用户:(a = a),用户:(b = b)),
冻结(Y,a = a),
冻结(Y,b = b)。

可以说SICStus答案 SWI答案都是正确的...

但是,对于SICStus给出的某些特殊答案,是否有更深层的原因?


1
Sicstus中的AFAIK未实现掩盖“最后失败”的功能。; 不`
Anton Danilov

首先,明确资格是可取的。

1
直到3.8.5,此问题不存在。从3.8.6开始确实存在。

@AntonDanilov。好的。但是我实际上是指粗体“目标= ...”之间的差异。
重复

1
也许@PerMildner会回答?

Answers:


6

我不知道这种差异是否有任何“深刻的”原因。由于frozen/2是属性变量的通用接口,因此对于非特殊情况的freeze/2目标来说是有意义的。

实际上,直到4.5.1,SICStus都尝试了特殊情况的freeze/2目标,但有时失败了。这就是为什么您看到user:(a=a)第一个子目标的原因。在下一发行版中,我们对此进行了更改,因此结果将变为Goal = (prolog:freeze(X,user:(a=a)),prolog:freeze(X,user:(b=b)))(并且我们还对进行了其他改进frozen/2)。


最多4,5,1和3.8.5之后
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.