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))   (* a bit redundant... *)
          (unif true a (Exp(b, merge_expinv l2 l1)) subs))
          (unif true b (Exp(a, merge_expinv l1 l2)) subs))