序言:例如,X 是 3 和 3 是 X 之间有什么区别?

时间:2021-05-17 19:54:16

标签: prolog

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)truethree(5)false,为什么没有足够的数据来发现 X 等于 { {1}} 当我们请求 3 的值时?

1 个答案:

答案 0 :(得分:0)

那是因为 is/2 是 Prolog 的数值表达式求值器。 is/2右侧的所有内容都必须完全实例化,以便表达式可以计算为数字(可能遗漏:计算为数字以外的其他内容)。然后结果与is/2左侧统一。如果 LHS 是未绑定变量或与获得的结果相同,则此操作成功。

在您的情况下,您可以通过统一使谓词 three/1 对称,因为实际上没有什么可评估的:

three_sym(X) :- 3 = X.

3 成功并输出未绑定 X = 3 的答案 X