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