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