let exp_equal unif l1 l2 subs =
  let rec tri tas1 tas2 = function
    | (t,Pos)::fin -> tri (t::tas1) tas2 fin
    | (t,Neg)::fin -> tri tas1 (t::tas2) fin
    | [] -> (tas1,tas2)  in
  let lg,lr = tri [] [] l1  in
  let lr,lg = tri lr lg l2  in
  let rec comb lref subs lst = 
    if subs = [] then []
    else match lst with
    | t::fin -> 
        let rec f lsubs lref_tas = function
          | tt::lref_fin -> f (merge lsubs (comb (merge lref_fin lref_tas) (unif true t tt subs) fin))
                (tt::lref_tas) lref_fin
          | [] -> lsubs
        in f [] [] lref
    | [] -> if lref = [] then subs else []
  in comb lg subs lr