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