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