Uses minimal simpset (min_ss) and full_simp_tac
authorpaulson
Mon, 15 Jul 1996 14:54:37 +0200
changeset 1861 505b104f675a
parent 1860 71bfeecfa96c
child 1862 74d4ae2f6fc3
Uses minimal simpset (min_ss) and full_simp_tac instead of asm_full_simp_tac to prevent excessive simplification, which can cause proofs to fail
src/HOL/indrule.ML
--- a/src/HOL/indrule.ML	Mon Jul 15 12:36:56 1996 +0200
+++ b/src/HOL/indrule.ML	Mon Jul 15 14:54:37 1996 +0200
@@ -81,6 +81,15 @@
 val _ = seq (writeln o Sign.string_of_term sign) ind_prems;
 *)
 
+(*We use a MINIMAL simpset because others (such as HOL_ss) contain too many
+  simplifications.  If the premises get simplified, then the proofs will 
+  fail.  This arose with a premise of the form {(F n,G n)|n . True}, which
+  expanded to something containing ...&True. *)
+val min_ss = empty_ss
+      setmksimps (mksimps mksimps_pairs)
+      setsolver (fn prems => resolve_tac (TrueI::refl::prems) ORELSE' atac
+                             ORELSE' etac FalseE);
+
 val quant_induct = 
     prove_goalw_cterm part_rec_defs 
       (cterm_of sign 
@@ -90,7 +99,7 @@
       (fn prems =>
        [rtac (impI RS allI) 1,
         DETERM (etac Intr_elim.raw_induct 1),
-        asm_full_simp_tac (HOL_ss addsimps [Part_Collect]) 1,
+        full_simp_tac (min_ss addsimps [Part_Collect]) 1,
         REPEAT (FIRSTGOAL (eresolve_tac [IntE, CollectE, exE, conjE, disjE] 
                            ORELSE' hyp_subst_tac)),
         ind_tac (rev prems) (length prems)])
@@ -156,8 +165,7 @@
 
 (*Simplification largely reduces the mutual induction rule to the 
   standard rule*)
-val mut_ss = simpset_of "Fun"
-             addsimps [Inl_Inr_eq, Inr_Inl_eq, Inl_eq, Inr_eq, split];
+val mut_ss = min_ss addsimps [Inl_Inr_eq, Inr_Inl_eq, Inl_eq, Inr_eq, split];
 
 val all_defs = [split RS eq_reflection] @ Inductive.con_defs @ part_rec_defs;