我在玩prolog协程谓词freeze/2
和frozen/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
进行了一些其他改进(。