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 (* a doesn't see x *)
          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 (* restore old_x *)
            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