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

问题描述 投票:5回答:1

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

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

prolog clpfd
1个回答
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 Floored整数除法

这是一个示例运行:

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.

如果你有一个没有(//)/ 2运算符的CLP(FD),你可以模拟它。而不是X#= Y // Z,你可以写X * Z + R#= Y,0#= <R,R#<Z。当涉及负参数时,你需要一个更复杂的公式。

以下是一些示例运行,表明此方法也有效:

?- 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.
© www.soinside.com 2019 - 2024. All rights reserved.