let rec term_alpha_cv do_data alpha t =
  let do_term alpha t = term_alpha_cv do_data alpha t in
  let rec do_terms alpha l = terms_alpha_cv do_data alpha l in
    match t with
      | Tconst _ -> alpha, t
      | Tvar v -> 
          let alpha, v = apply_alpha alpha v in alpha, Tvar v
      | Tdata d -> let alpha, d = do_data alpha d in alpha, Tdata d
      | Tapp (f, ts) -> 
          let alpha, ts = do_terms alpha ts in
            alpha, Tapp(f, ts)
      | 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, Tif (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, Tlet (x, a, b)
and terms_alpha_cv do_data alpha l = match l with [] -> alpha, []
    | t::l -> 
        let alpha, t = term_alpha_cv do_data alpha t in
        let alpha, l = terms_alpha_cv do_data alpha l in
          alpha, t::l