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
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, 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