let rec p_unfold env = function
  | Plet(x,t,p) ->
      let t0 = e_unfold env t in
      if is_zone t0
      then p_unfold (Env.add x t0 env) p
      else p_let x t0 (p_unfold (Env.remove x env) p)
  | Pnamed(a,p) -> Pnamed(a,p_unfold env p)
  | (Ptrue | Pfalseas p -> p
  | Papp(f,es) -> p_app f (List.map (e_unfold env) es)
  | Pimplies(p,q) -> p_implies (p_unfold env p) (p_unfold env q)
  | Pif(c,p,q) -> p_if (e_unfold env c) (p_unfold env p) (p_unfold env q)
  | Pand(p,q) -> p_and (p_unfold env p) (p_unfold env q)
  | Por(p,q) -> p_or (p_unfold env p) (p_unfold env q)
  | Piff(p,q) -> p_iff (p_unfold env p) (p_unfold env q)
  | Pnot p -> p_not (p_unfold env p)
  | Pforall(x,p) -> p_forall x (p_unfold env p)
  | Pexists(x,p) -> p_exists x (p_unfold env p)