library(clpb)
目前可用于 SICStus(原始版本)和 SWI(通过 mat)。让我很快进入本质:
?- X = 1+1, sat(X), X = 1+1.
X = 1+1.
?- sat(X), X = 1+1.
false.
Run Code Online (Sandbox Code Playgroud)
所以这是一个类似的问题,因为它存在于library(clpfd)
.
遇到这种情况怎么办?
更新:在library(clpfd)
垫子中,现在有用# /1
于此目的的函子。理想情况下,加上操作符声明op(150,fx,#)
,我们现在可以写:
?- X = 1+1, #X #= Y.
ERROR: Type error: `integer' expected, found `1+1' (a compound)
Run Code Online (Sandbox Code Playgroud)
为了确保完全代数性质,必须声明:
:- set_prolog_flag(clpfd_monotonic, true).
Run Code Online (Sandbox Code Playgroud)
现在,不明确的变量(因此,只能是整数或表达式)会产生实例化错误:
?- 1 + 1 #= Y.
ERROR: Arguments are not sufficiently instantiated
?- 1 + 1 #= #Y.
Y = 2.
Run Code Online (Sandbox Code Playgroud)