let rec dispatch = function
  | Ptrue -> Bag.empty
  | Papp"included" , [a;b] ) -> included a b
  | (Pfalse|Por _|Piff _|Papp _) as p -> Bag.elt p
  | Pand(p,q) -> Bag.concat (dispatch p) (dispatch q)
  | Pimplies(h,p) -> Bag.map (fun p -> p_implies h p) (dispatch p)
  | Pif(c,p,q) -> 
      Bag.concat
        (Bag.map (fun p -> p_implies (p_eq c e_true) p) (dispatch p))
        (Bag.map (fun q -> p_implies (p_eq c e_false) q) (dispatch q))
  | Pnamed(a,p) ->
      Bag.map (fun p -> Pnamed(a,p)) (dispatch p)
  | Pnot p ->
      Bag.map p_not (dispatch p)
  | Pforall(x,p) ->
      Bag.map (p_forall x) (dispatch p)
  | Pexists(x,p) ->
      Bag.map (p_exists x) (dispatch p)
  | Plet(x,t,p) ->
      Bag.map (p_let x t) (dispatch p)