如果我可以用clpfd对象取代所有 (is)/2
的整数算术,我的一些Prolog程序可以获得相当。
所以我想要力量...... clpfd ...所以我可以用clpfd-y代替X is 10^3
:)
考虑以下五个支持clpfd的Prolog处理器:
GNU Prolog 1.4.4
?- X #= 10^3. uncaught exception: error(type_error(fd_evaluable,(^)/2),(#=)/2) ?- X #= 10**3. X = 1000.
SWI-Prolog 7.3.14
?- use_module(library(clpfd)). % autoload would be even more awesome true. ?- X #= 10^3. X = 1000. ?- X #= 10**3. ERROR: Domain error: `clpfd_expression' expected, found `10**3'
B-Prolog 8.1
?- X #= 10^3. X #= 10^3. *** error(illegal_array_access,10^3) ?- X #= 10**3. X = 1000.
SICStus Prolog 4.3.2
?- use_module(library(clpfd)). true. ?- X #= 10^3. ! Existence error in (^)/2 ! constraint user:wi(^)/2 does not exist ! goal: 10^3 ?- X #= 10**3. ! Existence error in user:(**)/2 ! constraint user:(**)/2 does not exist ! goal: 10**3
请提出想法/提示/建议。 我能做什么?或许使用一些clpfd兼容性层?
提前谢谢!
答案 0 :(得分:3)
快速破解救援?
警告:未来大规模的过度杀伤,但......它甚至可以工作吗?它是便携式的吗?
让我们看看吧!
SWI-Prolog 7.3.14
使用clpq
?- use_module(library(clpq)). true. ?- clpq:{X = 10^3}, integer(X). X = 1000. % <== SUCCESS!
使用clpr
?- use_module(library(clpr)). true. ?- clpr:{X = 10^3}, integer(X). false.
SICStus Prolog 4.3.2
使用clpq
?- use_module(library(clpq)). true. ?- clpq:{X = 10^3}, integer(X). false.
使用clpr
?- use_module(library(clpr)). true. ?- clpr:{X = 10^3}, integer(X). false.
1X 成功, 3X 失败......工作,嗯,有点......再说一遍,我猜它是不是。
答案 1 :(得分:0)
您可以将其用于常量表达式:
?- X is 10^3.
X = 1000.
借助corr2,哪些人应该在符合ISO要求的序言中工作。
它也会在CLP(FD)中传播,就像X#= 10 ^ 3:
?- Y #= X+1, X is 10^3.
Y = 1001
X = 1000