let rec unlet_term sigma bvars defs = function
  | Tlet(x,t1,t2) -> 
      let fvars = free_vars (Vset.add x bvars) Vset.empty t2 in
      let args = x::(Vset.elements fvars) in 
      let t2' = unlet_term sigma (Vset.add x bvars) defs t2 in 
      let f = mk_def  args t2' defs in 
      e_app f 
        ((unlet_term sigma bvars defs t1)::
           (List.map (fun x -> e_var x) args))
  | Tapp(f,tl) -> 
      e_app f  (List.map (fun t -> unlet_term sigma bvars defs t) tl)
  | Tif (c,tt,tf) -> 
      e_if (unlet_term sigma bvars defs c)
          (unlet_term sigma bvars defs tt)
          (unlet_term sigma bvars defs tf)
  | Tvar x -> e_var (try Vmap.find x sigma with Not_found -> x) 
  | t -> t