Added the de Morgan laws (incl quantifier versions) to basic simpset
authorpaulson
Wed, 09 Oct 1996 13:36:17 +0200
changeset 2074 30a65172e003
parent 2073 fb0655539d05
child 2075 2126029b881e
Added the de Morgan laws (incl quantifier versions) to basic simpset
src/FOL/simpdata.ML
--- a/src/FOL/simpdata.ML	Wed Oct 09 13:32:33 1996 +0200
+++ b/src/FOL/simpdata.ML	Wed Oct 09 13:36:17 1996 +0200
@@ -83,38 +83,9 @@
   | _ $ (Const("Not",_)$_)      => th RS iff_reflection_F
   | _                           => th RS iff_reflection_T;
 
-structure Induction = InductionFun(struct val spec=IFOL.spec end);
-
-open Simplifier Induction;
-
-(*Add congruence rules for = or <-> (instead of ==) *)
-infix 4 addcongs;
-fun ss addcongs congs =
-    ss addeqcongs (congs RL [eq_reflection,iff_reflection]);
-
-(*Add a simpset to a classical set!*)
-infix 4 addss;
-fun cs addss ss = cs addbefore asm_full_simp_tac ss 1;
-
 
-val IFOL_simps =
-   [refl RS P_iff_T] @ conj_simps @ disj_simps @ not_simps @ 
-    imp_simps @ iff_simps @ quant_simps;
-
-val notFalseI = int_prove_fun "~False";
-val triv_rls = [TrueI,refl,iff_refl,notFalseI];
+(*** Classical laws ***)
 
-val IFOL_ss = 
-  empty_ss 
-  setmksimps (map mk_meta_eq o atomize o gen_all)
-  setsolver  (fn prems => resolve_tac (triv_rls@prems) 
-                          ORELSE' assume_tac
-                          ORELSE' etac FalseE)
-  setsubgoaler asm_simp_tac
-  addsimps IFOL_simps
-  addcongs [imp_cong];
-
-(*Classical version...*)
 fun prove_fun s = 
  (writeln s;  
   prove_goal FOL.thy s
@@ -125,14 +96,6 @@
   cases boil down to the same thing.*) 
 val cases_simp = prove_fun "(P --> Q) & (~P --> Q) <-> Q";
 
-val cla_simps = 
-    cases_simp::
-    map prove_fun
-     ["~(P&Q)  <-> ~P | ~Q",
-      "P | ~P",             "~P | P",
-      "~ ~ P <-> P",        "(~P --> P) <-> P",
-      "(~P <-> ~Q) <-> (P<->Q)"];
-
 (*At present, miniscoping is for classical logic only.  We do NOT include
   distribution of ALL over &, or dually that of EX over |.*)
 
@@ -158,8 +121,6 @@
                  "(ALL x. P(x) --> Q) <-> (EX x.P(x)) --> Q",
                  "(ALL x. P --> Q(x)) <-> P --> (ALL x.Q(x))"];
 
-val FOL_ss = IFOL_ss addsimps (cla_simps @ ex_simps @ all_simps);
-
 fun int_prove nm thm  = qed_goal nm IFOL.thy thm
     (fn prems => [ (cut_facts_tac prems 1), 
                    (Int.fast_tac 1) ]);
@@ -220,3 +181,45 @@
 end;
 
 
+(*** Standard simpsets ***)
+
+structure Induction = InductionFun(struct val spec=IFOL.spec end);
+
+open Simplifier Induction;
+
+(*Add congruence rules for = or <-> (instead of ==) *)
+infix 4 addcongs;
+fun ss addcongs congs =
+    ss addeqcongs (congs RL [eq_reflection,iff_reflection]);
+
+(*Add a simpset to a classical set!*)
+infix 4 addss;
+fun cs addss ss = cs addbefore asm_full_simp_tac ss 1;
+
+val IFOL_simps =
+   [refl RS P_iff_T] @ conj_simps @ disj_simps @ not_simps @ 
+    imp_simps @ iff_simps @ quant_simps;
+
+val notFalseI = int_prove_fun "~False";
+val triv_rls = [TrueI,refl,iff_refl,notFalseI];
+
+val IFOL_ss = 
+  empty_ss 
+  setmksimps (map mk_meta_eq o atomize o gen_all)
+  setsolver  (fn prems => resolve_tac (triv_rls@prems) 
+                          ORELSE' assume_tac
+                          ORELSE' etac FalseE)
+  setsubgoaler asm_simp_tac
+  addsimps IFOL_simps
+  addcongs [imp_cong];
+
+val cla_simps = 
+    [de_Morgan_conj, de_Morgan_disj, not_all, not_ex, cases_simp] @
+    map prove_fun
+     ["~(P&Q)  <-> ~P | ~Q",
+      "P | ~P",             "~P | P",
+      "~ ~ P <-> P",        "(~P --> P) <-> P",
+      "(~P <-> ~Q) <-> (P<->Q)"];
+
+val FOL_ss = IFOL_ss addsimps (cla_simps @ ex_simps @ all_simps);
+