this repo has no description
at develop 3.3 kB view raw
1%% New annotations 2annotation assume(array[int] of var bool: b); 3annotation int_priority(array[int] of var int: xs, 4 array[int] of ann: br, ann: sel); 5annotation bool_priority(array[int] of var bool: xs, 6 array[int] of ann: br, ann: sel); 7 8%% Half Reifications 9predicate int_eq_imp(var int: a, var int: b, var bool: r); 10predicate int_ne_imp(var int: a, var int: b, var bool: r); 11predicate int_le_imp(var int: a, var int: b, var bool: r); 12predicate int_lt_imp(var int: a, var int: b, var bool: r); 13 14predicate int_lin_eq_imp(array [int] of int: as, array [int] of var int: bs, 15 int: c, var bool: r); 16predicate int_lin_ne_imp(array [int] of int: as, array [int] of var int: bs, 17 int: c, var bool: r); 18predicate int_lin_le_imp(array [int] of int: as, array [int] of var int: bs, 19 int: c, var bool: r); 20 21predicate bool_eq_imp(var bool: a, var bool: b, var bool: r); 22predicate bool_ne_imp(var bool: a, var bool: b, var bool: r); 23predicate bool_le_imp(var bool: a, var bool: b, var bool: r); 24predicate bool_lt_imp(var bool: a, var bool: b, var bool: r); 25 26predicate bool_or_imp(var bool: a, var bool: b, var bool: r); 27predicate bool_and_imp(var bool: a, var bool: b, var bool: r); 28predicate bool_xor_imp(var bool: a, var bool: b, var bool: r); 29 30predicate bool_clause_imp(array [int] of var bool: as, array [int] of var bool: bs, 31 var bool: b); 32predicate array_bool_or_imp(array [int] of var bool: as, var bool: r); 33predicate array_bool_and_imp(array [int] of var bool: as, var bool: r); 34 35predicate bool_lin_eq_imp(array [int] of int: as, array [int] of var bool: bs, 36 var int: c, var bool: r); 37predicate bool_lin_le_imp(array [int] of int: as, array [int] of var bool: bs, 38 var int: c, var bool: r); 39predicate bool_lin_lt_imp(array [int] of int: as, array [int] of var bool: bs, 40 var int: c, var bool: r); 41predicate bool_lin_ne_imp(array [int] of int: as, array [int] of var bool: bs, 42 var int: c, var bool: r); 43 44%% Special cases for binary-ish x, y. 45predicate int_lin_eq_reif( 46 array [int] of int: cs, array [int] of var int: xs, int: k, var bool: r) = 47 let { var bool: a; var bool: b } in 48 (r <-> (a /\ b)) /\ int_lin_le_reif(cs, xs, k, a) 49 /\ int_lin_le_reif([-c | c in cs], xs, -k, b); 50 51predicate bool_xor(var bool: x, var bool: y, var bool: r) = 52 bool_clause([x,y],[r]) 53 /\ bool_clause([],[x,y,r]) 54 /\ bool_clause([x, r], [y]) 55 /\ bool_clause([y, r], [x]); 56 57predicate set_in_reif(var int: x, set of int: s, var bool: r) = 58 if card(s) = max(s) - min(s) + 1 then 59 r <-> (x >= min(s) /\ x <= max(s)) 60 else 61 bool_clause([x = k | k in s], [r]) /\ forall (k in s) (x = k -> r) 62 endif; 63 64predicate int_pow(var int: x, var int: y, var int: z) = 65 let { 66 array [dom(x), dom(y)] of int: A = array2d( 67 dom(x), 68 dom(y), 69 [ pow(a, b) | a in dom(x), b in dom(y) ] 70 ); 71 } in z = A[x, y]; 72 73predicate int_pow(var int: x, int: y, var int: z) = 74 if y = 0 then z = 1 75 elseif y = 1 then z = x 76 else 77 let { var int: zp ::is_defined_var ; 78 constraint int_pow(x, y div 2, zp) :: defines_var(zp); } in 79 if y mod 2 = 0 then 80 z = zp * zp 81 else 82 z = x * zp * zp 83 endif 84 endif;