【问题标题】:Unexpected behavior of frozen/2冻结/2 的意外行为
【发布时间】:2019-11-17 20:43:24
【问题描述】:

我在玩 谓词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)), 序言:冻结(X,用户:(a = a))? ; 不 | ?- 冻结(X,a=a),冻结(Y,b=b),X=Y,冻结(X,目标)。 Y = X, 目标 = (user:(a=a),prolog:freeze(X,user:(b=b))), 序言:冻结(X,用户:(a = a)), 序言:冻结(X,用户:(b = b))? ; 不

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

确实期望得到的答案类似于 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 给出的有些奇怪的答案是否有更深层次的原因?

【问题讨论】:

  • Sicstus 中的 AFAIK 未实现屏蔽“上次失败”的功能`? ;没有`
  • 一方面,明确限定是可取的。
  • 到3.8.5这个问题不存在。从 3.8.6 开始,它确实存在。
  • @AntonDanilov。好的。但我实际上指的是粗体“Goal = ...”中的差异。
  • 也许@PerMildner 会回答?

标签: prolog-coroutining sicstus-prolog swi-prolog prolog sicstus-prolog prolog-coroutining


【解决方案1】:

我不知道这种差异是否有任何“深层”原因。由于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 之后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 2011-07-04
  • 2019-03-21
  • 2019-04-27
相关资源
最近更新 更多