let rec pred_alpha_cv alpha p =
let do_pred alpha p = pred_alpha_cv alpha p in
let rec do_preds alpha l = match l with [] -> alpha, l
| p::l ->
let alpha, p = do_pred alpha p in
let alpha, l = do_preds alpha l in
alpha, p::l
in
match p with
| Ptrue | Pfalse -> alpha, p
| Pif (t,p1,p2) ->
let alpha, t = term_alpha_cv alpha t in
let alpha, p1 = do_pred alpha p1 in
let alpha, p2 = do_pred alpha p2 in
alpha, Pif (t,p1,p2)
| Pnot p -> let alpha, p = do_pred alpha p in alpha, Pnot p
| Pforall (x,p) ->
let old_x, alpha = alpha_bound_var alpha x in
let alpha, p = do_pred alpha p in
let alpha = alpha_unbound alpha x old_x in
alpha, Pforall (x,p)
| Pexists (x,p) ->
let old_x, alpha = alpha_bound_var alpha x in
let alpha, p = do_pred alpha p in
let alpha = alpha_unbound alpha x old_x in
alpha, Pexists (x,p)
| Plet (x,t,p) ->
let alpha, t = term_alpha_cv alpha t in
let old_x, alpha = alpha_bound_var alpha x in
let alpha, p = do_pred alpha p in
let alpha = alpha_unbound alpha x old_x in
alpha, Plet (x,t,p)
| Pnamed (n,p) -> let alpha, p = do_pred alpha p in alpha, Pnamed (n,p)
| Pimplies (p1,p2) ->
let alpha, p1 = do_pred alpha p1 in
let alpha, p2 = do_pred alpha p2 in
alpha, Pimplies (p1,p2)
| Pand (p1,p2) ->
let alpha, p1 = do_pred alpha p1 in
let alpha, p2 = do_pred alpha p2 in
alpha, Pand (p1,p2)
| Por (p1,p2) ->
let alpha, p1 = do_pred alpha p1 in
let alpha, p2 = do_pred alpha p2 in
alpha, Por (p1,p2)
| Piff (p1,p2) ->
let alpha, p1 = do_pred alpha p1 in
let alpha, p2 = do_pred alpha p2 in
alpha, Piff (p1,p2)
| Papp (n,lt) ->
let alpha, lt = terms_alpha_cv alpha lt in alpha, p_app n lt