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