this repo has no description
at develop 2.2 kB view raw
1%-----------------------------------------------------------------------------% 2% Domain encodings 3%-----------------------------------------------------------------------------% 4 5% Linear equality encoding 6 7 % Single variable: x = d <-> x_eq_d[d] 8predicate equality_encoding(var int: x, array[int] of var 0..1: x_eq_d) = 9 x in index_set(x_eq_d) 10 /\ 11 sum(d in dom(x))( x_eq_d[d] ) = 1 12 /\ 13 sum(d in dom(x))( d * x_eq_d[d] ) = x; 14 15 % Array of variables: x[i] = d <-> x_eq_d[i,d] 16predicate equality_encoding(array[int] of var int: x, 17 array[int, int] of var 0..1: x_eq_d) = 18 forall(i in index_set(x))( 19 x[i] in index_set_2of2(x_eq_d) 20 /\ 21 sum(d in index_set_2of2(x_eq_d))( x_eq_d[i,d] ) = 1 22 /\ 23 sum(d in index_set_2of2(x_eq_d))( d * x_eq_d[i,d] ) = x[i] 24 ); 25 26function var int: eq_new_var(var int: x, int: i) = 27 if i in dom(x) then 28 let { 29 var 0..1: xi; 30 } in xi 31 else 0 endif; 32 33function array[int] of var 0..1: eq_encode(var int: x) ::promise_total = 34 let { 35 array[int] of var 0..1: y = array1d(lb(x)..ub(x),[eq_new_var(x,i) | i in lb(x)..ub(x)]); 36 constraint equality_encoding(x,y); 37 } in y; 38 39function array[int] of int: eq_encode(int: x) ::promise_total = 40 array1d(lb(x)..ub(x),[ if i=x then 1 else 0 endif | i in lb(x)..ub(x)]); 41 42function array[int,int] of var int: eq_encode(array[int] of var int: x) ::promise_total = 43 let { 44 array[index_set(x),lb_array(x)..ub_array(x)] of var 0..1: y = 45 array2d(index_set(x),lb_array(x)..ub_array(x), 46 [ let { 47 array[int] of var int: xi = eq_encode(x[i]) 48 } in if j in index_set(xi) then xi[j] else 0 endif 49 | i in index_set(x), j in lb_array(x)..ub_array(x)] 50 ) 51 } in y; 52 53function array[int,int] of int: eq_encode(array[int] of int: x) ::promise_total = 54 array2d(index_set(x),lb_array(x)..ub_array(x),[ if j=x[i] then 1 else 0 endif | i in index_set(x), j in lb_array(x)..ub_array(x)]); 55 56%-----------------------------------------------------------------------------% 57%-----------------------------------------------------------------------------%