src/ZF/AC/WO6_WO1.thy
author wenzelm
Sun, 30 Sep 2007 21:55:15 +0200
changeset 24783 5a3e336a2e37
parent 16417 9bc16273c2d4
child 24893 b8ef7afe3a6b
permissions -rw-r--r--
avoid internal names;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     1
(*  Title:      ZF/AC/WO6_WO1.thy
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
     2
    ID:         $Id$
1478
2b8c2a7547ab expanded tabs
clasohm
parents: 1401
diff changeset
     3
    Author:     Krzysztof Grabczewski
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
     4
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
     5
Proofs needed to state that formulations WO1,...,WO6 are all equivalent.
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
     6
The only hard one is WO6 ==> WO1.
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
     7
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
     8
Every proof (except WO6 ==> WO1 and WO1 ==> WO2) are described as "clear"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
     9
by Rubin & Rubin (page 2). 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    10
They refer reader to a book by Gödel to see the proof WO1 ==> WO2.
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    11
Fortunately order types made this proof also very easy.
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
    12
*)
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
    13
16417
9bc16273c2d4 migrated theory headers to new format
haftmann
parents: 13339
diff changeset
    14
theory WO6_WO1 imports Cardinal_aux begin
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
    15
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    16
constdefs
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
    17
(* Auxiliary definitions used in proof *)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    18
  NN  :: "i => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    19
    "NN(y) == {m \<in> nat. \<exists>a. \<exists>f. Ord(a) & domain(f)=a  &  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    20
                        (\<Union>b<a. f`b) = y & (\<forall>b<a. f`b \<lesssim> m)}"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    21
  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    22
  uu  :: "[i, i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    23
    "uu(f, beta, gamma, delta) == (f`beta * f`gamma) Int f`delta"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    24
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    25
  (** Definitions for case 1 **)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    26
  vv1 :: "[i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    27
     "vv1(f,m,b) ==                                                
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    28
           let g = LEAST g. (\<exists>d. Ord(d) & (domain(uu(f,b,g,d)) \<noteq> 0 & 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    29
                                 domain(uu(f,b,g,d)) \<lesssim> m));      
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    30
               d = LEAST d. domain(uu(f,b,g,d)) \<noteq> 0 &                  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    31
                            domain(uu(f,b,g,d)) \<lesssim> m         
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    32
           in  if f`b \<noteq> 0 then domain(uu(f,b,g,d)) else 0"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    33
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    34
  ww1 :: "[i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    35
     "ww1(f,m,b) == f`b - vv1(f,m,b)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    36
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    37
  gg1 :: "[i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    38
     "gg1(f,a,m) == \<lambda>b \<in> a++a. if b<a then vv1(f,m,b) else ww1(f,m,b--a)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    39
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    40
  (** Definitions for case 2 **)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    41
  vv2 :: "[i, i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    42
     "vv2(f,b,g,s) ==   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    43
           if f`g \<noteq> 0 then {uu(f, b, g, LEAST d. uu(f,b,g,d) \<noteq> 0)`s} else 0"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    44
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    45
  ww2 :: "[i, i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    46
     "ww2(f,b,g,s) == f`g - vv2(f,b,g,s)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    47
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    48
  gg2 :: "[i, i, i, i] => i"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    49
     "gg2(f,a,b,s) ==
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    50
	      \<lambda>g \<in> a++a. if g<a then vv2(f,b,g,s) else ww2(f,b,g--a,s)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    51
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    52
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    53
lemma WO2_WO3: "WO2 ==> WO3"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    54
by (unfold WO2_def WO3_def, fast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    55
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    56
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    57
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    58
lemma WO3_WO1: "WO3 ==> WO1"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    59
apply (unfold eqpoll_def WO1_def WO3_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    60
apply (intro allI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    61
apply (drule_tac x=A in spec) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    62
apply (blast intro: bij_is_inj well_ord_rvimage 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    63
                    well_ord_Memrel [THEN well_ord_subset])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    64
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    65
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    66
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    67
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    68
lemma WO1_WO2: "WO1 ==> WO2"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    69
apply (unfold eqpoll_def WO1_def WO2_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    70
apply (blast intro!: Ord_ordertype ordermap_bij)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    71
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    72
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    73
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    74
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    75
lemma lam_sets: "f \<in> A->B ==> (\<lambda>x \<in> A. {f`x}): A -> {{b}. b \<in> B}"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    76
by (fast intro!: lam_type apply_type)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    77
24783
5a3e336a2e37 avoid internal names;
wenzelm
parents: 16417
diff changeset
    78
lemma surj_imp_eq': "f \<in> surj(A,B) ==> (\<Union>a \<in> A. {f`a}) = B"
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    79
apply (unfold surj_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    80
apply (fast elim!: apply_type)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    81
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    82
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    83
lemma surj_imp_eq: "[| f \<in> surj(A,B); Ord(A) |] ==> (\<Union>a<A. {f`a}) = B"
24783
5a3e336a2e37 avoid internal names;
wenzelm
parents: 16417
diff changeset
    84
by (fast dest!: surj_imp_eq' intro!: ltI elim!: ltE)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    85
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    86
lemma WO1_WO4: "WO1 ==> WO4(1)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    87
apply (unfold WO1_def WO4_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    88
apply (rule allI)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13175
diff changeset
    89
apply (erule_tac x = A in allE)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    90
apply (erule exE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    91
apply (intro exI conjI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    92
apply (erule Ord_ordertype)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    93
apply (erule ordermap_bij [THEN bij_converse_bij, THEN bij_is_fun, THEN lam_sets, THEN domain_of_fun])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    94
apply (simp_all add: singleton_eqpoll_1 eqpoll_imp_lepoll Ord_ordertype
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
    95
       ordermap_bij [THEN bij_converse_bij, THEN bij_is_surj, THEN surj_imp_eq]
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
    96
       ltD)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    97
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    98
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
    99
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   100
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   101
lemma WO4_mono: "[| m\<le>n; WO4(m) |] ==> WO4(n)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   102
apply (unfold WO4_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   103
apply (blast dest!: spec intro: lepoll_trans [OF _ le_imp_lepoll])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   104
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   105
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   106
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   107
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   108
lemma WO4_WO5: "[| m \<in> nat; 1\<le>m; WO4(m) |] ==> WO5"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   109
by (unfold WO4_def WO5_def, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   110
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   111
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   112
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   113
lemma WO5_WO6: "WO5 ==> WO6"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   114
by (unfold WO4_def WO5_def WO6_def, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   115
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   116
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   117
(* ********************************************************************** 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   118
    The proof of "WO6 ==> WO1".  Simplified by L C Paulson.
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   119
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   120
    From the book "Equivalents of the Axiom of Choice" by Rubin & Rubin,
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   121
    pages 2-5
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   122
************************************************************************* *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   123
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   124
lemma lt_oadd_odiff_disj:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   125
      "[| k < i++j;  Ord(i);  Ord(j) |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   126
       ==> k < i  |  (~ k<i & k = i ++ (k--i) & (k--i)<j)"
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13175
diff changeset
   127
apply (rule_tac i = k and j = i in Ord_linear2)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   128
prefer 4 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   129
   apply (drule odiff_lt_mono2, assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   130
   apply (simp add: oadd_odiff_inverse odiff_oadd_inverse)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   131
apply (auto elim!: lt_Ord)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   132
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   133
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   134
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   135
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   136
(* The most complicated part of the proof - lemma ii - p. 2-4             *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   137
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   138
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   139
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   140
(* some properties of relation uu(beta, gamma, delta) - p. 2              *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   141
(* ********************************************************************** *)
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
   142
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   143
lemma domain_uu_subset: "domain(uu(f,b,g,d)) \<subseteq> f`b"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   144
by (unfold uu_def, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   145
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   146
lemma quant_domain_uu_lepoll_m:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   147
     "\<forall>b<a. f`b \<lesssim> m ==> \<forall>b<a. \<forall>g<a. \<forall>d<a. domain(uu(f,b,g,d)) \<lesssim> m"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   148
by (blast intro: domain_uu_subset [THEN subset_imp_lepoll] lepoll_trans)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   149
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   150
lemma uu_subset1: "uu(f,b,g,d) \<subseteq> f`b * f`g"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   151
by (unfold uu_def, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   152
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   153
lemma uu_subset2: "uu(f,b,g,d) \<subseteq> f`d"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   154
by (unfold uu_def, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   155
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   156
lemma uu_lepoll_m: "[| \<forall>b<a. f`b \<lesssim> m;  d<a |] ==> uu(f,b,g,d) \<lesssim> m"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   157
by (blast intro: uu_subset2 [THEN subset_imp_lepoll] lepoll_trans)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   158
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   159
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   160
(* Two cases for lemma ii                                                 *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   161
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   162
lemma cases: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   163
     "\<forall>b<a. \<forall>g<a. \<forall>d<a. u(f,b,g,d) \<lesssim> m   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   164
      ==> (\<forall>b<a. f`b \<noteq> 0 -->  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   165
                  (\<exists>g<a. \<exists>d<a. u(f,b,g,d) \<noteq> 0 & u(f,b,g,d) \<prec> m))  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   166
        | (\<exists>b<a. f`b \<noteq> 0 & (\<forall>g<a. \<forall>d<a. u(f,b,g,d) \<noteq> 0 -->   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   167
                                        u(f,b,g,d) \<approx> m))"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   168
apply (unfold lesspoll_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   169
apply (blast del: equalityI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   170
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   171
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   172
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   173
(* Lemmas used in both cases                                              *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   174
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   175
lemma UN_oadd: "Ord(a) ==> (\<Union>b<a++a. C(b)) = (\<Union>b<a. C(b) Un C(a++b))"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   176
by (blast intro: ltI lt_oadd1 oadd_lt_mono2 dest!: lt_oadd_disj)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   177
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   178
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   179
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   180
(* Case 1: lemmas                                                        *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   181
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   182
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   183
lemma vv1_subset: "vv1(f,m,b) \<subseteq> f`b"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   184
by (simp add: vv1_def Let_def domain_uu_subset)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   185
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   186
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   187
(* Case 1: Union of images is the whole "y"                              *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   188
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   189
lemma UN_gg1_eq: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   190
  "[| Ord(a);  m \<in> nat |] ==> (\<Union>b<a++a. gg1(f,a,m)`b) = (\<Union>b<a. f`b)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   191
by (simp add: gg1_def UN_oadd lt_oadd1 oadd_le_self [THEN le_imp_not_lt] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   192
              lt_Ord odiff_oadd_inverse ltD vv1_subset [THEN Diff_partition]
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   193
              ww1_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   194
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   195
lemma domain_gg1: "domain(gg1(f,a,m)) = a++a"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   196
by (simp add: lam_funtype [THEN domain_of_fun] gg1_def)
992
4ef4f7ff2aeb New example of AC Equivalences by Krzysztof Grabczewski
lcp
parents:
diff changeset
   197
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   198
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   199
(* every value of defined function is less than or equipollent to m       *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   200
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   201
lemma nested_LeastI:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   202
     "[| P(a, b);  Ord(a);  Ord(b);   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   203
         Least_a = (LEAST a. \<exists>x. Ord(x) & P(a, x)) |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   204
      ==> P(Least_a, LEAST b. P(Least_a, b))"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   205
apply (erule ssubst)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   206
apply (rule_tac Q = "%z. P (z, LEAST b. P (z, b))" in LeastI2)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   207
apply (fast elim!: LeastI)+
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   208
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   209
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   210
lemmas nested_Least_instance = 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   211
       nested_LeastI [of "%g d. domain(uu(f,b,g,d)) \<noteq> 0 & 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   212
                                domain(uu(f,b,g,d)) \<lesssim> m", 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   213
                      standard]    (*generalizes the Variables!*)
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
   214
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   215
lemma gg1_lepoll_m: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   216
     "[| Ord(a);  m \<in> nat;   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   217
         \<forall>b<a. f`b \<noteq>0 -->                                        
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   218
             (\<exists>g<a. \<exists>d<a. domain(uu(f,b,g,d)) \<noteq> 0  &                
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   219
                          domain(uu(f,b,g,d)) \<lesssim> m);             
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   220
         \<forall>b<a. f`b \<lesssim> succ(m);  b<a++a |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   221
      ==> gg1(f,a,m)`b \<lesssim> m"
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   222
apply (simp add: gg1_def empty_lepollI)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   223
apply (safe dest!: lt_oadd_odiff_disj)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   224
(*Case b<a   \<in> show vv1(f,m,b) \<lesssim> m *)
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   225
 apply (simp add: vv1_def Let_def empty_lepollI)
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   226
 apply (fast intro: nested_Least_instance [THEN conjunct2]
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   227
             elim!: lt_Ord)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   228
(*Case a\<le>b \<in> show ww1(f,m,b--a) \<lesssim> m *)
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   229
apply (simp add: ww1_def empty_lepollI)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   230
apply (case_tac "f` (b--a) = 0", simp add: empty_lepollI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   231
apply (rule Diff_lepoll, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   232
apply (rule vv1_subset)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   233
apply (drule ospec [THEN mp], assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   234
apply (elim oexE conjE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   235
apply (simp add: vv1_def Let_def lt_Ord nested_Least_instance [THEN conjunct1])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   236
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   237
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   238
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   239
(* Case 2: lemmas                                                        *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   240
(* ********************************************************************** *)
1042
04ef9b8ef1af Defined vv1 using let. Introduced gg1, gg2.
lcp
parents: 1019
diff changeset
   241
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   242
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   243
(* Case 2: vv2_subset                                                    *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   244
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   245
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   246
lemma ex_d_uu_not_empty:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   247
     "[| b<a;  g<a;  f`b\<noteq>0;  f`g\<noteq>0;         
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   248
         y*y \<subseteq> y;  (\<Union>b<a. f`b)=y |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   249
      ==> \<exists>d<a. uu(f,b,g,d) \<noteq> 0"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   250
by (unfold uu_def, blast) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   251
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   252
lemma uu_not_empty:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   253
     "[| b<a; g<a; f`b\<noteq>0; f`g\<noteq>0;  y*y \<subseteq> y; (\<Union>b<a. f`b)=y |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   254
      ==> uu(f,b,g,LEAST d. (uu(f,b,g,d) \<noteq> 0)) \<noteq> 0"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   255
apply (drule ex_d_uu_not_empty, assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   256
apply (fast elim!: LeastI lt_Ord)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   257
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   258
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   259
lemma not_empty_rel_imp_domain: "[| r \<subseteq> A*B; r\<noteq>0 |] ==> domain(r)\<noteq>0"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   260
by blast
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   261
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   262
lemma Least_uu_not_empty_lt_a:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   263
     "[| b<a; g<a; f`b\<noteq>0; f`g\<noteq>0; y*y \<subseteq> y; (\<Union>b<a. f`b)=y |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   264
      ==> (LEAST d. uu(f,b,g,d) \<noteq> 0) < a"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   265
apply (erule ex_d_uu_not_empty [THEN oexE], assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   266
apply (blast intro: Least_le [THEN lt_trans1] lt_Ord)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   267
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   268
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   269
lemma subset_Diff_sing: "[| B \<subseteq> A; a\<notin>B |] ==> B \<subseteq> A-{a}"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   270
by blast
1042
04ef9b8ef1af Defined vv1 using let. Introduced gg1, gg2.
lcp
parents: 1019
diff changeset
   271
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   272
(*Could this be proved more directly?*)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   273
lemma supset_lepoll_imp_eq:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   274
     "[| A \<lesssim> m; m \<lesssim> B; B \<subseteq> A; m \<in> nat |] ==> A=B"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   275
apply (erule natE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   276
apply (fast dest!: lepoll_0_is_0 intro!: equalityI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   277
apply (safe intro!: equalityI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   278
apply (rule ccontr)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   279
apply (rule succ_lepoll_natE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   280
 apply (erule lepoll_trans)  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   281
 apply (rule lepoll_trans)  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   282
  apply (erule subset_Diff_sing [THEN subset_imp_lepoll], assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   283
 apply (rule Diff_sing_lepoll, assumption+) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   284
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   285
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   286
lemma uu_Least_is_fun:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   287
     "[| \<forall>g<a. \<forall>d<a. domain(uu(f, b, g, d))\<noteq>0 -->                
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   288
          domain(uu(f, b, g, d)) \<approx> succ(m);                         
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   289
          \<forall>b<a. f`b \<lesssim> succ(m);  y*y \<subseteq> y;                        
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   290
          (\<Union>b<a. f`b)=y;  b<a;  g<a;  d<a;                             
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   291
          f`b\<noteq>0;  f`g\<noteq>0;  m \<in> nat;  s \<in> f`b |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   292
      ==> uu(f, b, g, LEAST d. uu(f,b,g,d)\<noteq>0) \<in> f`b -> f`g"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   293
apply (drule_tac x2=g in ospec [THEN ospec, THEN mp])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   294
   apply (rule_tac [3] not_empty_rel_imp_domain [OF uu_subset1 uu_not_empty])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   295
        apply (rule_tac [2] Least_uu_not_empty_lt_a, assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   296
apply (rule rel_is_fun)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   297
    apply (erule eqpoll_sym [THEN eqpoll_imp_lepoll]) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   298
   apply (erule uu_lepoll_m) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   299
   apply (rule Least_uu_not_empty_lt_a, assumption+) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   300
apply (rule uu_subset1)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   301
apply (rule supset_lepoll_imp_eq [OF _ eqpoll_sym [THEN eqpoll_imp_lepoll]])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   302
apply (fast intro!: domain_uu_subset)+
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   303
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   304
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   305
lemma vv2_subset: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   306
     "[| \<forall>g<a. \<forall>d<a. domain(uu(f, b, g, d))\<noteq>0 -->             
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   307
		       domain(uu(f, b, g, d)) \<approx> succ(m);
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   308
	 \<forall>b<a. f`b \<lesssim> succ(m); y*y \<subseteq> y;
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   309
	 (\<Union>b<a. f`b)=y;  b<a;  g<a;  m \<in> nat;  s \<in> f`b |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   310
      ==> vv2(f,b,g,s) \<subseteq> f`g"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   311
apply (simp add: vv2_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   312
apply (blast intro: uu_Least_is_fun [THEN apply_type])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   313
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   314
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   315
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   316
(* Case 2: Union of images is the whole "y"                              *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   317
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   318
lemma UN_gg2_eq: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   319
     "[| \<forall>g<a. \<forall>d<a. domain(uu(f,b,g,d)) \<noteq> 0 -->              
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   320
               domain(uu(f,b,g,d)) \<approx> succ(m);                         
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   321
         \<forall>b<a. f`b \<lesssim> succ(m); y*y \<subseteq> y;                        
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   322
         (\<Union>b<a. f`b)=y;  Ord(a);  m \<in> nat;  s \<in> f`b;  b<a |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   323
      ==> (\<Union>g<a++a. gg2(f,a,b,s) ` g) = y"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   324
apply (unfold gg2_def)
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   325
apply (drule sym) 
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   326
apply (simp add: ltD UN_oadd  oadd_le_self [THEN le_imp_not_lt] 
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   327
                 lt_Ord odiff_oadd_inverse ww2_def 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   328
                 vv2_subset [THEN Diff_partition])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   329
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   330
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   331
lemma domain_gg2: "domain(gg2(f,a,b,s)) = a++a"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   332
by (simp add: lam_funtype [THEN domain_of_fun] gg2_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   333
1042
04ef9b8ef1af Defined vv1 using let. Introduced gg1, gg2.
lcp
parents: 1019
diff changeset
   334
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   335
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   336
(* every value of defined function is less than or equipollent to m       *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   337
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   338
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   339
lemma vv2_lepoll: "[| m \<in> nat; m\<noteq>0 |] ==> vv2(f,b,g,s) \<lesssim> m"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   340
apply (unfold vv2_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   341
apply (simp add: empty_lepollI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   342
apply (fast dest!: le_imp_subset [THEN subset_imp_lepoll, THEN lepoll_0_is_0] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   343
       intro!: singleton_eqpoll_1 [THEN eqpoll_imp_lepoll, THEN lepoll_trans]
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   344
               not_lt_imp_le [THEN le_imp_subset, THEN subset_imp_lepoll]
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   345
               nat_into_Ord nat_1I)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   346
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   347
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   348
lemma ww2_lepoll: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   349
    "[| \<forall>b<a. f`b \<lesssim> succ(m);  g<a;  m \<in> nat;  vv2(f,b,g,d) \<subseteq> f`g |]  
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   350
     ==> ww2(f,b,g,d) \<lesssim> m"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   351
apply (unfold ww2_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   352
apply (case_tac "f`g = 0")
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   353
apply (simp add: empty_lepollI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   354
apply (drule ospec, assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   355
apply (rule Diff_lepoll, assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   356
apply (simp add: vv2_def not_emptyI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   357
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   358
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   359
lemma gg2_lepoll_m: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   360
     "[| \<forall>g<a. \<forall>d<a. domain(uu(f,b,g,d)) \<noteq> 0 -->              
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   361
                      domain(uu(f,b,g,d)) \<approx> succ(m);                         
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   362
         \<forall>b<a. f`b \<lesssim> succ(m);  y*y \<subseteq> y;                     
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   363
         (\<Union>b<a. f`b)=y;  b<a;  s \<in> f`b;  m \<in> nat;  m\<noteq> 0;  g<a++a |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   364
      ==> gg2(f,a,b,s) ` g \<lesssim> m"
13175
81082cfa5618 new definition of "apply" and new simprule "beta_if"
paulson
parents: 12820
diff changeset
   365
apply (simp add: gg2_def empty_lepollI)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   366
apply (safe elim!: lt_Ord2 dest!: lt_oadd_odiff_disj)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   367
 apply (simp add: vv2_lepoll)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   368
apply (simp add: ww2_lepoll vv2_subset)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   369
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   370
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   371
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   372
(* lemma ii                                                               *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   373
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   374
lemma lemma_ii: "[| succ(m) \<in> NN(y); y*y \<subseteq> y; m \<in> nat; m\<noteq>0 |] ==> m \<in> NN(y)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   375
apply (unfold NN_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   376
apply (elim CollectE exE conjE) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   377
apply (rule quant_domain_uu_lepoll_m [THEN cases, THEN disjE], assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   378
(* case 1 *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   379
apply (simp add: lesspoll_succ_iff)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   380
apply (rule_tac x = "a++a" in exI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   381
apply (fast intro!: Ord_oadd domain_gg1 UN_gg1_eq gg1_lepoll_m)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   382
(* case 2 *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   383
apply (elim oexE conjE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   384
apply (rule_tac A = "f`?B" in not_emptyE, assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   385
apply (rule CollectI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   386
apply (erule succ_natD)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   387
apply (rule_tac x = "a++a" in exI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   388
apply (rule_tac x = "gg2 (f,a,b,x) " in exI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   389
(*Calling fast_tac might get rid of the res_inst_tac calls, but it
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   390
  is just too slow.*)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   391
apply (simp add: Ord_oadd domain_gg2 UN_gg2_eq gg2_lepoll_m)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   392
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   393
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   394
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   395
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   396
(* lemma iv - p. 4:                                                       *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   397
(* For every set x there is a set y such that   x Un (y * y) \<subseteq> y         *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   398
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   399
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   400
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   401
(* The leading \<forall>-quantifier looks odd but makes the proofs shorter 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   402
   (used only in the following two lemmas)                          *)
1042
04ef9b8ef1af Defined vv1 using let. Introduced gg1, gg2.
lcp
parents: 1019
diff changeset
   403
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   404
lemma z_n_subset_z_succ_n:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   405
     "\<forall>n \<in> nat. rec(n, x, %k r. r Un r*r) \<subseteq> rec(succ(n), x, %k r. r Un r*r)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   406
by (fast intro: rec_succ [THEN ssubst])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   407
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   408
lemma le_subsets:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   409
     "[| \<forall>n \<in> nat. f(n)<=f(succ(n)); n\<le>m; n \<in> nat; m \<in> nat |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   410
      ==> f(n)<=f(m)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   411
apply (erule_tac P = "n\<le>m" in rev_mp)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   412
apply (rule_tac P = "%z. n\<le>z --> f (n) \<subseteq> f (z) " in nat_induct) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   413
apply (auto simp add: le_iff) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   414
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   415
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   416
lemma le_imp_rec_subset:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   417
     "[| n\<le>m; m \<in> nat |] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   418
      ==> rec(n, x, %k r. r Un r*r) \<subseteq> rec(m, x, %k r. r Un r*r)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   419
apply (rule z_n_subset_z_succ_n [THEN le_subsets])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   420
apply (blast intro: lt_nat_in_nat)+
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   421
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   422
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   423
lemma lemma_iv: "\<exists>y. x Un y*y \<subseteq> y"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   424
apply (rule_tac x = "\<Union>n \<in> nat. rec (n, x, %k r. r Un r*r) " in exI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   425
apply safe
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   426
apply (rule nat_0I [THEN UN_I], simp)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   427
apply (rule_tac a = "succ (n Un na) " in UN_I)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   428
apply (erule Un_nat_type [THEN nat_succI], assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   429
apply (auto intro: le_imp_rec_subset [THEN subsetD] 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   430
            intro!: Un_upper1_le Un_upper2_le Un_nat_type 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   431
            elim!: nat_into_Ord)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   432
done
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
   433
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   434
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   435
(* Rubin & Rubin wrote,                                                   *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   436
(* "It follows from (ii) and mathematical induction that if y*y \<subseteq> y then *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   437
(* y can be well-ordered"                                                 *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   438
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   439
(* In fact we have to prove                                               *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   440
(*      * WO6 ==> NN(y) \<noteq> 0                                              *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   441
(*      * reverse induction which lets us infer that 1 \<in> NN(y)            *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   442
(*      * 1 \<in> NN(y) ==> y can be well-ordered                             *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   443
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   444
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   445
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   446
(*      WO6 ==> NN(y) \<noteq> 0                                                *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   447
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   448
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   449
lemma WO6_imp_NN_not_empty: "WO6 ==> NN(y) \<noteq> 0"
12820
02e2ff3e4d37 lexical tidying
paulson
parents: 12776
diff changeset
   450
by (unfold WO6_def NN_def, clarify, blast)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   451
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   452
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   453
(*      1 \<in> NN(y) ==> y can be well-ordered                               *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   454
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   455
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   456
lemma lemma1:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   457
     "[| (\<Union>b<a. f`b)=y; x \<in> y; \<forall>b<a. f`b \<lesssim> 1; Ord(a) |] ==> \<exists>c<a. f`c = {x}"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   458
by (fast elim!: lepoll_1_is_sing)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   459
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   460
lemma lemma2:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   461
     "[| (\<Union>b<a. f`b)=y; x \<in> y; \<forall>b<a. f`b \<lesssim> 1; Ord(a) |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   462
      ==> f` (LEAST i. f`i = {x}) = {x}"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   463
apply (drule lemma1, assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   464
apply (fast elim!: lt_Ord intro: LeastI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   465
done
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
   466
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   467
lemma NN_imp_ex_inj: "1 \<in> NN(y) ==> \<exists>a f. Ord(a) & f \<in> inj(y, a)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   468
apply (unfold NN_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   469
apply (elim CollectE exE conjE)
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13175
diff changeset
   470
apply (rule_tac x = a in exI)
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   471
apply (rule_tac x = "\<lambda>x \<in> y. LEAST i. f`i = {x}" in exI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   472
apply (rule conjI, assumption)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   473
apply (rule_tac d = "%i. THE x. x \<in> f`i" in lam_injective)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   474
apply (drule lemma1, assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   475
apply (fast elim!: Least_le [THEN lt_trans1, THEN ltD] lt_Ord)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   476
apply (rule lemma2 [THEN ssubst], assumption+, blast)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   477
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   478
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   479
lemma y_well_ord: "[| y*y \<subseteq> y; 1 \<in> NN(y) |] ==> \<exists>r. well_ord(y, r)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   480
apply (drule NN_imp_ex_inj)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   481
apply (fast elim!: well_ord_rvimage [OF _ well_ord_Memrel])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   482
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   483
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   484
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   485
(*      reverse induction which lets us infer that 1 \<in> NN(y)              *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   486
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   487
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   488
lemma rev_induct_lemma [rule_format]: 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   489
     "[| n \<in> nat; !!m. [| m \<in> nat; m\<noteq>0; P(succ(m)) |] ==> P(m) |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   490
      ==> n\<noteq>0 --> P(n) --> P(1)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   491
by (erule nat_induct, blast+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   492
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   493
lemma rev_induct:
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   494
     "[| n \<in> nat;  P(n);  n\<noteq>0;   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   495
         !!m. [| m \<in> nat; m\<noteq>0; P(succ(m)) |] ==> P(m) |]   
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   496
      ==> P(1)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   497
by (rule rev_induct_lemma, blast+)
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
   498
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   499
lemma NN_into_nat: "n \<in> NN(y) ==> n \<in> nat"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   500
by (simp add: NN_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   501
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   502
lemma lemma3: "[| n \<in> NN(y); y*y \<subseteq> y; n\<noteq>0 |] ==> 1 \<in> NN(y)"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   503
apply (rule rev_induct [OF NN_into_nat], assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   504
apply (rule lemma_ii, assumption+)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   505
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   506
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   507
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   508
(* Main theorem "WO6 ==> WO1"                                             *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   509
(* ********************************************************************** *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   510
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   511
(* another helpful lemma *)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   512
lemma NN_y_0: "0 \<in> NN(y) ==> y=0"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   513
apply (unfold NN_def) 
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   514
apply (fast intro!: equalityI dest!: lepoll_0_is_0 elim: subst)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   515
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   516
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   517
lemma WO6_imp_WO1: "WO6 ==> WO1"
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   518
apply (unfold WO1_def)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   519
apply (rule allI)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   520
apply (case_tac "A=0")
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   521
apply (fast intro!: well_ord_Memrel nat_0I [THEN nat_into_Ord])
13339
0f89104dd377 Fixed quantified variable name preservation for ball and bex (bounded quants)
paulson
parents: 13175
diff changeset
   522
apply (rule_tac x1 = A in lemma_iv [THEN revcut_rl])
12776
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   523
apply (erule exE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   524
apply (drule WO6_imp_NN_not_empty)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   525
apply (erule Un_subset_iff [THEN iffD1, THEN conjE])
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   526
apply (erule_tac A = "NN (y) " in not_emptyE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   527
apply (frule y_well_ord)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   528
 apply (fast intro!: lemma3 dest!: NN_y_0 elim!: not_emptyE)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   529
apply (fast elim: well_ord_subset)
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   530
done
249600a63ba9 Isar version of AC
paulson
parents: 11317
diff changeset
   531
1019
0697024c3cca Received some local definitions from AC_Equiv.thy.
lcp
parents: 992
diff changeset
   532
end