为什么在Prolog的CLP(FD)中没有分区?

时间:2016-07-05 08:42:22

标签: prolog clpfd

我在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'

问题出在哪里?如何解决?谢谢。

1 个答案:

答案 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.