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 | Pfalse) as 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)