let rec term global defs sigma = function
  | Tconst _ as c -> c
  | Tvar v -> alpha sigma v
  | Tgetfield(f,r) -> e_getfield f (term global defs sigma r)
  | Tsetfield(f,r,v) -> e_setfield f (term global defs sigma r) (term global defs sigma v)
  | Taccess(t,i) -> e_access (term global defs sigma t) (term global defs sigma i)
  | Tupdate(t,i,v) -> e_update (term global defs sigma t) (term global defs sigma i) (term global defs sigma v)
  | Tapp (n,tl) -> e_app n (List.map (term global defs sigma) tl)
  | Tif (t1,t2,t3) -> e_if (term global defs sigma t1) (term global defs sigma t2) (term global defs sigma t3)
  | Tlet (x,v,t) ->
      let v = term global defs sigma v in
      let x,sigma = fresh global sigma x in
      defs := (x,v) :: !defs ;
      term global defs sigma t