| author | haftmann | 
| Tue, 26 Sep 2006 13:34:17 +0200 | |
| changeset 20714 | 6a122dba034c | 
| parent 19931 | fb32b43e7f80 | 
| child 32960 | 69916a850301 | 
| permissions | -rw-r--r-- | 
| 13634 | 1 | (* Title: ZF/Constructible/Rank_Separation.thy | 
| 2 | ID: $Id$ | |
| 3 | Author: Lawrence C Paulson, Cambridge University Computer Laboratory | |
| 4 | *) | |
| 5 | ||
| 6 | header {*Separation for Facts About Order Types, Rank Functions and 
 | |
| 7 | Well-Founded Relations*} | |
| 8 | ||
| 16417 | 9 | theory Rank_Separation imports Rank Rec_Separation begin | 
| 13634 | 10 | |
| 11 | ||
| 12 | text{*This theory proves all instances needed for locales
 | |
| 13687 | 13 |  @{text "M_ordertype"} and  @{text "M_wfrank"}.  But the material is not
 | 
| 14 | needed for proving the relative consistency of AC.*} | |
| 13634 | 15 | |
| 16 | subsection{*The Locale @{text "M_ordertype"}*}
 | |
| 17 | ||
| 18 | subsubsection{*Separation for Order-Isomorphisms*}
 | |
| 19 | ||
| 20 | lemma well_ord_iso_Reflects: | |
| 21 | "REFLECTS[\<lambda>x. x\<in>A --> | |
| 22 | (\<exists>y[L]. \<exists>p[L]. fun_apply(L,f,x,y) & pair(L,y,x,p) & p \<in> r), | |
| 23 | \<lambda>i x. x\<in>A --> (\<exists>y \<in> Lset(i). \<exists>p \<in> Lset(i). | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 24 | fun_apply(##Lset(i),f,x,y) & pair(##Lset(i),y,x,p) & p \<in> r)]" | 
| 13634 | 25 | by (intro FOL_reflections function_reflections) | 
| 26 | ||
| 27 | lemma well_ord_iso_separation: | |
| 28 | "[| L(A); L(f); L(r) |] | |
| 29 | ==> separation (L, \<lambda>x. x\<in>A --> (\<exists>y[L]. (\<exists>p[L]. | |
| 30 | fun_apply(L,f,x,y) & pair(L,y,x,p) & p \<in> r)))" | |
| 13687 | 31 | apply (rule gen_separation_multi [OF well_ord_iso_Reflects, of "{A,f,r}"], 
 | 
| 32 | auto) | |
| 33 | apply (rule_tac env="[A,f,r]" in DPow_LsetI) | |
| 13634 | 34 | apply (rule sep_rules | simp)+ | 
| 35 | done | |
| 36 | ||
| 37 | ||
| 38 | subsubsection{*Separation for @{term "obase"}*}
 | |
| 39 | ||
| 40 | lemma obase_reflects: | |
| 41 | "REFLECTS[\<lambda>a. \<exists>x[L]. \<exists>g[L]. \<exists>mx[L]. \<exists>par[L]. | |
| 42 | ordinal(L,x) & membership(L,x,mx) & pred_set(L,A,a,r,par) & | |
| 43 | order_isomorphism(L,par,r,x,mx,g), | |
| 44 | \<lambda>i a. \<exists>x \<in> Lset(i). \<exists>g \<in> Lset(i). \<exists>mx \<in> Lset(i). \<exists>par \<in> Lset(i). | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 45 | ordinal(##Lset(i),x) & membership(##Lset(i),x,mx) & pred_set(##Lset(i),A,a,r,par) & | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 46 | order_isomorphism(##Lset(i),par,r,x,mx,g)]" | 
| 13634 | 47 | by (intro FOL_reflections function_reflections fun_plus_reflections) | 
| 48 | ||
| 49 | lemma obase_separation: | |
| 50 |      --{*part of the order type formalization*}
 | |
| 51 | "[| L(A); L(r) |] | |
| 52 | ==> separation(L, \<lambda>a. \<exists>x[L]. \<exists>g[L]. \<exists>mx[L]. \<exists>par[L]. | |
| 53 | ordinal(L,x) & membership(L,x,mx) & pred_set(L,A,a,r,par) & | |
| 54 | order_isomorphism(L,par,r,x,mx,g))" | |
| 13687 | 55 | apply (rule gen_separation_multi [OF obase_reflects, of "{A,r}"], auto)
 | 
| 56 | apply (rule_tac env="[A,r]" in DPow_LsetI) | |
| 57 | apply (rule ordinal_iff_sats sep_rules | simp)+ | |
| 13634 | 58 | done | 
| 59 | ||
| 60 | ||
| 61 | subsubsection{*Separation for a Theorem about @{term "obase"}*}
 | |
| 62 | ||
| 63 | lemma obase_equals_reflects: | |
| 64 | "REFLECTS[\<lambda>x. x\<in>A --> ~(\<exists>y[L]. \<exists>g[L]. | |
| 65 | ordinal(L,y) & (\<exists>my[L]. \<exists>pxr[L]. | |
| 66 | membership(L,y,my) & pred_set(L,A,x,r,pxr) & | |
| 67 | order_isomorphism(L,pxr,r,y,my,g))), | |
| 68 | \<lambda>i x. x\<in>A --> ~(\<exists>y \<in> Lset(i). \<exists>g \<in> Lset(i). | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 69 | ordinal(##Lset(i),y) & (\<exists>my \<in> Lset(i). \<exists>pxr \<in> Lset(i). | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 70 | membership(##Lset(i),y,my) & pred_set(##Lset(i),A,x,r,pxr) & | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 71 | order_isomorphism(##Lset(i),pxr,r,y,my,g)))]" | 
| 13634 | 72 | by (intro FOL_reflections function_reflections fun_plus_reflections) | 
| 73 | ||
| 74 | lemma obase_equals_separation: | |
| 75 | "[| L(A); L(r) |] | |
| 76 | ==> separation (L, \<lambda>x. x\<in>A --> ~(\<exists>y[L]. \<exists>g[L]. | |
| 77 | ordinal(L,y) & (\<exists>my[L]. \<exists>pxr[L]. | |
| 78 | membership(L,y,my) & pred_set(L,A,x,r,pxr) & | |
| 79 | order_isomorphism(L,pxr,r,y,my,g))))" | |
| 13687 | 80 | apply (rule gen_separation_multi [OF obase_equals_reflects, of "{A,r}"], auto)
 | 
| 81 | apply (rule_tac env="[A,r]" in DPow_LsetI) | |
| 13634 | 82 | apply (rule sep_rules | simp)+ | 
| 83 | done | |
| 84 | ||
| 85 | ||
| 86 | subsubsection{*Replacement for @{term "omap"}*}
 | |
| 87 | ||
| 88 | lemma omap_reflects: | |
| 89 | "REFLECTS[\<lambda>z. \<exists>a[L]. a\<in>B & (\<exists>x[L]. \<exists>g[L]. \<exists>mx[L]. \<exists>par[L]. | |
| 90 | ordinal(L,x) & pair(L,a,x,z) & membership(L,x,mx) & | |
| 91 | pred_set(L,A,a,r,par) & order_isomorphism(L,par,r,x,mx,g)), | |
| 92 | \<lambda>i z. \<exists>a \<in> Lset(i). a\<in>B & (\<exists>x \<in> Lset(i). \<exists>g \<in> Lset(i). \<exists>mx \<in> Lset(i). | |
| 93 | \<exists>par \<in> Lset(i). | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 94 | ordinal(##Lset(i),x) & pair(##Lset(i),a,x,z) & | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 95 | membership(##Lset(i),x,mx) & pred_set(##Lset(i),A,a,r,par) & | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 96 | order_isomorphism(##Lset(i),par,r,x,mx,g))]" | 
| 13634 | 97 | by (intro FOL_reflections function_reflections fun_plus_reflections) | 
| 98 | ||
| 99 | lemma omap_replacement: | |
| 100 | "[| L(A); L(r) |] | |
| 101 | ==> strong_replacement(L, | |
| 102 | \<lambda>a z. \<exists>x[L]. \<exists>g[L]. \<exists>mx[L]. \<exists>par[L]. | |
| 103 | ordinal(L,x) & pair(L,a,x,z) & membership(L,x,mx) & | |
| 104 | pred_set(L,A,a,r,par) & order_isomorphism(L,par,r,x,mx,g))" | |
| 105 | apply (rule strong_replacementI) | |
| 13687 | 106 | apply (rule_tac u="{A,r,B}" in gen_separation_multi [OF omap_reflects], auto)
 | 
| 107 | apply (rule_tac env="[A,B,r]" in DPow_LsetI) | |
| 13634 | 108 | apply (rule sep_rules | simp)+ | 
| 109 | done | |
| 110 | ||
| 111 | ||
| 112 | ||
| 113 | subsection{*Instantiating the locale @{text M_ordertype}*}
 | |
| 114 | text{*Separation (and Strong Replacement) for basic set-theoretic constructions
 | |
| 115 | such as intersection, Cartesian Product and image.*} | |
| 116 | ||
| 117 | lemma M_ordertype_axioms_L: "M_ordertype_axioms(L)" | |
| 118 | apply (rule M_ordertype_axioms.intro) | |
| 119 | apply (assumption | rule well_ord_iso_separation | |
| 120 | obase_separation obase_equals_separation | |
| 121 | omap_replacement)+ | |
| 122 | done | |
| 123 | ||
| 124 | theorem M_ordertype_L: "PROP M_ordertype(L)" | |
| 19931 
fb32b43e7f80
Restructured locales with predicates: import is now an interpretation.
 ballarin parents: 
16417diff
changeset | 125 | apply (rule M_ordertype.intro) | 
| 
fb32b43e7f80
Restructured locales with predicates: import is now an interpretation.
 ballarin parents: 
16417diff
changeset | 126 | apply (rule M_basic_L) | 
| 
fb32b43e7f80
Restructured locales with predicates: import is now an interpretation.
 ballarin parents: 
16417diff
changeset | 127 | apply (rule M_ordertype_axioms_L) | 
| 
fb32b43e7f80
Restructured locales with predicates: import is now an interpretation.
 ballarin parents: 
16417diff
changeset | 128 | done | 
| 13634 | 129 | |
| 130 | ||
| 131 | subsection{*The Locale @{text "M_wfrank"}*}
 | |
| 132 | ||
| 133 | subsubsection{*Separation for @{term "wfrank"}*}
 | |
| 134 | ||
| 135 | lemma wfrank_Reflects: | |
| 136 | "REFLECTS[\<lambda>x. \<forall>rplus[L]. tran_closure(L,r,rplus) --> | |
| 137 | ~ (\<exists>f[L]. M_is_recfun(L, %x f y. is_range(L,f,y), rplus, x, f)), | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 138 | \<lambda>i x. \<forall>rplus \<in> Lset(i). tran_closure(##Lset(i),r,rplus) --> | 
| 13634 | 139 | ~ (\<exists>f \<in> Lset(i). | 
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 140 | M_is_recfun(##Lset(i), %x f y. is_range(##Lset(i),f,y), | 
| 13634 | 141 | rplus, x, f))]" | 
| 142 | by (intro FOL_reflections function_reflections is_recfun_reflection tran_closure_reflection) | |
| 143 | ||
| 144 | lemma wfrank_separation: | |
| 145 | "L(r) ==> | |
| 146 | separation (L, \<lambda>x. \<forall>rplus[L]. tran_closure(L,r,rplus) --> | |
| 147 | ~ (\<exists>f[L]. M_is_recfun(L, %x f y. is_range(L,f,y), rplus, x, f)))" | |
| 148 | apply (rule gen_separation [OF wfrank_Reflects], simp) | |
| 13687 | 149 | apply (rule_tac env="[r]" in DPow_LsetI) | 
| 150 | apply (rule sep_rules tran_closure_iff_sats is_recfun_iff_sats | simp)+ | |
| 13634 | 151 | done | 
| 152 | ||
| 153 | ||
| 154 | subsubsection{*Replacement for @{term "wfrank"}*}
 | |
| 155 | ||
| 156 | lemma wfrank_replacement_Reflects: | |
| 157 | "REFLECTS[\<lambda>z. \<exists>x[L]. x \<in> A & | |
| 158 | (\<forall>rplus[L]. tran_closure(L,r,rplus) --> | |
| 159 | (\<exists>y[L]. \<exists>f[L]. pair(L,x,y,z) & | |
| 160 | M_is_recfun(L, %x f y. is_range(L,f,y), rplus, x, f) & | |
| 161 | is_range(L,f,y))), | |
| 162 | \<lambda>i z. \<exists>x \<in> Lset(i). x \<in> A & | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 163 | (\<forall>rplus \<in> Lset(i). tran_closure(##Lset(i),r,rplus) --> | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 164 | (\<exists>y \<in> Lset(i). \<exists>f \<in> Lset(i). pair(##Lset(i),x,y,z) & | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 165 | M_is_recfun(##Lset(i), %x f y. is_range(##Lset(i),f,y), rplus, x, f) & | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 166 | is_range(##Lset(i),f,y)))]" | 
| 13634 | 167 | by (intro FOL_reflections function_reflections fun_plus_reflections | 
| 168 | is_recfun_reflection tran_closure_reflection) | |
| 169 | ||
| 170 | lemma wfrank_strong_replacement: | |
| 171 | "L(r) ==> | |
| 172 | strong_replacement(L, \<lambda>x z. | |
| 173 | \<forall>rplus[L]. tran_closure(L,r,rplus) --> | |
| 174 | (\<exists>y[L]. \<exists>f[L]. pair(L,x,y,z) & | |
| 175 | M_is_recfun(L, %x f y. is_range(L,f,y), rplus, x, f) & | |
| 176 | is_range(L,f,y)))" | |
| 177 | apply (rule strong_replacementI) | |
| 13687 | 178 | apply (rule_tac u="{r,B}" 
 | 
| 179 | in gen_separation_multi [OF wfrank_replacement_Reflects], | |
| 180 | auto) | |
| 181 | apply (rule_tac env="[r,B]" in DPow_LsetI) | |
| 182 | apply (rule sep_rules tran_closure_iff_sats is_recfun_iff_sats | simp)+ | |
| 13634 | 183 | done | 
| 184 | ||
| 185 | ||
| 186 | subsubsection{*Separation for Proving @{text Ord_wfrank_range}*}
 | |
| 187 | ||
| 188 | lemma Ord_wfrank_Reflects: | |
| 189 | "REFLECTS[\<lambda>x. \<forall>rplus[L]. tran_closure(L,r,rplus) --> | |
| 190 | ~ (\<forall>f[L]. \<forall>rangef[L]. | |
| 191 | is_range(L,f,rangef) --> | |
| 192 | M_is_recfun(L, \<lambda>x f y. is_range(L,f,y), rplus, x, f) --> | |
| 193 | ordinal(L,rangef)), | |
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 194 | \<lambda>i x. \<forall>rplus \<in> Lset(i). tran_closure(##Lset(i),r,rplus) --> | 
| 13634 | 195 | ~ (\<forall>f \<in> Lset(i). \<forall>rangef \<in> Lset(i). | 
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 196 | is_range(##Lset(i),f,rangef) --> | 
| 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 197 | M_is_recfun(##Lset(i), \<lambda>x f y. is_range(##Lset(i),f,y), | 
| 13634 | 198 | rplus, x, f) --> | 
| 13807 
a28a8fbc76d4
changed ** to ## to avoid conflict with new comment syntax
 paulson parents: 
13687diff
changeset | 199 | ordinal(##Lset(i),rangef))]" | 
| 13634 | 200 | by (intro FOL_reflections function_reflections is_recfun_reflection | 
| 201 | tran_closure_reflection ordinal_reflection) | |
| 202 | ||
| 203 | lemma Ord_wfrank_separation: | |
| 204 | "L(r) ==> | |
| 205 | separation (L, \<lambda>x. | |
| 206 | \<forall>rplus[L]. tran_closure(L,r,rplus) --> | |
| 207 | ~ (\<forall>f[L]. \<forall>rangef[L]. | |
| 208 | is_range(L,f,rangef) --> | |
| 209 | M_is_recfun(L, \<lambda>x f y. is_range(L,f,y), rplus, x, f) --> | |
| 210 | ordinal(L,rangef)))" | |
| 211 | apply (rule gen_separation [OF Ord_wfrank_Reflects], simp) | |
| 13687 | 212 | apply (rule_tac env="[r]" in DPow_LsetI) | 
| 213 | apply (rule sep_rules tran_closure_iff_sats is_recfun_iff_sats | simp)+ | |
| 13634 | 214 | done | 
| 215 | ||
| 216 | ||
| 217 | subsubsection{*Instantiating the locale @{text M_wfrank}*}
 | |
| 218 | ||
| 219 | lemma M_wfrank_axioms_L: "M_wfrank_axioms(L)" | |
| 220 | apply (rule M_wfrank_axioms.intro) | |
| 221 | apply (assumption | rule | |
| 222 | wfrank_separation wfrank_strong_replacement Ord_wfrank_separation)+ | |
| 223 | done | |
| 224 | ||
| 225 | theorem M_wfrank_L: "PROP M_wfrank(L)" | |
| 226 | apply (rule M_wfrank.intro) | |
| 19931 
fb32b43e7f80
Restructured locales with predicates: import is now an interpretation.
 ballarin parents: 
16417diff
changeset | 227 | apply (rule M_trancl_L) | 
| 13634 | 228 | apply (rule M_wfrank_axioms_L) | 
| 229 | done | |
| 230 | ||
| 231 | lemmas exists_wfrank = M_wfrank.exists_wfrank [OF M_wfrank_L] | |
| 232 | and M_wellfoundedrank = M_wfrank.M_wellfoundedrank [OF M_wfrank_L] | |
| 233 | and Ord_wfrank_range = M_wfrank.Ord_wfrank_range [OF M_wfrank_L] | |
| 234 | and Ord_range_wellfoundedrank = M_wfrank.Ord_range_wellfoundedrank [OF M_wfrank_L] | |
| 235 | and function_wellfoundedrank = M_wfrank.function_wellfoundedrank [OF M_wfrank_L] | |
| 236 | and domain_wellfoundedrank = M_wfrank.domain_wellfoundedrank [OF M_wfrank_L] | |
| 237 | and wellfoundedrank_type = M_wfrank.wellfoundedrank_type [OF M_wfrank_L] | |
| 238 | and Ord_wellfoundedrank = M_wfrank.Ord_wellfoundedrank [OF M_wfrank_L] | |
| 239 | and wellfoundedrank_eq = M_wfrank.wellfoundedrank_eq [OF M_wfrank_L] | |
| 240 | and wellfoundedrank_lt = M_wfrank.wellfoundedrank_lt [OF M_wfrank_L] | |
| 241 | and wellfounded_imp_subset_rvimage = M_wfrank.wellfounded_imp_subset_rvimage [OF M_wfrank_L] | |
| 242 | and wellfounded_imp_wf = M_wfrank.wellfounded_imp_wf [OF M_wfrank_L] | |
| 243 | and wellfounded_on_imp_wf_on = M_wfrank.wellfounded_on_imp_wf_on [OF M_wfrank_L] | |
| 244 | and wf_abs = M_wfrank.wf_abs [OF M_wfrank_L] | |
| 245 | and wf_on_abs = M_wfrank.wf_on_abs [OF M_wfrank_L] | |
| 246 | ||
| 247 | end |