为什么 SWI-Prolog 只给出 f/1 就发明了 f/2?

问题描述

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,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 保持不同

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...