let rec expp sigma cpt = function
| Pimplies (p1,p2) ->
p_implies (expp sigma cpt p1)(expp sigma cpt p2)
| Pif (t,p1,p2) ->
p_if (expt sigma t)
(expp sigma cpt p1)(expp sigma cpt p2)
| Pand (p1,p2) -> p_and(expp sigma cpt p1)(expp sigma cpt p2)
| Por (p1,p2) -> p_or(expp sigma cpt p1)(expp sigma cpt p2)
| Piff (p1,p2) -> p_iff (expp sigma cpt p1)(expp sigma cpt p2)
| Pnot p -> p_not (expp sigma cpt p)
| Papp (f, tl) -> p_app f (List.map (expt sigma) tl)
| Pexists(x,p) ->
let nx,sigma = new_fname e_var x sigma cpt in
p_exists nx (expp sigma cpt p)
| Pforall (x,p) ->
let nx,sigma = new_fname e_var x sigma cpt in
p_forall nx (expp sigma cpt p)
| Plet (x,t,p) ->
let t1 = expt sigma t in
expp (Vmap.add x t1 sigma) cpt p
| Pnamed(s,p) -> Pnamed(s,expp sigma cpt p)
| p -> p