git-subtree-dir: software/mza git-subtree-split: f970a59b177c13ca3dd8aaef8cc6681d83b7e813
77 lines
2.3 KiB
MiniZinc
77 lines
2.3 KiB
MiniZinc
include "redefs_lin_halfreifs.mzn";
|
|
|
|
% SIMPLE BOOLEAN LOGIC
|
|
% TODO: why not check "is_fixed(r)" everywhere??
|
|
|
|
predicate bool_eq_imp(var bool: p, var bool: q, var bool: r) =
|
|
if is_fixed(r) then
|
|
if fix(r) then p = q else true endif
|
|
else
|
|
let {
|
|
var int: x = bool2int(p),
|
|
var int: y = bool2int(q),
|
|
var int: z = bool2int(r)
|
|
} in x + z <= y + 1 /\ y + z <= x + 1
|
|
endif;
|
|
|
|
predicate bool_ne_imp(var bool: p, var bool: q, var bool: r) =
|
|
bool_xor_imp(p, q, r);
|
|
|
|
predicate bool_le_imp(var bool: p, var bool: q, var bool: r) =
|
|
let {
|
|
var int: x = bool2int(p),
|
|
var int: y = bool2int(q),
|
|
var int: z = bool2int(r),
|
|
} in 1 - x + y >= z;
|
|
|
|
predicate bool_lt_imp(var bool: p, var bool: q, var bool: r) =
|
|
bool_and_imp(not p, q, r);
|
|
|
|
predicate bool_or_imp(var bool: p, var bool: q, var bool: r) =
|
|
array_bool_or_imp([p,q], r);
|
|
|
|
predicate bool_and_imp(var bool: p, var bool: q, var bool: r) =
|
|
array_bool_and_imp([p,q],r);
|
|
|
|
predicate bool_xor_imp(var bool: p, var bool: q, var bool: r) =
|
|
let {
|
|
var int: x = bool2int(p),
|
|
var int: y = bool2int(q),
|
|
var int: z = bool2int(r),
|
|
} in x + y >= z /\ x + y + z <= 2;
|
|
|
|
% BOOLEAN ARRAY OPERATIONS
|
|
predicate array_bool_or_imp(array[int] of var bool: a, var bool: b) =
|
|
if forall( i in index_set( a ) )( is_fixed(a[i]) /\ not fix(a[i]) ) then
|
|
not b
|
|
elseif exists( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then
|
|
true
|
|
else
|
|
let {
|
|
array[index_set(a)] of var bool: a1;
|
|
var int: x = bool2int(b),
|
|
} in forall(i in index_set(a)) (a1[i] -> a[i]) /\ sum(a1) = x
|
|
endif;
|
|
|
|
predicate array_bool_and_imp(array[int] of var bool: a, var bool: b) =
|
|
if is_fixed(b) then
|
|
if fix(b) then
|
|
forall(i in index_set(a))( a[i] )
|
|
else
|
|
true
|
|
endif
|
|
elseif forall( i in index_set( a ) )( is_fixed(a[i]) /\ fix(a[i]) ) then
|
|
true
|
|
else
|
|
let {
|
|
var int: x = bool2int(b),
|
|
array[index_set(a)] of var int: c =
|
|
array1d(index_set(a), [ bool2int(a[i] ) | i in index_set(a) ])
|
|
} in forall(i in index_set(c)) ( c[i] >= x )
|
|
endif;
|
|
|
|
%% No var int d, sorry TODO: why not???
|
|
predicate bool_lin_eq_imp(array[int] of int: c, array[int] of var bool: x,
|
|
int: d, var bool: b) =
|
|
aux_int_eq_if_1(sum(i in index_set(x))( c[i]*bool2int(x[i]) ), d, bool2int(b));
|