src/ZF/Ordinal.ML
changeset 5321 f8848433d240
parent 5147 825877190618
child 5465 cc95f12ab64f
equal deleted inserted replaced
5320:79b326bceafb 5321:f8848433d240
     1 (*  Title:      ZF/Ordinal.thy
     1 (*  Title:      ZF/Ordinal.thy
     2     ID:         $Id$
     2     ID:         $Id$
     3     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
     3     Author:     Lawrence C Paulson, Cambridge University Computer Laboratory
     4     Copyright   1993  University of Cambridge
     4     Copyright   1993  University of Cambridge
     5 
     5 
     6 For Ordinal.thy.  Ordinals in Zermelo-Fraenkel Set Theory 
     6 Ordinals in Zermelo-Fraenkel Set Theory 
     7 *)
     7 *)
     8 
     8 
     9 open Ordinal;
     9 open Ordinal;
    10 
    10 
    11 (*** Rules for Transset ***)
    11 (*** Rules for Transset ***)
    71 
    71 
    72 Goalw [Transset_def] "Transset(A) ==> Transset(Union(A))";
    72 Goalw [Transset_def] "Transset(A) ==> Transset(Union(A))";
    73 by (Blast_tac 1);
    73 by (Blast_tac 1);
    74 qed "Transset_Union";
    74 qed "Transset_Union";
    75 
    75 
    76 val [Transprem] = goalw Ordinal.thy [Transset_def]
    76 val [Transprem] = Goalw [Transset_def]
    77     "[| !!i. i:A ==> Transset(i) |] ==> Transset(Union(A))";
    77     "[| !!i. i:A ==> Transset(i) |] ==> Transset(Union(A))";
    78 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1);
    78 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1);
    79 qed "Transset_Union_family";
    79 qed "Transset_Union_family";
    80 
    80 
    81 val [prem,Transprem] = goalw Ordinal.thy [Transset_def]
    81 val [prem,Transprem] = Goalw [Transset_def]
    82     "[| j:A;  !!i. i:A ==> Transset(i) |] ==> Transset(Inter(A))";
    82     "[| j:A;  !!i. i:A ==> Transset(i) |] ==> Transset(Inter(A))";
    83 by (cut_facts_tac [prem] 1);
    83 by (cut_facts_tac [prem] 1);
    84 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1);
    84 by (blast_tac (claset() addDs [Transprem RS bspec RS subsetD]) 1);
    85 qed "Transset_Inter_family";
    85 qed "Transset_Inter_family";
    86 
    86 
    87 (*** Natural Deduction rules for Ord ***)
    87 (*** Natural Deduction rules for Ord ***)
    88 
    88 
    89 val prems = goalw Ordinal.thy [Ord_def]
    89 val prems = Goalw [Ord_def]
    90     "[| Transset(i);  !!x. x:i ==> Transset(x) |]  ==>  Ord(i)";
    90     "[| Transset(i);  !!x. x:i ==> Transset(x) |]  ==>  Ord(i)";
    91 by (REPEAT (ares_tac (prems@[ballI,conjI]) 1));
    91 by (REPEAT (ares_tac (prems@[ballI,conjI]) 1));
    92 qed "OrdI";
    92 qed "OrdI";
    93 
    93 
    94 val [major] = goalw Ordinal.thy [Ord_def]
    94 Goalw [Ord_def] "Ord(i) ==> Transset(i)";
    95     "Ord(i) ==> Transset(i)";
    95 by (Blast_tac 1);
    96 by (rtac (major RS conjunct1) 1);
       
    97 qed "Ord_is_Transset";
    96 qed "Ord_is_Transset";
    98 
    97 
    99 val [major,minor] = goalw Ordinal.thy [Ord_def]
    98 Goalw [Ord_def]
   100     "[| Ord(i);  j:i |] ==> Transset(j) ";
    99     "[| Ord(i);  j:i |] ==> Transset(j) ";
   101 by (rtac (minor RS (major RS conjunct2 RS bspec)) 1);
   100 by (Blast_tac 1);
   102 qed "Ord_contains_Transset";
   101 qed "Ord_contains_Transset";
   103 
   102 
   104 (*** Lemmas for ordinals ***)
   103 (*** Lemmas for ordinals ***)
   105 
   104 
   106 Goalw [Ord_def,Transset_def] "[| Ord(i);  j:i |] ==> Ord(j)";
   105 Goalw [Ord_def,Transset_def] "[| Ord(i);  j:i |] ==> Ord(j)";
   157 
   156 
   158 Goalw [Ord_def] "[| Ord(i); Ord(j) |] ==> Ord(i Int j)";
   157 Goalw [Ord_def] "[| Ord(i); Ord(j) |] ==> Ord(i Int j)";
   159 by (blast_tac (claset() addSIs [Transset_Int]) 1);
   158 by (blast_tac (claset() addSIs [Transset_Int]) 1);
   160 qed "Ord_Int";
   159 qed "Ord_Int";
   161 
   160 
   162 val nonempty::prems = goal Ordinal.thy
   161 val nonempty::prems = Goal
   163     "[| j:A;  !!i. i:A ==> Ord(i) |] ==> Ord(Inter(A))";
   162     "[| j:A;  !!i. i:A ==> Ord(i) |] ==> Ord(Inter(A))";
   164 by (rtac (nonempty RS Transset_Inter_family RS OrdI) 1);
   163 by (rtac (nonempty RS Transset_Inter_family RS OrdI) 1);
   165 by (rtac Ord_is_Transset 1);
   164 by (rtac Ord_is_Transset 1);
   166 by (REPEAT (ares_tac ([Ord_contains_Transset,nonempty]@prems) 1
   165 by (REPEAT (ares_tac ([Ord_contains_Transset,nonempty]@prems) 1
   167      ORELSE etac InterD 1));
   166      ORELSE etac InterD 1));
   168 qed "Ord_Inter";
   167 qed "Ord_Inter";
   169 
   168 
   170 val jmemA::prems = goal Ordinal.thy
   169 val jmemA::prems = Goal
   171     "[| j:A;  !!x. x:A ==> Ord(B(x)) |] ==> Ord(INT x:A. B(x))";
   170     "[| j:A;  !!x. x:A ==> Ord(B(x)) |] ==> Ord(INT x:A. B(x))";
   172 by (rtac (jmemA RS RepFunI RS Ord_Inter) 1);
   171 by (rtac (jmemA RS RepFunI RS Ord_Inter) 1);
   173 by (etac RepFunE 1);
   172 by (etac RepFunE 1);
   174 by (etac ssubst 1);
   173 by (etac ssubst 1);
   175 by (eresolve_tac prems 1);
   174 by (eresolve_tac prems 1);
   192 
   191 
   193 Goalw [lt_def] "[| i:j;  Ord(j) |] ==> i<j";
   192 Goalw [lt_def] "[| i:j;  Ord(j) |] ==> i<j";
   194 by (REPEAT (ares_tac [conjI] 1));
   193 by (REPEAT (ares_tac [conjI] 1));
   195 qed "ltI";
   194 qed "ltI";
   196 
   195 
   197 val major::prems = goalw Ordinal.thy [lt_def]
   196 val major::prems = Goalw [lt_def]
   198     "[| i<j;  [| i:j;  Ord(i);  Ord(j) |] ==> P |] ==> P";
   197     "[| i<j;  [| i:j;  Ord(i);  Ord(j) |] ==> P |] ==> P";
   199 by (rtac (major RS conjE) 1);
   198 by (rtac (major RS conjE) 1);
   200 by (REPEAT (ares_tac (prems@[Ord_in_Ord]) 1));
   199 by (REPEAT (ares_tac (prems@[Ord_in_Ord]) 1));
   201 qed "ltE";
   200 qed "ltE";
   202 
   201 
   256 by (asm_simp_tac (simpset() addsimps [le_iff]) 1);
   255 by (asm_simp_tac (simpset() addsimps [le_iff]) 1);
   257 qed "le_eqI";
   256 qed "le_eqI";
   258 
   257 
   259 val le_refl = refl RS le_eqI;
   258 val le_refl = refl RS le_eqI;
   260 
   259 
   261 val [prem] = goal Ordinal.thy "(~ (i=j & Ord(j)) ==> i<j) ==> i le j";
   260 val [prem] = Goal "(~ (i=j & Ord(j)) ==> i<j) ==> i le j";
   262 by (rtac (disjCI RS (le_iff RS iffD2)) 1);
   261 by (rtac (disjCI RS (le_iff RS iffD2)) 1);
   263 by (etac prem 1);
   262 by (etac prem 1);
   264 qed "leCI";
   263 qed "leCI";
   265 
   264 
   266 val major::prems = goal Ordinal.thy
   265 val major::prems = Goal
   267     "[| i le j;  i<j ==> P;  [| i=j;  Ord(j) |] ==> P |] ==> P";
   266     "[| i le j;  i<j ==> P;  [| i=j;  Ord(j) |] ==> P |] ==> P";
   268 by (rtac (major RS (le_iff RS iffD1 RS disjE)) 1);
   267 by (rtac (major RS (le_iff RS iffD1 RS disjE)) 1);
   269 by (DEPTH_SOLVE (ares_tac prems 1 ORELSE etac conjE 1));
   268 by (DEPTH_SOLVE (ares_tac prems 1 ORELSE etac conjE 1));
   270 qed "leE";
   269 qed "leE";
   271 
   270 
   296 
   295 
   297 Goal "[| a: b;  a: A;  b: A |] ==> <a,b> : Memrel(A)";
   296 Goal "[| a: b;  a: A;  b: A |] ==> <a,b> : Memrel(A)";
   298 by (REPEAT (ares_tac [conjI, Memrel_iff RS iffD2] 1));
   297 by (REPEAT (ares_tac [conjI, Memrel_iff RS iffD2] 1));
   299 qed "MemrelI";
   298 qed "MemrelI";
   300 
   299 
   301 val [major,minor] = goal Ordinal.thy
   300 val [major,minor] = Goal
   302     "[| <a,b> : Memrel(A);  \
   301     "[| <a,b> : Memrel(A);  \
   303 \       [| a: A;  b: A;  a:b |]  ==> P \
   302 \       [| a: A;  b: A;  a:b |]  ==> P \
   304 \    |]  ==> P";
   303 \    |]  ==> P";
   305 by (rtac (major RS (Memrel_iff RS iffD1) RS conjE) 1);
   304 by (rtac (major RS (Memrel_iff RS iffD1) RS conjE) 1);
   306 by (etac conjE 1);
   305 by (etac conjE 1);
   355 
   354 
   356 
   355 
   357 (*** Transfinite induction ***)
   356 (*** Transfinite induction ***)
   358 
   357 
   359 (*Epsilon induction over a transitive set*)
   358 (*Epsilon induction over a transitive set*)
   360 val major::prems = goalw Ordinal.thy [Transset_def]
   359 val major::prems = Goalw [Transset_def]
   361     "[| i: k;  Transset(k);                          \
   360     "[| i: k;  Transset(k);                          \
   362 \       !!x.[| x: k;  ALL y:x. P(y) |] ==> P(x) \
   361 \       !!x.[| x: k;  ALL y:x. P(y) |] ==> P(x) \
   363 \    |]  ==>  P(i)";
   362 \    |]  ==>  P(i)";
   364 by (rtac (major RS (wf_Memrel RS wf_induct2)) 1);
   363 by (rtac (major RS (wf_Memrel RS wf_induct2)) 1);
   365 by (Blast_tac 1);
   364 by (Blast_tac 1);
   371 
   370 
   372 (*Induction over an ordinal*)
   371 (*Induction over an ordinal*)
   373 val Ord_induct = Ord_is_Transset RSN (2, Transset_induct);
   372 val Ord_induct = Ord_is_Transset RSN (2, Transset_induct);
   374 
   373 
   375 (*Induction over the class of ordinals -- a useful corollary of Ord_induct*)
   374 (*Induction over the class of ordinals -- a useful corollary of Ord_induct*)
   376 val [major,indhyp] = goal Ordinal.thy
   375 val [major,indhyp] = Goal
   377     "[| Ord(i); \
   376     "[| Ord(i); \
   378 \       !!x.[| Ord(x);  ALL y:x. P(y) |] ==> P(x) \
   377 \       !!x.[| Ord(x);  ALL y:x. P(y) |] ==> P(x) \
   379 \    |]  ==>  P(i)";
   378 \    |]  ==>  P(i)";
   380 by (rtac (major RS Ord_succ RS (succI1 RS Ord_induct)) 1);
   379 by (rtac (major RS Ord_succ RS (succI1 RS Ord_induct)) 1);
   381 by (rtac indhyp 1);
   380 by (rtac indhyp 1);
   395 (*Finds contradictions for the following proof*)
   394 (*Finds contradictions for the following proof*)
   396 val Ord_trans_tac = EVERY' [etac notE, etac Ord_trans, REPEAT o atac];
   395 val Ord_trans_tac = EVERY' [etac notE, etac Ord_trans, REPEAT o atac];
   397 
   396 
   398 (** Proving that < is a linear ordering on the ordinals **)
   397 (** Proving that < is a linear ordering on the ordinals **)
   399 
   398 
   400 val prems = goal Ordinal.thy
   399 Goal "Ord(i) ==> (ALL j. Ord(j) --> i:j | i=j | j:i)";
   401     "Ord(i) ==> (ALL j. Ord(j) --> i:j | i=j | j:i)";
   400 by (etac trans_induct 1);
   402 by (trans_ind_tac "i" prems 1);
       
   403 by (rtac (impI RS allI) 1);
   401 by (rtac (impI RS allI) 1);
   404 by (trans_ind_tac "j" [] 1);
   402 by (trans_ind_tac "j" [] 1);
   405 by (DEPTH_SOLVE (Step_tac 1 ORELSE Ord_trans_tac 1));
   403 by (DEPTH_SOLVE (Step_tac 1 ORELSE Ord_trans_tac 1));
   406 qed_spec_mp "Ord_linear";
   404 qed_spec_mp "Ord_linear";
   407 
   405 
   408 (*The trichotomy law for ordinals!*)
   406 (*The trichotomy law for ordinals!*)
   409 val ordi::ordj::prems = goalw Ordinal.thy [lt_def]
   407 val ordi::ordj::prems = Goalw [lt_def]
   410     "[| Ord(i);  Ord(j);  i<j ==> P;  i=j ==> P;  j<i ==> P |] ==> P";
   408     "[| Ord(i);  Ord(j);  i<j ==> P;  i=j ==> P;  j<i ==> P |] ==> P";
   411 by (rtac ([ordi,ordj] MRS Ord_linear RS disjE) 1);
   409 by (rtac ([ordi,ordj] MRS Ord_linear RS disjE) 1);
   412 by (etac disjE 2);
   410 by (etac disjE 2);
   413 by (DEPTH_SOLVE (ares_tac ([ordi,ordj,conjI] @ prems) 1));
   411 by (DEPTH_SOLVE (ares_tac ([ordi,ordj,conjI] @ prems) 1));
   414 qed "Ord_linear_lt";
   412 qed "Ord_linear_lt";
   415 
   413 
   416 val prems = goal Ordinal.thy
   414 val prems = Goal
   417     "[| Ord(i);  Ord(j);  i<j ==> P;  j le i ==> P |]  ==> P";
   415     "[| Ord(i);  Ord(j);  i<j ==> P;  j le i ==> P |]  ==> P";
   418 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1);
   416 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1);
   419 by (DEPTH_SOLVE (ares_tac ([leI, sym RS le_eqI] @ prems) 1));
   417 by (DEPTH_SOLVE (ares_tac ([leI, sym RS le_eqI] @ prems) 1));
   420 qed "Ord_linear2";
   418 qed "Ord_linear2";
   421 
   419 
   422 val prems = goal Ordinal.thy
   420 val prems = Goal
   423     "[| Ord(i);  Ord(j);  i le j ==> P;  j le i ==> P |]  ==> P";
   421     "[| Ord(i);  Ord(j);  i le j ==> P;  j le i ==> P |]  ==> P";
   424 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1);
   422 by (res_inst_tac [("i","i"),("j","j")] Ord_linear_lt 1);
   425 by (DEPTH_SOLVE (ares_tac ([leI,le_eqI] @ prems) 1));
   423 by (DEPTH_SOLVE (ares_tac ([leI,le_eqI] @ prems) 1));
   426 qed "Ord_linear_le";
   424 qed "Ord_linear_le";
   427 
   425 
   487 by (simp_tac (simpset() addsimps [le_iff]) 1);
   485 by (simp_tac (simpset() addsimps [le_iff]) 1);
   488 by (blast_tac (claset() addIs [Ord_succ] addDs [Ord_succD]) 1);
   486 by (blast_tac (claset() addIs [Ord_succ] addDs [Ord_succD]) 1);
   489 qed "le_succ_iff";
   487 qed "le_succ_iff";
   490 
   488 
   491 (*Just a variant of subset_imp_le*)
   489 (*Just a variant of subset_imp_le*)
   492 val [ordi,ordj,minor] = goal Ordinal.thy
   490 val [ordi,ordj,minor] = Goal
   493     "[| Ord(i);  Ord(j);  !!x. x<j ==> x<i |] ==> j le i";
   491     "[| Ord(i);  Ord(j);  !!x. x<j ==> x<i |] ==> j le i";
   494 by (REPEAT_FIRST (ares_tac [notI RS not_lt_imp_le, ordi, ordj]));
   492 by (REPEAT_FIRST (ares_tac [notI RS not_lt_imp_le, ordi, ordj]));
   495 by (etac (minor RS lt_irrefl) 1);
   493 by (etac (minor RS lt_irrefl) 1);
   496 qed "all_lt_imp_le";
   494 qed "all_lt_imp_le";
   497 
   495 
   579 (*FIXME: the Intersection duals are missing!*)
   577 (*FIXME: the Intersection duals are missing!*)
   580 
   578 
   581 
   579 
   582 (*** Results about limits ***)
   580 (*** Results about limits ***)
   583 
   581 
   584 val prems = goal Ordinal.thy "[| !!i. i:A ==> Ord(i) |] ==> Ord(Union(A))";
   582 val prems = Goal "[| !!i. i:A ==> Ord(i) |] ==> Ord(Union(A))";
   585 by (rtac (Ord_is_Transset RS Transset_Union_family RS OrdI) 1);
   583 by (rtac (Ord_is_Transset RS Transset_Union_family RS OrdI) 1);
   586 by (REPEAT (etac UnionE 1 ORELSE ares_tac ([Ord_contains_Transset]@prems) 1));
   584 by (REPEAT (etac UnionE 1 ORELSE ares_tac ([Ord_contains_Transset]@prems) 1));
   587 qed "Ord_Union";
   585 qed "Ord_Union";
   588 
   586 
   589 val prems = goal Ordinal.thy
   587 val prems = Goal
   590     "[| !!x. x:A ==> Ord(B(x)) |] ==> Ord(UN x:A. B(x))";
   588     "[| !!x. x:A ==> Ord(B(x)) |] ==> Ord(UN x:A. B(x))";
   591 by (rtac Ord_Union 1);
   589 by (rtac Ord_Union 1);
   592 by (etac RepFunE 1);
   590 by (etac RepFunE 1);
   593 by (etac ssubst 1);
   591 by (etac ssubst 1);
   594 by (eresolve_tac prems 1);
   592 by (eresolve_tac prems 1);
   595 qed "Ord_UN";
   593 qed "Ord_UN";
   596 
   594 
   597 (* No < version; consider (UN i:nat.i)=nat *)
   595 (* No < version; consider (UN i:nat.i)=nat *)
   598 val [ordi,limit] = goal Ordinal.thy
   596 val [ordi,limit] = Goal
   599     "[| Ord(i);  !!x. x:A ==> b(x) le i |] ==> (UN x:A. b(x)) le i";
   597     "[| Ord(i);  !!x. x:A ==> b(x) le i |] ==> (UN x:A. b(x)) le i";
   600 by (rtac (le_imp_subset RS UN_least RS subset_imp_le) 1);
   598 by (rtac (le_imp_subset RS UN_least RS subset_imp_le) 1);
   601 by (REPEAT (ares_tac [ordi, Ord_UN, limit] 1 ORELSE etac (limit RS ltE) 1));
   599 by (REPEAT (ares_tac [ordi, Ord_UN, limit] 1 ORELSE etac (limit RS ltE) 1));
   602 qed "UN_least_le";
   600 qed "UN_least_le";
   603 
   601 
   604 val [jlti,limit] = goal Ordinal.thy
   602 val [jlti,limit] = Goal
   605     "[| j<i;  !!x. x:A ==> b(x)<j |] ==> (UN x:A. succ(b(x))) < i";
   603     "[| j<i;  !!x. x:A ==> b(x)<j |] ==> (UN x:A. succ(b(x))) < i";
   606 by (rtac (jlti RS ltE) 1);
   604 by (rtac (jlti RS ltE) 1);
   607 by (rtac (UN_least_le RS lt_trans2) 1);
   605 by (rtac (UN_least_le RS lt_trans2) 1);
   608 by (REPEAT (ares_tac [jlti, succ_leI, limit] 1));
   606 by (REPEAT (ares_tac [jlti, succ_leI, limit] 1));
   609 qed "UN_succ_least_lt";
   607 qed "UN_succ_least_lt";
   610 
   608 
   611 val prems = goal Ordinal.thy
   609 val prems = Goal
   612     "[| a: A;  i le b(a);  !!x. x:A ==> Ord(b(x)) |] ==> i le (UN x:A. b(x))";
   610     "[| a: A;  i le b(a);  !!x. x:A ==> Ord(b(x)) |] ==> i le (UN x:A. b(x))";
   613 by (resolve_tac (prems RL [ltE]) 1);
   611 by (resolve_tac (prems RL [ltE]) 1);
   614 by (rtac (le_imp_subset RS subset_trans RS subset_imp_le) 1);
   612 by (rtac (le_imp_subset RS subset_trans RS subset_imp_le) 1);
   615 by (REPEAT (ares_tac (prems @ [UN_upper, Ord_UN]) 1));
   613 by (REPEAT (ares_tac (prems @ [UN_upper, Ord_UN]) 1));
   616 qed "UN_upper_le";
   614 qed "UN_upper_le";
   617 
   615 
   618 val [leprem] = goal Ordinal.thy
   616 val [leprem] = Goal
   619     "[| !!x. x:A ==> c(x) le d(x) |] ==> (UN x:A. c(x)) le (UN x:A. d(x))";
   617     "[| !!x. x:A ==> c(x) le d(x) |] ==> (UN x:A. c(x)) le (UN x:A. d(x))";
   620 by (rtac UN_least_le 1);
   618 by (rtac UN_least_le 1);
   621 by (rtac UN_upper_le 2);
   619 by (rtac UN_upper_le 2);
   622 by (REPEAT (ares_tac [leprem] 2));
   620 by (REPEAT (ares_tac [leprem] 2));
   623 by (rtac Ord_UN 1);
   621 by (rtac Ord_UN 1);
   677 Goal "Ord(i) ==> i=0 | (EX j. Ord(j) & i=succ(j)) | Limit(i)";
   675 Goal "Ord(i) ==> i=0 | (EX j. Ord(j) & i=succ(j)) | Limit(i)";
   678 by (blast_tac (claset() addSIs [non_succ_LimitI, Ord_0_lt]
   676 by (blast_tac (claset() addSIs [non_succ_LimitI, Ord_0_lt]
   679                       addSDs [Ord_succD]) 1);
   677                       addSDs [Ord_succD]) 1);
   680 qed "Ord_cases_disj";
   678 qed "Ord_cases_disj";
   681 
   679 
   682 val major::prems = goal Ordinal.thy
   680 val major::prems = Goal
   683     "[| Ord(i);                 \
   681     "[| Ord(i);                 \
   684 \       i=0                          ==> P;     \
   682 \       i=0                          ==> P;     \
   685 \       !!j. [| Ord(j); i=succ(j) |] ==> P;     \
   683 \       !!j. [| Ord(j); i=succ(j) |] ==> P;     \
   686 \       Limit(i)                     ==> P      \
   684 \       Limit(i)                     ==> P      \
   687 \    |] ==> P";
   685 \    |] ==> P";
   688 by (cut_facts_tac [major RS Ord_cases_disj] 1);
   686 by (cut_facts_tac [major RS Ord_cases_disj] 1);
   689 by (REPEAT (eresolve_tac (prems@[asm_rl, disjE, exE, conjE]) 1));
   687 by (REPEAT (eresolve_tac (prems@[asm_rl, disjE, exE, conjE]) 1));
   690 qed "Ord_cases";
   688 qed "Ord_cases";
   691 
   689 
   692 val major::prems = goal Ordinal.thy
   690 val major::prems = Goal
   693      "[| Ord(i);                \
   691      "[| Ord(i);                \
   694 \        P(0);                  \
   692 \        P(0);                  \
   695 \        !!x. [| Ord(x);  P(x) |] ==> P(succ(x));       \
   693 \        !!x. [| Ord(x);  P(x) |] ==> P(succ(x));       \
   696 \        !!x. [| Limit(x);  ALL y:x. P(y) |] ==> P(x)   \
   694 \        !!x. [| Limit(x);  ALL y:x. P(y) |] ==> P(x)   \
   697 \     |] ==> P(i)";
   695 \     |] ==> P(i)";