Prolog CLP (FD) Количество элементов в результате - PullRequest
0 голосов
/ 05 апреля 2019

Я сейчас решаю задачу планирования, и я немного застрял в том, как описать количество или количество определенных элементов в результате.

Например, результатом является список чисел между1..7 и я хочу, по крайней мере, увидеть или лучше определить ограничения на счетчик 1 с в результате, 2 с, 3 с и т. Д.

Я пробовал некоторые решения, подобные этому:

schedule(D1_D1,D1_D2,D1_N1,D1_N2,D1_A0,D2_D1,D2_D2,D2_N1,D2_N2,D2_A0,D3_D1,D3_D2,D3_N1,D3_N2,D3_A0,D4_D1,D4_D2,D4_N1,D4_N2,D4_A0,D5_D1,D5_D2,D5_N1,D5_N2,D5_A0,D6_D1,D6_D2,D6_N1,D6_N2,D6_A0,D7_D1,D7_D2,D7_N1,D7_N2,D7_A0,SUM_1, SUM_2, SUM_3, SUM_4, SUM_5, SUM_6) :-
Vars = [D1_D1,D1_D2,D1_N1,D1_N2,D1_A0,D2_D1,D2_D2,D2_N1,D2_N2,D2_A0,D3_D1,D3_D2,D3_N1,D3_N2,D3_A0,D4_D1,D4_D2,D4_N1,D4_N2,D4_A0,D5_D1,D5_D2,D5_N1,D5_N2,D5_A0,D6_D1,D6_D2,D6_N1,D6_N2,D6_A0,D7_D1,D7_D2,D7_N1,D7_N2,D7_A0],
Vars ins 1..6,
Sums = [SUM_1, SUM_2, SUM_3, SUM_4, SUM_5, SUM_6],
Sums ins 1..7,
all_distinct([D1_D1,D1_D2,D1_N1,D1_N2,D1_A0]),
all_distinct([D2_D1,D2_D2,D2_N1,D2_N2,D2_A0]),
all_distinct([D3_D1,D3_D2,D3_N1,D3_N2,D3_A0]),
all_distinct([D4_D1,D4_D2,D4_N1,D4_N2,D4_A0]),
all_distinct([D5_D1,D5_D2,D5_N1,D5_N2,D5_A0]),
all_distinct([D6_D1,D6_D2,D6_N1,D6_N2,D6_A0]),
all_distinct([D7_D1,D7_D2,D7_N1,D7_N2,D7_A0]),

include(=(1),Vars,I1),length(I1, SUM_1),
include(=(2),Vars,I2),length(I2, SUM_2),
include(=(3),Vars,I3),length(I3, SUM_3),
include(=(4),Vars,I4),length(I4, SUM_4),
include(=(5),Vars,I5),length(I5, SUM_5),
include(=(6),Vars,I6),length(I6, SUM_6),
append(Vars,Sums,Res),
label(Res).

Я определяю некоторые перестановки чисел, используя all_distinct, и позже я хочу увидеть (получить значение SUM_N) счетчик определенного числа в списке результатов (VARS).

Но в SWI Prolog я получаю:

?- schedule(D1_D1,D1_D2,D1_N1,D1_N2,D1_A0,D2_D1,D2_D2,D2_N1,D2_N2,D2_A0,D3_D1,D3_D2,D3_N1,D3_N2,D3_A0,D4_D1,D4_D2,D4_N1,D4_N2,D4_A0,D5_D1,D5_D2,D5_N1,D5_N2,D5_A0,D6_D1,D6_D2,D6_N1,D6_N2,D6_A0,D7_D1,D7_D2,D7_N1,D7_N2,D7_A0,SUM_1, SUM_2, SUM_3, SUM_4, SUM_5, SUM_6).
   false.

Но, очевидно, есть некоторые решения, соответствующие критериям.Если я уберу «ограничения», подсчитывающие вхождения чисел, я получу все подходящие перестановки.Поэтому я думаю, что include (..), length (..) каким-то образом ограничивают результат, но я не понимаю, почему, поскольку результат указывает на свободную переменную.

...