ECLiPSe Prolog - IC库:整数列表作为变量

时间:2018-05-05 15:16:17

标签: prolog clpfd

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

1 个答案:

答案 0 :(得分:2)

您可以这样使用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...