this repo has no description
at develop 1.9 kB view raw
1predicate fzn_mdd_reif(array[int] of var int: x, % variables constrained by MDD 2 int: N, % number of nodes root is node 1 3 array[int] of int: level, % level of each node root is level 1, T is level length(x)+1 4 int: E, % number of edges 5 array[int] of int: from, % edge leaving node 1..N 6 array[int] of set of int: label, % value of variable 7 array[int] of int: to, % edge entering node 0..N where 0 = T node 8 var bool: b % reification value 9 ) = 10 let { set of int: NODE = 1..N; 11 set of int: EDGE = 1..E; 12 int: L = length(x); 13 array[0..N] of var bool: bn; 14 array[EDGE] of var bool: be; 15 set of int: D = dom_array(x); } in 16 bn[0] /\ % true node is true 17 (b <-> bn[1]) /\ % root gives truth value 18 % T1 each node except the root enforces an outgoing edge 19 forall(n in NODE)(bn[n] -> exists(e in EDGE where from[e] = n)(be[e])) /\ 20 % T23 each edge enforces its endpoints 21 forall(e in EDGE)((be[e] -> bn[from[e]]) /\ (be[e] -> bn[to[e]])) /\ 22 % T4 each edge enforces its label 23 forall(e in EDGE)(be[e] -> x[level[from[e]]] in label[e]) /\ 24 % P1 each node enforces its outgoing edges 25 forall(e in EDGE)(bn[from[e]] /\ x[level[from[e]]] in label[e] -> be[e]) /\ 26 % P2 each node except the root enforces an incoming edge 27 exists(e in EDGE where to[e] = 0)(be[e]) /\ 28 forall(n in 2..N)(bn[n] -> exists(e in EDGE where to[e] = n)(be[e])) /\ 29 % P3 each label has a support 30 forall(i in 1..L, d in D) 31 (x[i] = d -> exists(e in EDGE where level[from[e]] = i /\ d in label[e])(be[e]));