1% 2% Main authors: 3% Guido Tack <tack@gecode.org> 4% 5% Copyright: 6% Guido Tack, 2007 7% 8% This file is part of Gecode, the generic constraint 9% development environment: 10% http://www.gecode.org 11% 12% Permission is hereby granted, free of charge, to any person obtaining 13% a copy of this software and associated documentation files (the 14% "Software"), to deal in the Software without restriction, including 15% without limitation the rights to use, copy, modify, merge, publish, 16% distribute, sublicense, and/or sell copies of the Software, and to 17% permit persons to whom the Software is furnished to do so, subject to 18% the following conditions: 19% 20% The above copyright notice and this permission notice shall be 21% included in all copies or substantial portions of the Software. 22% 23% THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 24% EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 25% MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 26% NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 27% LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 28% OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 29% WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 30% 31% 32 33% Sums over Boolean variables 34predicate bool_lin_eq(array[int] of int: a, array[int] of var bool: x, 35 var int: c); 36predicate bool_lin_ne(array[int] of int: a, array[int] of var bool: x, 37 var int: c); 38predicate bool_lin_le(array[int] of int: a, array[int] of var bool: x, 39 var int: c); 40predicate bool_lin_lt(array[int] of int: a, array[int] of var bool: x, 41 var int: c); 42predicate bool_lin_ge(array[int] of int: a, array[int] of var bool: x, 43 var int: c); 44predicate bool_lin_gt(array[int] of int: a, array[int] of var bool: x, 45 var int: c); 46 47predicate bool_sum_eq(array[int] of var bool: x, var int: c) = 48 bool_lin_eq([1 | i in index_set(x)],x,c); 49predicate bool_sum_ne(array[int] of var bool: x, var int: c) = 50 bool_lin_ne([1 | i in index_set(x)],x,c); 51predicate bool_sum_le(array[int] of var bool: x, var int: c) = 52 bool_lin_le([1 | i in index_set(x)],x,c); 53predicate bool_sum_lt(array[int] of var bool: x, var int: c) = 54 bool_lin_lt([1 | i in index_set(x)],x,c); 55predicate bool_sum_ge(array[int] of var bool: x, var int: c) = 56 bool_lin_ge([1 | i in index_set(x)],x,c); 57predicate bool_sum_gt(array[int] of var bool: x, var int: c) = 58 bool_lin_gt([1 | i in index_set(x)],x,c); 59 60predicate float_sinh(var float: a, var float: b) = 61 b == (exp(a)-exp(-a))/2.0; 62 63predicate float_cosh(var float: a, var float: b) = 64 b == (exp(a)+exp(-a))/2.0; 65 66predicate float_tanh(var float: a, var float: b) = 67 let { var float: e2a = exp(2.0*a) } in 68 b == (e2a-1.0)/(e2a+1.0); 69 70predicate float_ne_reif(var float: a, var float: b, var bool: c) = 71 not c <-> a==b; 72 73predicate array_float_element(var int: b, array[int] of float: as, var float: c) = 74 b in index_set(as) /\ 75 forall(d in index_set(as))( b = d -> as[d] = c ); 76 77predicate array_var_float_element(var int: b, array[int] of var float: as, var float: c) = 78 b in index_set(as) /\ 79 forall(d in index_set(as))( b = d -> as[d] = c ); 80 81predicate gecode_int_pow(var int: x, int: y, var int: z); 82 83predicate int_pow(var int: x, var int: y, var int: z) = 84 if is_fixed(y) then gecode_int_pow(x,fix(y),z) 85 else let { 86 array[lb(y)..ub(y)] of var int: pow_x = array1d(lb(y)..ub(y), 87 [if y=i then x else 0 endif | i in lb(y)..ub(y)]); 88 array[lb(y)..ub(y)] of var int: pow_table = array1d(lb(y)..ub(y), 89 [pow(pow_x[i],i) | i in lb(y)..ub(y)]); 90 } in z=pow_table[y] 91 endif; 92 93predicate array_bool_and_imp(array [int] of var bool: as, var bool: r); 94predicate array_bool_or_imp(array [int] of var bool: as, var bool: r); 95predicate array_bool_xor_imp(array [int] of var bool: as, var bool: r); 96 97predicate bool_and_imp(var bool: a, var bool: b, var bool: r); 98predicate bool_clause_imp(array [int] of var bool: as, 99 array [int] of var bool: bs, var bool: r); 100predicate bool_ge_imp(var bool: a, var bool: b, var bool: r); 101predicate bool_gt_imp(var bool: a, var bool: b, var bool: r); 102predicate bool_le_imp(var bool: a, var bool: b, var bool: r); 103predicate bool_lt_imp(var bool: a, var bool: b, var bool: r); 104predicate bool_ne_imp(var bool: a, var bool: b, var bool: r); 105predicate bool_ne_imp(var bool: a, var bool: b, var bool: r); 106predicate bool_or_imp(var bool: a, var bool: b, var bool: r); 107predicate bool_xor_imp(var bool: a, var bool: b, var bool: r); 108 109predicate bool_lin_eq_imp(array [int] of int: as, array [int] of var bool: bs, 110 var int: c, var bool: r); 111predicate bool_lin_ge_imp(array [int] of int: as, array [int] of var bool: bs, 112 var int: c, var bool: r); 113predicate bool_lin_gt_imp(array [int] of int: as, array [int] of var bool: bs, 114 var int: c, var bool: r); 115predicate bool_lin_le_imp(array [int] of int: as, array [int] of var bool: bs, 116 var int: c, var bool: r); 117predicate bool_lin_lt_imp(array [int] of int: as, array [int] of var bool: bs, 118 var int: c, var bool: r); 119predicate bool_lin_ne_imp(array [int] of int: as, array [int] of var bool: bs, 120 var int: c, var bool: r); 121 122predicate int_eq_imp(var int: a, var int: b, var bool: r); 123predicate int_ge_imp(var int: a, var int: b, var bool: r); 124predicate int_gt_imp(var int: a, var int: b, var bool: r); 125predicate int_le_imp(var int: a, var int: b, var bool: r); 126predicate int_lt_imp(var int: a, var int: b, var bool: r); 127predicate int_ne_imp(var int: a, var int: b, var bool: r); 128 129predicate int_lin_eq_imp(array [int] of int: as, array [int] of var int: bs, 130 int: c, var bool: r); 131predicate int_lin_ge_imp(array [int] of int: as, array [int] of var int: bs, 132 int: c, var bool: r); 133predicate int_lin_gt_imp(array [int] of int: as, array [int] of var int: bs, 134 int: c, var bool: r); 135predicate int_lin_le_imp(array [int] of int: as, array [int] of var int: bs, 136 int: c, var bool: r); 137predicate int_lin_lt_imp(array [int] of int: as, array [int] of var int: bs, 138 int: c, var bool: r); 139predicate int_lin_ne_imp(array [int] of int: as, array [int] of var int: bs, 140 int: c, var bool: r); 141 142predicate set_in_imp(var int: x, set of int: S, var bool: r); 143