let rec expt sigma = function
| Tlet(x,t1,t2) ->
let t1 = expt sigma t1 in
expt (Vmap.add x t1 sigma) t2
| Tapp(f,tl) ->
e_app f (List.map (expt sigma) tl)
| Tif (c,ta,tb) ->
e_if (expt sigma c)(expt sigma ta)(expt sigma tb)
| Tconst _ as c -> c
| Taccess(t,i) -> e_access(expt sigma t) (expt sigma i)
| Tupdate(t,i,v) -> e_update(expt sigma t) (expt sigma i) (expt sigma v)
| Tgetfield(f,r) -> e_getfield f (expt sigma r)
| Tsetfield(f,r,v) -> e_setfield f (expt sigma r) (expt sigma v)
| Tvar x as t ->
begin
try Vmap.find x sigma
with Not_found -> t
end