我在CLP(FD)页面上找不到分区(/)符号:http://www.swi-prolog.org/man/clpfd.html
此简单代码也会出错:
:-use_module(library(clpfd)).
afn(A,B,C):-
C #= B / A.
?- afn(23, 56, C).
ERROR: Domain error: `clpfd_expression' expected, found `56/23'
问题出在哪里?如何解决?谢谢。
答案 0 :(得分:0)
在ISO Prolog(/)/ 2中产生浮点结果。这里的SWI-Prolog不符合ISO标准,可能时转换为整数。但是基本上(/)/ 2被视为机器实数之间的运算,它给出了一个新的近似机器实数。
另一方面,CLP(FD)仅适用于整数。因此,我想这就是CLP(FD)通常不支持(/)/ 2运算符的原因。另一方面,ISO Prolog中的div运算符(//)/ 2也适用于CLP(FD)。 Supported是:
Expr // Expr截断的整数除法
Expr div Expr地板整数除法
这是一个示例运行:
Welcome to SWI-Prolog (threaded, 64 bits, version 8.1.4)
?- use_module(library(clpfd)).
true.
?- X #= 100 // Y, Y = 7.
X = 14,
Y = 7.
?- X #= Z // 7, X = 14.
X = 14,
Z in 98..104.
如果您的CLP(FD)没有(//)/ 2运算符,则可以对其进行仿真。您可以写X * Z + R#= Y,0#= 以下是一些示例运行,表明该方法也有效:?- X*Y+R #= 100, 0 #=< R, R #< Y, Y = 7.
X = 14,
Y = 7,
R = 2.
?- X*7+R #= Z, 0 #=< R, R #< 7, X = 14.
X = 14,
R in 0..6,
-98+Z#=R,
Z in 98..104.