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