let rec free_term xs = function
  | Tconst _ -> xs
  | Tvar x -> Vset.add x xs
  | Tapp(_,ts) -> List.fold_left free_term xs ts
  | Tgetfield(_,t) -> free_term xs t
  | Tsetfield(_,t,t') | Taccess(t,t') -> free_term (free_term xs t) t'
  | Tupdate(t1,t2,t3) | Tif(t1,t2,t3) -> free_term (free_term (free_term xs t1) t2) t3
  | Tlet(x,a,b) ->
      if Vset.mem x xs then
        free_term (free_term xs b) a
      else
        free_term (Vset.remove x (free_term xs b)) a