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)
    [] []