let rec ccpred sigma cpt p = 
  let env = init_env() in 
  let p =  ccp sigma env cpt p in 
  flush env p 

and ccp sigma env cpt = function 
  | Pimplies (p1,p2) -> 
      let e1 = init_env () in
      let h1 = ccp sigma e1 cpt p1 in
      if Vset.is_empty e1.foralls then
        ( env.eqs <- p_and env.eqs (p_and e1.eqs h1) ; ccp sigma env cpt p2 )
      else
        p_implies (flush e1 h1) (ccpred sigma cpt p2)

  | Pif (t,p1,p2) ->
      p_if (cct sigma env cpt t) (ccpred sigma cpt p1)(ccpred sigma cpt p2)
  | Pand (p1,p2) -> p_and(ccpred sigma cpt p1)(ccpred sigma cpt p2)
  | Por (p1,p2) -> p_or(ccpred sigma cpt p1)(ccpred sigma cpt p2)
  | Piff (p1,p2) -> p_iff (ccpred sigma cpt p1)(ccpred sigma cpt p2)
  | Pnot p -> p_not (ccpred sigma cpt p)
  | Papp (f, tl) -> Papp(f,List.map (cct sigma env cpt) tl)

  | Pexists(x,p) -> 
      let nx,sigma = new_name x sigma cpt in 
      Pexists(nx,ccpred sigma cpt p)

  | Pforall (x,p) -> 
      let nx,sigma = new_name x sigma cpt in 
      env.foralls <- Vset.add nx env.foralls; 
      ccp sigma env cpt p 

  | Plet (x,t,p) ->
      let t1 = cct sigma env cpt t in 
      let nx,sigma =  new_name x sigma cpt in
      env.foralls <- Vset.add nx env.foralls;
      env.eqs <- p_and env.eqs (p_eq (e_var nx) t1) ;
      ccp sigma env cpt p

  | Pnamed(s,p) -> Pnamed(s,ccp sigma env cpt p)
  | Pfalse -> Pfalse
  | Ptrue -> Ptrue