let rec pred_alpha_cv do_data alpha p = 
  let do_pred alpha p = pred_alpha_cv do_data 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 do_data 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 do_data 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 do_data alpha lt in alpha, Papp (n,lt)