处理大型数值prolog

处理大型数值prolog,prolog,clpfd,eclipse-clp,Prolog,Clpfd,Eclipse Clp,我正在使用prolog,我需要处理巨大的数值(我知道,prolog最初不是用来处理数字的)。我正在使用ECLiPSe 6.1和一些内置谓词的文档,如fd\u global:ordered\u sum\2所述: 任何尚未具有有限边界的输入变量将被指定为-10000000到10000000的默认边界 如何处理大于10000000的值?(一般来说,不一定是ECLiPSe) 如果使用库(ic),则在基本约束中使用时,通常默认情况下变量会得到无限的边界: ?- lib(ic). Yes (0.13s cp

我正在使用prolog,我需要处理巨大的数值(我知道,prolog最初不是用来处理数字的)。我正在使用ECLiPSe 6.1和一些内置谓词的文档,如
fd\u global:ordered\u sum\2
所述:

任何尚未具有有限边界的输入变量将被指定为-10000000到10000000的默认边界

如何处理大于10000000的值?(一般来说,不一定是ECLiPSe)

如果使用
库(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)

在其他系统中,如SWI Prolog(包括其CLP(FD)库),数字可以任意大(当然,假设您有足够的内存…)@Fatalize:像
X#>=0这样的表达式包括
X
上面的所有数字。解释得很清楚。因此,您还建议使用
ic\u global
中的谓词,而不是
fd\u global
fd
中的谓词(如果可用)?有很大的不同吗?@damianodamiano:如果这个答案适合你,那么就投票并通过勾选Yes接受它,你应该使用
ic
ic_xxx
系列库。
fd
系列是一个较旧的实现。