冻结/2的意外行为



我在玩prolog协程谓词freeze/2frozen/2:

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

sicstus-prolog(x86_64的4.5.1版本(给出了以下答案:

|?-冻结(X,a=a(、冻结(X、目标(。目标=序言:冻结(X,用户:(a=a((,prolog:冻结(X,user:(a=a((;不|?-冻结(X,a=a(、冻结(Y,b=b(、X=Y、冻结(X、目标(。Y=X,目标=(用户:(a=a(,序言:冻结(X,用户:(b=b((,prolog:冻结(X,user:(a=a((,prolog:冻结(X,用户:(b=b((;no

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

我所期望的是类似swi-prolog版本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,冻结(Y,b=b(

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

但SICStus给出的有点奇怪的答案有更深层次的原因吗

我不知道这种差异是否有"深层次"的原因。由于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进行了一些其他改进(。

最新更新