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