let build_pbword c_n nbones_c_n_u nbones_c_n_v iof_and_size_sol =
let size_c_n_u = compute_size_c_n_u c_n nbones_c_n_u iof_and_size_sol in
let size_c_n_v =
try Integer_var_map.find (Size c_n) iof_and_size_sol
with Not_found -> assert false
in
let iof_c_n j = Integer_var_map.find (Iof (c_n, j)) iof_and_size_sol in
let rec push_zero n u =
assert (n >= 0);
if n = 0 then u
else push_zero (n - 1) (false :: u)
in
let rec push_one n u =
assert (n >= 0);
if n = 0 then u
else push_one (n - 1) (true :: u)
in
let rec build curr_i j u v =
if j = 0 then
{ u = push_zero curr_i u;
v = v; }
else
let i =
try iof_c_n j
with Not_found -> curr_i
in
if j > nbones_c_n_u then
build (i - 1) (j - 1)
u (push_one 1 (push_zero (curr_i - i) v))
else
build (i - 1) (j - 1)
(push_one 1 (push_zero (curr_i - i) u)) v
in
build
(size_c_n_u + size_c_n_v) (nbones_c_n_u + nbones_c_n_v)
[] []