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