ECLiPSe Prolog - IC 库:作为变量的整数列表
ECLiPSe Prolog - IC library: Lists of integers as variables
在 ic 库中,可以像这样创建一个具有域的变量:
X #:: [1..10] % Variable X with domain the integers from 1 to 10.
也可以像这样创建具有相同域的 2 个变量:
[X,Y] #:: [1..10]
如何创建 2 个具有整数列表域的变量?
更具体地说,如果我有一组整数 S,我如何创建两个变量,每个变量都有 S 的一个子集 (P1, P2),以确保 P1 和 P2 没有公共元素,并且 P1 + P2 = S?
您可以这样使用lib(ic_sets)
:
:- lib(ic).
:- lib(ic_sets).
test(X,Y):-
LT = [1,2,3,4,5,6,7],
LA in_set_range []..LT,
LB in_set_range []..LT,
length(LT,N),
#(LA /\ LB,0),
#(LA \/ LB,N),
insetdomain(LA,_,_,_),
insetdomain(LB,_,_,_),
X #:: LA,
Y #:: LB.
LT
是包含您想要的整数的列表(它不必是连续整数的列表)。 in_set_range
设置两个列表的域。然后 #(LA /\ LB,0)
约束两个集合之间的交集为空(没有公共元素)并且 #(LA \/ LB,N)
约束两个集合的并集具有起始列表的长度 N
(即数字LA
域中的元素数 + LB
域中的元素数必须为 N
)。 insetdomain/4
实例化集合,X #:: LA
设置 X
的域。
?- test(X, Y).
X = X{1 .. 6}
Y = 7
Yes (0.00s cpu, solution 1, maybe more)
X = X{[1 .. 5, 7]}
Y = 6
Yes (0.00s cpu, solution 2, maybe more)
X = X{1 .. 5}
Y = Y{[6, 7]}
Yes (0.00s cpu, solution 3, maybe more)
and so on...
在 ic 库中,可以像这样创建一个具有域的变量:
X #:: [1..10] % Variable X with domain the integers from 1 to 10.
也可以像这样创建具有相同域的 2 个变量:
[X,Y] #:: [1..10]
如何创建 2 个具有整数列表域的变量?
更具体地说,如果我有一组整数 S,我如何创建两个变量,每个变量都有 S 的一个子集 (P1, P2),以确保 P1 和 P2 没有公共元素,并且 P1 + P2 = S?
您可以这样使用lib(ic_sets)
:
:- lib(ic).
:- lib(ic_sets).
test(X,Y):-
LT = [1,2,3,4,5,6,7],
LA in_set_range []..LT,
LB in_set_range []..LT,
length(LT,N),
#(LA /\ LB,0),
#(LA \/ LB,N),
insetdomain(LA,_,_,_),
insetdomain(LB,_,_,_),
X #:: LA,
Y #:: LB.
LT
是包含您想要的整数的列表(它不必是连续整数的列表)。 in_set_range
设置两个列表的域。然后 #(LA /\ LB,0)
约束两个集合之间的交集为空(没有公共元素)并且 #(LA \/ LB,N)
约束两个集合的并集具有起始列表的长度 N
(即数字LA
域中的元素数 + LB
域中的元素数必须为 N
)。 insetdomain/4
实例化集合,X #:: LA
设置 X
的域。
?- test(X, Y).
X = X{1 .. 6}
Y = 7
Yes (0.00s cpu, solution 1, maybe more)
X = X{[1 .. 5, 7]}
Y = 6
Yes (0.00s cpu, solution 2, maybe more)
X = X{1 .. 5}
Y = Y{[6, 7]}
Yes (0.00s cpu, solution 3, maybe more)
and so on...