this repo has no description
at develop 2.3 kB view raw
1include "redefs_lin_halfreifs.mzn"; 2 3% SIMPLE BOOLEAN LOGIC 4% TODO: why not check "is_fixed(r)" everywhere?? 5 6predicate bool_eq_imp(var bool: p, var bool: q, var bool: r) = 7 if is_fixed(r) then 8 if fix(r) then p = q else true endif 9 else 10 let { 11 var int: x = bool2int(p), 12 var int: y = bool2int(q), 13 var int: z = bool2int(r) 14 } in x + z <= y + 1 /\ y + z <= x + 1 15 endif; 16 17predicate bool_ne_imp(var bool: p, var bool: q, var bool: r) = 18 bool_xor_imp(p, q, r); 19 20predicate bool_le_imp(var bool: p, var bool: q, var bool: r) = 21 let { 22 var int: x = bool2int(p), 23 var int: y = bool2int(q), 24 var int: z = bool2int(r), 25 } in 1 - x + y >= z; 26 27predicate bool_lt_imp(var bool: p, var bool: q, var bool: r) = 28 bool_and_imp(not p, q, r); 29 30predicate bool_or_imp(var bool: p, var bool: q, var bool: r) = 31 array_bool_or_imp([p,q], r); 32 33predicate bool_and_imp(var bool: p, var bool: q, var bool: r) = 34 array_bool_and_imp([p,q],r); 35 36predicate bool_xor_imp(var bool: p, var bool: q, var bool: r) = 37 let { 38 var int: x = bool2int(p), 39 var int: y = bool2int(q), 40 var int: z = bool2int(r), 41 } in x + y >= z /\ x + y + z <= 2; 42 43% BOOLEAN ARRAY OPERATIONS 44predicate array_bool_or_imp(array[int] of var bool: a, var bool: b) = 45 if forall( i in index_set( a ) )( is_fixed(a[i]) /\ not fix(a[i]) ) then 46 not b 47 elseif exists( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then 48 true 49 else 50 let { 51 array[index_set(a)] of var bool: a1; 52 var int: x = bool2int(b), 53 } in forall(i in index_set(a)) (a1[i] -> a[i]) /\ sum(a1) = x 54 endif; 55 56predicate array_bool_and_imp(array[int] of var bool: a, var bool: b) = 57 if is_fixed(b) then 58 if fix(b) then 59 forall(i in index_set(a))( a[i] ) 60 else 61 true 62 endif 63 elseif forall( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then 64 true 65 else 66 let { 67 var int: x = bool2int(b), 68 array[index_set(a)] of var int: c = 69 array1d(index_set(a), [ bool2int(a[i] ) | i in index_set(a) ]) 70 } in forall(i in index_set(c)) ( c[i] >= x ) 71 endif; 72 73%% No var int d, sorry TODO: why not??? 74predicate bool_lin_eq_imp(array[int] of int: c, array[int] of var bool: x, 75 int: d, var bool: b) = 76 aux_int_eq_if_1(sum(i in index_set(x))( c[i]*bool2int(x[i]) ), d, bool2int(b));