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)