let rec pred global sigma = function
| Ptrue -> Ptrue
| Pfalse -> Pfalse
| Pimplies(p,q) -> p_implies (pred global sigma p) (pred global sigma q)
| Pand(p,q) -> p_and (pred global sigma p) (pred global sigma q)
| Por(p,q) -> p_or (pred global sigma p) (pred global sigma q)
| Piff(p,q) -> p_iff (pred global sigma p) (pred global sigma q)
| Pnot p -> p_not (pred global sigma p)
| Pnamed(a,p) -> p_named a (pred global sigma p)
| Pforall(x,p) -> let x,sigma = fresh global sigma x in p_forall x (pred global sigma p)
| Pexists(x,p) -> let x,sigma = fresh global sigma x in p_exists x (pred global sigma p)
| Papp(f,es) ->
let defs = ref [] in
let es = List.map (term global defs sigma) es in
flush !defs (p_app f es)
| Pif(e,p,q) ->
let defs = ref [] in
let e = term global defs sigma e in
let p = pred global sigma p in
let q = pred global sigma q in
flush !defs (p_if e p q)
| Plet(x,v,p) ->
let defs = ref [] in
let v = term global defs sigma v in
let x,sigma = fresh global sigma x in
let p = pred global sigma p in
flush ( (x,v)::!defs ) p