let rec unif_exp unif a l1 b l2 subs =
(match (a,b) with
| (Exp(a,l3),_) -> (match merge_exp l3 l1 with
| [] -> unif true a (Exp(b,l2)) subs
| l1 -> unif_exp unif a l1 b l2 subs)
| (_,Exp(b,l3)) -> (match merge_exp l3 l2 with
| [] -> unif true (Exp(a,l1)) b subs
| l2 -> unif_exp unif a l1 b l2 subs)
| (PInv(PInv(a)),b)
| (a,PInv(PInv(b))) -> unif_exp unif a l1 b l2 subs
| _ -> merge (merge
(unif true a b (exp_equal unif l1 l2 subs))
(unif true a (Exp(b, merge_expinv l2 l1)) subs))
(unif true b (Exp(a, merge_expinv l1 l2)) subs))