簡體   English   中英

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.

也可以創建兩個具有相同域的變量,如下所示:

[X,Y] #:: [1..10]

如何創建兩個以整數列表為域的變量?

更具體地說,如果我有一組整數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...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM