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