let rec term_alpha_cv alpha t =
let do_term alpha t = term_alpha_cv alpha t in
let rec do_terms alpha l = terms_alpha_cv alpha l in
match t with
| Tconst _ -> alpha, t
| Tvar v ->
let alpha, v = apply_alpha alpha v in alpha, Tvar v
| Tapp (f, ts) ->
let alpha, ts = do_terms alpha ts in
alpha, e_app f ts
| Tgetfield(f,r) ->
let alpha, r = do_term alpha r in
alpha,e_getfield f r
|Tsetfield(f,r,v) ->
let alpha,r = do_term alpha r in
let alpha,v = do_term alpha v in
alpha, e_setfield f r v
| Taccess(t,i) ->
let alpha,t = do_term alpha t in
let alpha,i = do_term alpha i in
alpha,e_access t i
| Tupdate(t,i,v) ->
let alpha,t = do_term alpha t in
let alpha,i = do_term alpha i in
let alpha,v = do_term alpha v in
alpha, e_update t i v
| Tif (a, b, c) ->
let alpha, a = do_term alpha a in
let alpha, b = do_term alpha b in
let alpha, c = do_term alpha c in
alpha, e_if a b c
| Tlet (x, a, b) ->
let alpha, a = do_term alpha a in
let old_x, alpha = alpha_bound_var alpha x in
let alpha, b = do_term alpha b in
let alpha = alpha_unbound alpha x old_x in
alpha, e_let x a b
and terms_alpha_cv alpha l = match l with [] -> alpha, []
| t::l ->
let alpha, t = term_alpha_cv alpha t in
let alpha, l = terms_alpha_cv alpha l in
alpha, t::l