let rec free_vars bvars fvars = function
| Tlet(x,t1,t2) ->
let f1 = free_vars bvars fvars t1 in
free_vars (Vset.add x bvars) f1 t2
| Tapp(_f,tl) ->
(List.fold_left (fun f t -> free_vars bvars f t) fvars tl)
| Tif (c,tt,tf) ->
let fc = free_vars bvars fvars c in
let ftt = free_vars bvars fc tt in
free_vars bvars ftt tf
| Tvar x ->
if Vset.mem x bvars then fvars else (Vset.add x fvars)
| _ -> fvars