three(X) :- 3 is X.
three2(X) :- X is 3.
请求 three(3)
、three(5)
和 three2(3)
、three2(5)
分别具有相同的答案。
但是 three2(X)
的答案是 3,而 three(X)
的答案是 "Arguments are not sufficiently instantiated"
。
如果有足够的数据来解决 three(3)
是 true
和 three(5)
是 false
,为什么没有足够的数据来发现 X
等于 { {1}} 当我们请求 3
的值时?
答案 0 :(得分:0)
那是因为 is/2
是 Prolog 的数值表达式求值器。 is/2
的右侧的所有内容都必须完全实例化,以便表达式可以计算为数字(可能遗漏:计算为数字以外的其他内容)。然后结果与is/2
的左侧统一。如果 LHS 是未绑定变量或与获得的结果相同,则此操作成功。
在您的情况下,您可以通过统一使谓词 three/1
对称,因为实际上没有什么可评估的:
three_sym(X) :- 3 = X.
以 3
成功并输出未绑定 X = 3
的答案 X
。