let rec term sigma = function
  | Tconst _ as c -> c
  | Tvar v -> alpha sigma v
  | Tgetfield(f,r) -> e_getfield f (term sigma r)
  | Tsetfield(f,r,v) -> e_setfield f (term sigma r) (term sigma v)
  | Taccess(t,i) -> e_access (term sigma t) (term sigma i)
  | Tupdate(t,i,v) -> e_update (term sigma t) (term sigma i) (term sigma v)
  | Tapp (n,tl) -> e_app n (List.map (term sigma) tl)
  | Tif (t1,t2,t3) -> e_if (term sigma t1) (term sigma t2) (term sigma t3)
  | Tlet (x,v,t) ->
      let v = term sigma v in
      if is_simple v && Wp_parameters.Simpl.get()
      then
        term (bind x v sigma) t
      else
        let x,sigma = fresh sigma x in
        e_let x v (term sigma t)