【问题标题】:Why does SWI-Prolog invent f/2 given only f/1?为什么 SWI-Prolog 只给 f/1 就发明了 f/2?
【发布时间】:2020-12-20 15:57:46
【问题描述】:

SWI-Prolog 7.6.4:

?- dif(X, f(Y)), X=f(a).
X = f(a),
dif(f(f(a), Y), f(f(Y), a)).

请注意,我在查询中使用了f/1,但约束在f/2 上。这没有错,但似乎相当迂回。为什么 Prolog 不返回

?- dif(X, f(Y)), X=f(a).
X = f(a),
dif(Y, a).

【问题讨论】:

  • 似乎是一个错误......对不起,我没有一个建设性的答案,很可能你应该在 SWI-Prolog 话语上发帖。 Jan W. 始终提供快速准确的分析和补丁

标签: prolog swi-prolog prolog-dif


【解决方案1】:

打印约束中的f 与您的f 无关。它只是将子项放在一起的占位符:

?- dif(X, incal(Y)), X=incal(a).

X = incal(a),

dif(f(incal(a), Y), f(incal(Y), a)).    <--- residual constraints, not yet resolved

上面的意思就是:

  • incal(a) 必须与 incal(Y) 保持不同;和
  • Y 必须与 a 保持不同

是的,您可以简化这一点,但是......何时才能知道优化的成本是否会低于收益?

【讨论】:

  • 我明白了。不过还是很奇怪。它可以在不发明f/2 的情况下列出这两个约束(或仅列出后者)。
  • @MaxB 我想这只是一种避免无关代码或在某处获得一些速度的方法。
猜你喜欢
  • 2016-03-31
  • 1970-01-01
  • 2015-08-13
  • 1970-01-01
  • 2012-05-22
  • 2015-10-08
  • 2021-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多