为什么 SWI-Prolog 发明 f/2 仅给定 f/1?

Why does SWI-Prolog invent f/2 given only f/1?

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 return

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

打印约束中的 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

是的,您可以简化它,但是...什么时候才能知道优化成本是否低于获得的收益?