ECLiPSe Prolog - библиотека IC: списки целых чисел как переменных - PullRequest
0 голосов
/ 05 мая 2018

В библиотеке ic можно создать переменную с доменом, например:

X #:: [1..10] % Variable X with domain the integers from  1 to 10.

Также возможно создать 2 переменные с одним и тем же доменом, например:

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

Как я могу создать 2 переменные, которые имеют в качестве домена список целых чисел?

Более конкретно, если у меня есть набор целых чисел S, как я могу сделать две переменные, каждая из которых имеет подмножество (P1, P2) из ​​S, чтобы гарантировать, что P1 и P2 не имеют общих элементов и что P1 + P2 = S

1 Ответ

0 голосов
/ 05 мая 2018

Вы можете использовать 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...
...