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)