let rec merge_exp tas = function
  | (t,si)::suite ->
      let e = (t, exp_inverse si) in
      let rec g pile = function
        | e2::suite -> if e = e2 then merge suite pile else g (e2::pile) suite
        | [] -> (t,si)::(List.rev tas)
      in merge_exp (g [] tas) suite
  | [] -> tas