我正在使用 prolog,我需要处理巨大的数值(我知道,prolog 最初并不是为处理数字而设计的)。我正在使用 ECLiPSe 6.1 和一些内置谓词的文档,如下所述fd_global:ordered_sum\2
:
任何没有有限边界的输入变量将被赋予默认边界 -10000000 到 10000000
我如何处理大于 10000000 的值?(通常,不一定使用 ECLiPSe)。
我正在使用 prolog,我需要处理巨大的数值(我知道,prolog 最初并不是为处理数字而设计的)。我正在使用 ECLiPSe 6.1 和一些内置谓词的文档,如下所述fd_global:ordered_sum\2
:
任何没有有限边界的输入变量将被赋予默认边界 -10000000 到 10000000
我如何处理大于 10000000 的值?(通常,不一定使用 ECLiPSe)。
如果使用library(ic)
,则在基本约束中使用时,通常变量默认为无限边界:
?- lib(ic).
Yes (0.13s cpu)
?- sum([X,Y,Z]) #= 0.
X = X{-1.0Inf .. 1.0Inf}
Y = Y{-1.0Inf .. 1.0Inf}
Z = Z{-1.0Inf .. 1.0Inf}
There is 1 delayed goal.
Yes (0.00s cpu)
但是,某些全局约束实现中的算法无法处理无限边界,因此强加了您提到的默认边界:
?- ic_global:ordered_sum([X,Y,Z], 0).
X = X{-10000000 .. 0}
Y = Y{-5000000 .. 5000000}
Z = Z{0 .. 10000000}
There are 5 delayed goals.
Yes (0.06s cpu)
为避免这种情况,您可以在调用全局约束之前初始化具有较大有限边界的变量:
?- [X,Y,Z] :: -1000000000000000..1000000000000000, ic_global:ordered_sum([X,Y,Z], 0).
X = X{-1000000000000000 .. 0}
Y = Y{-500000000000000 .. 500000000000000}
Z = Z{0 .. 1000000000000000}
There are 5 delayed goals.
Yes (0.00s cpu)