DNF_ss : ssfrag
|- !P Q. (!x. P x /\ Q x) <=> (!x. P x) /\ !x. Q x |- !P Q. (?x. P x \/ Q x) <=> (?x. P x) \/ ?x. Q x |- !P Q R. P \/ Q ==> R <=> (P ==> R) /\ (Q ==> R) |- !P Q R. P ==> Q /\ R <=> (P ==> Q) /\ (P ==> R) |- !A B C. (B \/ C) /\ A <=> B /\ A \/ C /\ A |- !A B C. A /\ (B \/ C) <=> A /\ B \/ A /\ C |- !P Q. (?x. P x) ==> Q <=> !x. P x ==> Q |- !P Q. P ==> (!x. Q x) <=> !x. P ==> Q x |- !P Q. (?x. P x) /\ Q <=> ?x. P x /\ Q |- !P Q. P /\ (?x. Q x) <=> ?x. P /\ Q x
> SIMP_CONV (bool_ss ++ DNF_ss) []
``!x. (?y. P x y) /\ Q z ==> R1 x z /\ R2 z x``;
<<HOL message: inventing new type variable names: 'a, 'b, 'c>>
val it =
|- (!x. (?y. P x y) /\ Q z ==> R1 x z /\ R2 z x) <=>
(!x y. P x y /\ Q z ==> R1 x z) /\
!x y. P x y /\ Q z ==> R2 z x : thm