Если groups
является буквальным -как в вашем вопросе-, тогда вы можете использовать набор и список понимания , описанных на стр. 22 из этого руководства - для достижения вашей цели .
например,
set of int: DOM = 1..5;
set of int: population = DOM;
array[1..2] of set of DOM: groups = [{1, 3}, {2, 5}];
% array initialization
array [int] of var DOM: in_array =
[i | i in DOM where exists(g in groups) (i in g)];
array [int] of var DOM: out_array =
[i | i in DOM where not exists(g in groups) (i in g)];
% set initialization
var set of DOM: in_set =
{i | i in DOM where exists(g in groups) (i in g)};
var set of DOM: out_set =
{i | i in DOM where not exists(g in groups) (i in g)};
solve satisfy;
output [
"in_set=", show(in_set), "\n",
"out_set=", show(out_set), "\n",
"in_array=", show(in_array), "\n",
"out_array=", show(out_array), "\n"
];
примечание: var
можно исключить из определения всех переменных, здесь я использую его только потому, что в противном случае flatzinc
не распечатал бы их содержимое в стандартном выводе.
Результат:
~$ mzn2fzn example.mzn ; flatzinc example.fzn
in_array = array1d(1..4, [1, 2, 3, 5]);
in_set = {1, 2, 3, 5};
out_array = array1d(1..1, [4]);
out_set = {4};
----------
Вот сгенерированная промежуточная flatzinc
модель:
array [1..2] of set of int: groups = [{1, 3}, {2, 5}];
array [1..4] of var 1..5: in_array :: output_array([1..4]) = [1, 2, 3, 5];
var set of 1..5: in_set :: output_var = {1, 2, 3, 5};
array [1..1] of var 4..4: out_array :: output_array([1..1]) = [4];
var set of 1..5: out_set :: output_var = 4..4;
solve satisfy;
27.10.2017