fixed some weak elim rules
authorpaulson
Wed, 28 Jun 2000 10:56:34 +0200
changeset 9173 422968aeed49
parent 9172 2dbb80d4fdb7
child 9174 6ef054f33f83
fixed some weak elim rules
src/ZF/Cardinal.ML
src/ZF/Finite.ML
src/ZF/OrderArith.ML
src/ZF/OrderType.ML
src/ZF/Perm.ML
src/ZF/Univ.ML
src/ZF/WF.ML
src/ZF/func.ML
--- a/src/ZF/Cardinal.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/Cardinal.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -449,8 +449,8 @@
 by (rtac CollectI 1);
 (*Proving it's in the function space A->B*)
 by (rtac (if_type RS lam_type) 1);
-by (blast_tac (claset() addEs [apply_funtype RS consE]) 1);
-by (blast_tac (claset() addSEs [mem_irrefl] addEs [apply_funtype RS consE]) 1);
+by (blast_tac (claset() addDs [apply_funtype]) 1);
+by (blast_tac (claset() addSEs [mem_irrefl] addDs [apply_funtype]) 1);
 (*Proving it's injective*)
 by (Asm_simp_tac 1);
 by (Blast_tac 1);
@@ -481,7 +481,7 @@
 by (rtac iffI 1);
 by (asm_simp_tac (simpset() addsimps [eqpoll_refl]) 2);
 by (blast_tac (claset() addIs [nat_lepoll_imp_le, le_anti_sym] 
-                    addSEs [eqpollE]) 1);
+                        addSEs [eqpollE]) 1);
 qed "nat_eqpoll_iff";
 
 (*The object of all this work: every natural number is a (finite) cardinal*)
--- a/src/ZF/Finite.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/Finite.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -177,8 +177,7 @@
 \     <-> f : FiniteFun(A,B) & (ALL x:domain(f). P(f`x))";
 by Auto_tac;
 by (blast_tac (claset() addIs [impOfSubs FiniteFun_mono]) 1);
-by (blast_tac (claset() addDs [FiniteFun_is_fun]
-                        addEs [Pair_mem_PiE]) 1);
+by (blast_tac (claset() addDs [Pair_mem_PiD, FiniteFun_is_fun]) 1);
 by (res_inst_tac [("A1", "domain(f)")]
     (subset_refl RSN(2, FiniteFun_mono) RS subsetD) 1);
 by (fast_tac (claset() addDs
--- a/src/ZF/OrderArith.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/OrderArith.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -254,7 +254,7 @@
 \         (lam z:A. <x,z>) : ord_iso(A, r, {x}*A, rmult({x}, xr, A, r))";
 by (resolve_tac [singleton_prod_bij RS ord_isoI] 1);
 by (Asm_simp_tac 1);
-by (blast_tac (claset() addEs [well_ord_is_wf RS wf_on_not_refl RS notE]) 1);
+by (blast_tac (claset() addDs [well_ord_is_wf RS wf_on_not_refl]) 1);
 qed "singleton_prod_ord_iso";
 
 (*Here we build a complicated function term, then simplify it using
@@ -281,10 +281,8 @@
 by (resolve_tac [prod_sum_singleton_bij RS ord_isoI] 1);
 by (asm_simp_tac
     (simpset() addsimps [pred_iff, well_ord_is_wf RS wf_on_not_refl]) 1);
-by (Asm_simp_tac 1);
-by (REPEAT_FIRST (eresolve_tac [SigmaE, sumE, predE]));
-by (ALLGOALS Asm_simp_tac);
-by (ALLGOALS (blast_tac (claset() addEs [well_ord_is_wf RS wf_on_asym])));
+by (auto_tac (claset() addSEs [well_ord_is_wf RS wf_on_asym, predE], 
+	      simpset()));
 qed "prod_sum_singleton_ord_iso";
 
 (** Distributive law **)
--- a/src/ZF/OrderType.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/OrderType.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -510,14 +510,14 @@
 \     i ++ (UN x:A. j(x)) = (UN x:A. i++j(x))";
 by (blast_tac (claset() addIs prems @ [ltI, Ord_UN, Ord_oadd, 
 				       lt_oadd1 RS ltD, oadd_lt_mono2 RS ltD]
-                        addSEs [ltE, ltI RS lt_oadd_disj RS disjE]) 1);
+                        addSEs [ltE] addSDs [ltI RS lt_oadd_disj]) 1);
 qed "oadd_UN";
 
 Goal "[| Ord(i);  Limit(j) |] ==> i++j = (UN k:j. i++k)";
 by (forward_tac [Limit_has_0 RS ltD] 1);
 by (asm_simp_tac (simpset() addsimps [Limit_is_Ord RS Ord_in_Ord,
-                                  oadd_UN RS sym, Union_eq_UN RS sym, 
-                                  Limit_Union_eq]) 1);
+				      oadd_UN RS sym, Union_eq_UN RS sym, 
+				      Limit_Union_eq]) 1);
 qed "oadd_Limit";
 
 (** Order/monotonicity properties of ordinal addition **)
--- a/src/ZF/Perm.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/Perm.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -57,8 +57,7 @@
 (*Good for dealing with sets of pairs, but a bit ugly in use [used in AC]*)
 Goalw [inj_def]
     "[| <a,b>:f;  <c,b>:f;  f: inj(A,B) |] ==> a=c";
-by (REPEAT (eresolve_tac [asm_rl, Pair_mem_PiE, CollectE] 1));
-by (Blast_tac 1);
+by (blast_tac (claset() addDs [Pair_mem_PiD]) 1);
 qed "inj_equality";
 
 Goalw [inj_def] "[| f:inj(A,B);  a:A;  b:A;  f`a=f`b |] ==> a=b";
--- a/src/ZF/Univ.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/Univ.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -193,9 +193,10 @@
 qed "Limit_VfromI";
 
 val prems = Goal
-    "[| a: Vfrom(A,i);  Limit(i);               \
+    "[| a: Vfrom(A,i);  ~R ==> Limit(i);               \
 \       !!x. [| x<i;  a: Vfrom(A,x) |] ==> R    \
 \    |] ==> R";
+by (rtac classical 1);
 by (rtac (Limit_Vfrom_eq RS equalityD1 RS subsetD RS UN_E) 1);
 by (REPEAT (ares_tac (prems @ [ltI, Limit_is_Ord]) 1));
 qed "Limit_VfromE";
@@ -209,8 +210,8 @@
 by (etac (limiti RS Limit_has_succ) 1);
 qed "singleton_in_VLimit";
 
-val Vfrom_UnI1 = Un_upper1 RS (subset_refl RS Vfrom_mono RS subsetD)
-and Vfrom_UnI2 = Un_upper2 RS (subset_refl RS Vfrom_mono RS subsetD);
+bind_thm ("Vfrom_UnI1", Un_upper1 RS (subset_refl RS Vfrom_mono RS subsetD));
+bind_thm ("Vfrom_UnI2", Un_upper2 RS (subset_refl RS Vfrom_mono RS subsetD));
 
 (*Hard work is finding a single j:i such that {a,b}<=Vfrom(A,j)*)
 val [aprem,bprem,limiti] = goal Univ.thy
@@ -403,7 +404,7 @@
 
 Goal "[| a: Vfrom(A,i);  Limit(i);  Transset(A) |] ==> Pow(a) : Vfrom(A,i)";
 by (blast_tac (claset() addEs [Limit_VfromE]
-		        addIs [Limit_has_succ, Pow_in_Vfrom, Limit_VfromI]) 1);
+	                addIs [Limit_has_succ, Pow_in_Vfrom, Limit_VfromI]) 1);
 qed "Pow_in_VLimit";
 
 
--- a/src/ZF/WF.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/WF.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -17,8 +17,6 @@
 a mess.
 *)
 
-open WF;
-
 
 (*** Well-founded relations ***)
 
@@ -159,15 +157,9 @@
 by (Blast_tac 1);
 qed_spec_mp "wf_on_not_sym";
 
-(* [| wf[A](r);  <a,b> : r;  a:A;  b:A;  ~P ==> <b,a> : r |] ==> P *)
-bind_thm ("wf_on_asym", wf_on_not_sym RS swap);
-
-val prems =
-Goal "[| wf[A](r);  <a,b>:r;  ~P ==> <b,a>:r;  a:A;  b:A |] ==> P";
-by (rtac ccontr 1);
-by (rtac (wf_on_not_sym RS notE) 1);
-by (DEPTH_SOLVE (ares_tac prems 1));
-qed "wf_on_asym";
+(* [| wf[A](r); ~Z ==> <a,b> : r;
+      <b,a> ~: r ==> Z; ~Z ==> a : A; ~Z ==> b : A |] ==> Z *)
+bind_thm ("wf_on_asym", permute_prems 1 2 (cla_make_elim wf_on_not_sym));
 
 (*Needed to prove well_ordI.  Could also reason that wf[A](r) means
   wf(r Int A*A);  thus wf( (r Int A*A)^+ ) and use wf_not_refl *)
--- a/src/ZF/func.ML	Wed Jun 28 10:56:01 2000 +0200
+++ b/src/ZF/func.ML	Wed Jun 28 10:56:34 2000 +0200
@@ -142,14 +142,9 @@
 by (assume_tac 1);
 qed "range_type";
 
-val prems = Goal
-    "[| <a,b>: f;  f: Pi(A,B);       \
-\       [| a:A;  b:B(a);  f`a = b |] ==> P  \
-\    |] ==> P";
-by (cut_facts_tac prems 1);
-by (resolve_tac prems 1);
-by (REPEAT (eresolve_tac [asm_rl,domain_type,range_type,apply_equality] 1));
-qed "Pair_mem_PiE";
+Goal "[| <a,b>: f;  f: Pi(A,B) |] ==> a:A & b:B(a) & f`a = b";
+by (blast_tac (claset() addIs [domain_type, range_type, apply_equality]) 1);
+qed "Pair_mem_PiD";
 
 (*** Lambda Abstraction ***)