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