let choose_theory (std : 'a list) (xor : 'a list) (uncertain : ('a * 'a) list)
  : ('a list * 'a list) list =

  let rec choose_theory_rec tas (l1,l2) = function
    | (n,m)::tail ->
        let tas2 = choose_theory_rec tas  (n::l1, m::l2) tail in
        let tas3 = choose_theory_rec tas2 (m::l1, n::l2) tail in
        tas3
    | [] -> (l1,l2)::tas
  in
  choose_theory_rec [] (std, xor) uncertain