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