predicate all_different_int(array [int] of var int: x);
predicate count(array [int] of var int: x, var int: y, var int: c);
predicate fixed_cumulative(array [int] of var int: s, array [int] of int: d, array [int] of int: r, int: b);
predicate global_cardinality(array [int] of var int: x, array [int] of int: cover, array [int] of var int: counts);
predicate maximum_int(var int: m, array [int] of var int: x);
predicate minimum_int(var int: m, array [int] of var int: x);
predicate sliding_sum(int: low, int: up, int: seq, array [int] of var int: vs);
predicate sort(array [int] of var int: x, array [int] of var int: y);
predicate table_bool(array [int] of var bool: x, array [int, int] of bool: t);
predicate table_int(array [int] of var int: x, array [int, int] of int: t);
predicate var_cumulative(array [int] of var int: s, array [int] of int: d, array [int] of int: r, var int: b);
array [1..48] of int: words = [2, 1, 11, 5, 15, 14, 24, 23, 5, 3, 8, 15, 15, 21, 1, 12, 7, 9, 17, 4, 18, 13, 20, 7, 10, 20, 13, 16, 19, 15, 17, 14, 12, 20, 3, 11, 21, 9, 14, 24, 12, 20, 18, 8, 22, 17, 1, 16];
array [1..24] of var 1..4: dice :: output_array([1..24]);
constraint all_different_int([dice[2], dice[1], dice[11], dice[5]]);
constraint all_different_int([dice[5], dice[3], dice[8], dice[15]]);
constraint all_different_int([dice[7], dice[9], dice[17], dice[4]]);
constraint all_different_int([dice[10], dice[20], dice[13], dice[16]]);
constraint all_different_int([dice[12], dice[20], dice[3], dice[11]]);
constraint all_different_int([dice[12], dice[20], dice[18], dice[8]]);
constraint all_different_int([dice[15], dice[14], dice[24], dice[23]]);
constraint all_different_int([dice[15], dice[21], dice[1], dice[12]]);
constraint all_different_int([dice[18], dice[13], dice[20], dice[7]]);
constraint all_different_int([dice[19], dice[15], dice[17], dice[14]]);
constraint all_different_int([dice[21], dice[9], dice[14], dice[24]]);
constraint all_different_int([dice[22], dice[17], dice[1], dice[16]]);
constraint global_cardinality(dice, [1, 2, 3, 4], [6, 6, 6, 6]);
solve satisfy;
