13543

1 
(* Title: ZF/Constructible/AC_in_L.thy


2 
ID: $Id$


3 
Author: Lawrence C Paulson, Cambridge University Computer Laboratory


4 
*)


5 


6 
header {* The Axiom of Choice Holds in L! *}


7 


8 
theory AC_in_L = Formula:


9 


10 
subsection{*Extending a Wellordering over a List  Lexicographic Power*}


11 


12 
text{*This could be moved into a library.*}


13 


14 
consts


15 
rlist :: "[i,i]=>i"


16 


17 
inductive


18 
domains "rlist(A,r)" \<subseteq> "list(A) * list(A)"


19 
intros


20 
shorterI:

13692

21 
"[ length(l') < length(l); l' \<in> list(A); l \<in> list(A) ]

13543

22 
==> <l', l> \<in> rlist(A,r)"


23 


24 
sameI:

13692

25 
"[ <l',l> \<in> rlist(A,r); a \<in> A ]

13543

26 
==> <Cons(a,l'), Cons(a,l)> \<in> rlist(A,r)"


27 


28 
diffI:

13692

29 
"[ length(l') = length(l); <a',a> \<in> r;


30 
l' \<in> list(A); l \<in> list(A); a' \<in> A; a \<in> A ]

13543

31 
==> <Cons(a',l'), Cons(a,l)> \<in> rlist(A,r)"


32 
type_intros list.intros


33 


34 


35 
subsubsection{*Type checking*}


36 


37 
lemmas rlist_type = rlist.dom_subset


38 


39 
lemmas field_rlist = rlist_type [THEN field_rel_subset]


40 


41 
subsubsection{*Linearity*}


42 


43 
lemma rlist_Nil_Cons [intro]:


44 
"[a \<in> A; l \<in> list(A)] ==> <[], Cons(a,l)> \<in> rlist(A, r)"

13692

45 
by (simp add: shorterI)

13543

46 


47 
lemma linear_rlist:


48 
"linear(A,r) ==> linear(list(A),rlist(A,r))"


49 
apply (simp (no_asm_simp) add: linear_def)

13692

50 
apply (rule ballI)


51 
apply (induct_tac x)


52 
apply (rule ballI)


53 
apply (induct_tac y)


54 
apply (simp_all add: shorterI)


55 
apply (rule ballI)


56 
apply (erule_tac a=y in list.cases)


57 
apply (rename_tac [2] a2 l2)

13543

58 
apply (rule_tac [2] i = "length(l)" and j = "length(l2)" in Ord_linear_lt)

13692

59 
apply (simp_all add: shorterI)


60 
apply (erule_tac x=a and y=a2 in linearE)


61 
apply (simp_all add: diffI)


62 
apply (blast intro: sameI)

13543

63 
done


64 


65 


66 
subsubsection{*Wellfoundedness*}


67 


68 
text{*Nothing preceeds Nil in this ordering.*}


69 
inductive_cases rlist_NilE: " <l,[]> \<in> rlist(A,r)"


70 


71 
inductive_cases rlist_ConsE: " <l', Cons(x,l)> \<in> rlist(A,r)"


72 


73 
lemma not_rlist_Nil [simp]: " <l,[]> \<notin> rlist(A,r)"


74 
by (blast intro: elim: rlist_NilE)


75 


76 
lemma rlist_imp_length_le: "<l',l> \<in> rlist(A,r) ==> length(l') \<le> length(l)"


77 
apply (erule rlist.induct)

13692

78 
apply (simp_all add: leI)

13543

79 
done


80 


81 
lemma wf_on_rlist_n:


82 
"[ n \<in> nat; wf[A](r) ] ==> wf[{l \<in> list(A). length(l) = n}](rlist(A,r))"

13692

83 
apply (induct_tac n)


84 
apply (rule wf_onI2, simp)


85 
apply (rule wf_onI2, clarify)


86 
apply (erule_tac a=y in list.cases, clarify)

13543

87 
apply (simp (no_asm_use))

13692

88 
apply clarify

13543

89 
apply (simp (no_asm_use))


90 
apply (subgoal_tac "\<forall>l2 \<in> list(A). length(l2) = x > Cons(a,l2) \<in> B", blast)


91 
apply (erule_tac a=a in wf_on_induct, assumption)


92 
apply (rule ballI)

13692

93 
apply (rule impI)

13543

94 
apply (erule_tac a=l2 in wf_on_induct, blast, clarify)

13692

95 
apply (rename_tac a' l2 l')


96 
apply (drule_tac x="Cons(a',l')" in bspec, typecheck)


97 
apply simp


98 
apply (erule mp, clarify)

13543

99 
apply (erule rlist_ConsE, auto)


100 
done


101 


102 
lemma list_eq_UN_length: "list(A) = (\<Union>n\<in>nat. {l \<in> list(A). length(l) = n})"


103 
by (blast intro: length_type)


104 


105 


106 
lemma wf_on_rlist: "wf[A](r) ==> wf[list(A)](rlist(A,r))"

13692

107 
apply (subst list_eq_UN_length)


108 
apply (rule wf_on_Union)

13543

109 
apply (rule wf_imp_wf_on [OF wf_Memrel [of nat]])


110 
apply (simp add: wf_on_rlist_n)

13692

111 
apply (frule rlist_type [THEN subsetD])


112 
apply (simp add: length_type)

13543

113 
apply (drule rlist_imp_length_le)

13692

114 
apply (erule leE)


115 
apply (simp_all add: lt_def)

13543

116 
done


117 


118 


119 
lemma wf_rlist: "wf(r) ==> wf(rlist(field(r),r))"


120 
apply (simp add: wf_iff_wf_on_field)


121 
apply (rule wf_on_subset_A [OF _ field_rlist])

13692

122 
apply (blast intro: wf_on_rlist)

13543

123 
done


124 


125 
lemma well_ord_rlist:


126 
"well_ord(A,r) ==> well_ord(list(A), rlist(A,r))"


127 
apply (rule well_ordI)


128 
apply (simp add: well_ord_def wf_on_rlist)


129 
apply (simp add: well_ord_def tot_ord_def linear_rlist)


130 
done


131 


132 


133 
subsection{*An Injection from Formulas into the Natural Numbers*}


134 


135 
text{*There is a wellknown bijection between @{term "nat*nat"} and @{term


136 
nat} given by the expression f(m,n) = triangle(m+n) + m, where triangle(k)


137 
enumerates the triangular numbers and can be defined by triangle(0)=0,


138 
triangle(succ(k)) = succ(k + triangle(k)). Some small amount of effort is

13692

139 
needed to show that f is a bijection. We already know that such a bijection exists by the theorem @{text well_ord_InfCard_square_eq}:


140 
@{thm[display] well_ord_InfCard_square_eq[no_vars]}

13543

141 

13692

142 
However, this result merely states that there is a bijection between the two


143 
sets. It provides no means of naming a specific bijection. Therefore, we


144 
conduct the proofs under the assumption that a bijection exists. The simplest


145 
way to organize this is to use a locale.*}


146 


147 
text{*Locale for any arbitrary injection between @{term "nat*nat"}

13543

148 
and @{term nat}*}


149 
locale Nat_Times_Nat =


150 
fixes fn


151 
assumes fn_inj: "fn \<in> inj(nat*nat, nat)"


152 


153 


154 
consts enum :: "[i,i]=>i"


155 
primrec


156 
"enum(f, Member(x,y)) = f ` <0, f ` <x,y>>"


157 
"enum(f, Equal(x,y)) = f ` <1, f ` <x,y>>"


158 
"enum(f, Nand(p,q)) = f ` <2, f ` <enum(f,p), enum(f,q)>>"


159 
"enum(f, Forall(p)) = f ` <succ(2), enum(f,p)>"


160 


161 
lemma (in Nat_Times_Nat) fn_type [TC,simp]:


162 
"[x \<in> nat; y \<in> nat] ==> fn`<x,y> \<in> nat"

13692

163 
by (blast intro: inj_is_fun [OF fn_inj] apply_funtype)

13543

164 


165 
lemma (in Nat_Times_Nat) fn_iff:

13692

166 
"[x \<in> nat; y \<in> nat; u \<in> nat; v \<in> nat]

13543

167 
==> (fn`<x,y> = fn`<u,v>) <> (x=u & y=v)"

13692

168 
by (blast dest: inj_apply_equality [OF fn_inj])

13543

169 


170 
lemma (in Nat_Times_Nat) enum_type [TC,simp]:


171 
"p \<in> formula ==> enum(fn,p) \<in> nat"

13692

172 
by (induct_tac p, simp_all)

13543

173 


174 
lemma (in Nat_Times_Nat) enum_inject [rule_format]:


175 
"p \<in> formula ==> \<forall>q\<in>formula. enum(fn,p) = enum(fn,q) > p=q"

13692

176 
apply (induct_tac p, simp_all)


177 
apply (rule ballI)


178 
apply (erule formula.cases)


179 
apply (simp_all add: fn_iff)


180 
apply (rule ballI)


181 
apply (erule formula.cases)


182 
apply (simp_all add: fn_iff)


183 
apply (rule ballI)


184 
apply (erule_tac a=qa in formula.cases)


185 
apply (simp_all add: fn_iff)


186 
apply blast


187 
apply (rule ballI)


188 
apply (erule_tac a=q in formula.cases)


189 
apply (simp_all add: fn_iff, blast)

13543

190 
done


191 


192 
lemma (in Nat_Times_Nat) inj_formula_nat:


193 
"(\<lambda>p \<in> formula. enum(fn,p)) \<in> inj(formula, nat)"

13692

194 
apply (simp add: inj_def lam_type)


195 
apply (blast intro: enum_inject)

13543

196 
done


197 


198 
lemma (in Nat_Times_Nat) well_ord_formula:


199 
"well_ord(formula, measure(formula, enum(fn)))"


200 
apply (rule well_ord_measure, simp)

13692

201 
apply (blast intro: enum_inject)

13543

202 
done


203 


204 
lemmas nat_times_nat_lepoll_nat =


205 
InfCard_nat [THEN InfCard_square_eqpoll, THEN eqpoll_imp_lepoll]


206 


207 


208 
text{*Not neededbut interesting?*}


209 
theorem formula_lepoll_nat: "formula \<lesssim> nat"


210 
apply (insert nat_times_nat_lepoll_nat)


211 
apply (unfold lepoll_def)

13692

212 
apply (blast intro: Nat_Times_Nat.inj_formula_nat Nat_Times_Nat.intro)


213 
done


214 


215 


216 
subsection{*Defining the Wellordering on @{term "DPow(A)"}*}


217 


218 
text{*The objective is to build a wellordering on @{term "DPow(A)"} from a


219 
given one on @{term A}. We first introduce wellorderings for environments,


220 
which are lists built over @{term "A"}. We combine it with the enumeration of


221 
formulas. The order type of the resulting wellordering gives us a map from


222 
(environment, formula) pairs into the ordinals. For each member of @{term


223 
"DPow(A)"}, we take the minimum such ordinal. This yields a wellordering of


224 
@{term "DPow(A)A"}, namely the set of elements just introduced, which we then


225 
extend to the full set @{term "DPow(A)"}.*}


226 


227 
constdefs


228 
env_form_r :: "[i,i,i]=>i"


229 
{*wellordering on (environment, formula) pairs*}


230 
"env_form_r(f,r,A) ==


231 
rmult(list(A), rlist(A, r),


232 
formula, measure(formula, enum(f)))"


233 


234 
env_form_map :: "[i,i,i,i]=>i"


235 
{*map from (environment, formula) pairs to ordinals*}


236 
"env_form_map(f,r,A,z)


237 
== ordermap(list(A) * formula, env_form_r(f,r,A)) ` z"


238 


239 
DPow_new_ord :: "[i,i,i,i,i]=>o"


240 
{*predicate that holds if @{term k} is a valid index for @{term X}*}


241 
"DPow_new_ord(f,r,A,X,k) ==


242 
\<exists>env \<in> list(A). \<exists>p \<in> formula.


243 
arity(p) \<le> succ(length(env)) &


244 
X = {x\<in>A. sats(A, p, Cons(x,env))} &


245 
env_form_map(f,r,A,<env,p>) = k"


246 


247 
DPow_new_least :: "[i,i,i,i]=>i"


248 
{*function yielding the smallest index for @{term X}*}


249 
"DPow_new_least(f,r,A,X) == \<mu>k. DPow_new_ord(f,r,A,X,k)"


250 


251 
DPow_new_r :: "[i,i,i]=>i"


252 
{*a wellordering on the difference set @{term "DPow(A)A"}*}


253 
"DPow_new_r(f,r,A) == measure(DPow(A)A, DPow_new_least(f,r,A))"


254 


255 
DPow_r :: "[i,i,i]=>i"


256 
{*a wellordering on @{term "DPow(A)"}*}


257 
"DPow_r(f,r,A) == (DPow_new_r(f,r,A) Un (A * (DPow(A)A))) Un r"


258 


259 


260 
lemma (in Nat_Times_Nat) well_ord_env_form_r:


261 
"well_ord(A,r)


262 
==> well_ord(list(A) * formula, env_form_r(fn,r,A))"


263 
by (simp add: env_form_r_def well_ord_rmult well_ord_rlist well_ord_formula)


264 


265 
lemma (in Nat_Times_Nat) Ord_env_form_map:


266 
"[well_ord(A,r); z \<in> list(A) * formula]


267 
==> Ord(env_form_map(fn,r,A,z))"


268 
by (simp add: env_form_map_def Ord_ordermap well_ord_env_form_r)


269 


270 
lemma DPow_imp_ex_DPow_new_ord:


271 
"X \<in> DPow(A) ==> \<exists>k. DPow_new_ord(fn,r,A,X,k)"


272 
apply (simp add: DPow_new_ord_def)


273 
apply (blast dest!: DPowD)


274 
done


275 


276 
lemma (in Nat_Times_Nat) DPow_new_ord_imp_Ord:


277 
"[DPow_new_ord(fn,r,A,X,k); well_ord(A,r)] ==> Ord(k)"


278 
apply (simp add: DPow_new_ord_def, clarify)


279 
apply (simp add: Ord_env_form_map)

13543

280 
done


281 

13692

282 
lemma (in Nat_Times_Nat) DPow_imp_DPow_new_least:


283 
"[X \<in> DPow(A); well_ord(A,r)]


284 
==> DPow_new_ord(fn, r, A, X, DPow_new_least(fn,r,A,X))"


285 
apply (simp add: DPow_new_least_def)


286 
apply (blast dest: DPow_imp_ex_DPow_new_ord intro: DPow_new_ord_imp_Ord LeastI)


287 
done


288 


289 
lemma (in Nat_Times_Nat) env_form_map_inject:


290 
"[env_form_map(fn,r,A,u) = env_form_map(fn,r,A,v); well_ord(A,r);


291 
u \<in> list(A) * formula; v \<in> list(A) * formula]


292 
==> u=v"


293 
apply (simp add: env_form_map_def)


294 
apply (rule inj_apply_equality [OF bij_is_inj, OF ordermap_bij,


295 
OF well_ord_env_form_r], assumption+)


296 
done


297 


298 


299 
lemma (in Nat_Times_Nat) DPow_new_ord_unique:


300 
"[DPow_new_ord(fn,r,A,X,k); DPow_new_ord(fn,r,A,Y,k); well_ord(A,r)]


301 
==> X=Y"


302 
apply (simp add: DPow_new_ord_def, clarify)


303 
apply (drule env_form_map_inject, auto)


304 
done


305 


306 
lemma (in Nat_Times_Nat) well_ord_DPow_new_r:


307 
"well_ord(A,r) ==> well_ord(DPow(A)A, DPow_new_r(fn,r,A))"


308 
apply (simp add: DPow_new_r_def)


309 
apply (rule well_ord_measure)


310 
apply (simp add: DPow_new_least_def Ord_Least, clarify)


311 
apply (drule DPow_imp_DPow_new_least, assumption)+


312 
apply simp


313 
apply (blast intro: DPow_new_ord_unique)


314 
done


315 


316 
lemma DPow_new_r_subset: "DPow_new_r(f,r,A) <= (DPow(A)A) * (DPow(A)A)"


317 
by (simp add: DPow_new_r_def measure_type)


318 


319 
lemma (in Nat_Times_Nat) linear_DPow_r:


320 
"well_ord(A,r)


321 
==> linear(DPow(A), DPow_r(fn, r, A))"


322 
apply (frule well_ord_DPow_new_r)


323 
apply (drule well_ord_is_linear)+


324 
apply (auto simp add: linear_def DPow_r_def)


325 
done


326 


327 


328 
lemma (in Nat_Times_Nat) wf_DPow_new_r:


329 
"well_ord(A,r) ==> wf(DPow_new_r(fn,r,A))"


330 
apply (rule well_ord_DPow_new_r [THEN well_ord_is_wf, THEN wf_on_imp_wf],


331 
assumption+)


332 
apply (rule DPow_new_r_subset)


333 
done


334 


335 
lemma (in Nat_Times_Nat) well_ord_DPow_r:


336 
"[well_ord(A,r); r \<subseteq> A * A]


337 
==> well_ord(DPow(A), DPow_r(fn,r,A))"


338 
apply (rule well_ordI [OF wf_imp_wf_on])


339 
prefer 2 apply (blast intro: linear_DPow_r)


340 
apply (simp add: DPow_r_def)


341 
apply (rule wf_Un)


342 
apply (cut_tac DPow_new_r_subset [of fn r A], blast)


343 
apply (rule wf_Un)


344 
apply (cut_tac DPow_new_r_subset [of fn r A], blast)


345 
apply (blast intro: wf_DPow_new_r)


346 
apply (simp add: wf_times Diff_disjoint)


347 
apply (blast intro: well_ord_is_wf wf_on_imp_wf)


348 
done


349 


350 
lemma (in Nat_Times_Nat) DPow_r_type:


351 
"[r \<subseteq> A * A; A \<subseteq> DPow(A)]


352 
==> DPow_r(fn,r,A) \<subseteq> DPow(A) * DPow(A)"


353 
apply (simp add: DPow_r_def DPow_new_r_def measure_def, blast)


354 
done


355 

13543

356 


357 
subsection{*Limit Construction for WellOrderings*}


358 


359 
text{*Now we work towards the transfinite definition of wellorderings for


360 
@{term "Lset(i)"}. We assume as an inductive hypothesis that there is a family


361 
of wellorderings for smaller ordinals.*}


362 


363 
constdefs

13692

364 
rlimit :: "[i,i=>i]=>i"


365 
{*expresses the wellordering at limit ordinals.*}


366 
"rlimit(i,r) ==


367 
{z: Lset(i) * Lset(i).


368 
\<exists>x' x. z = <x',x> &


369 
(lrank(x') < lrank(x) 


370 
(lrank(x') = lrank(x) & <x',x> \<in> r(succ(lrank(x)))))}"


371 

13543

372 
Lset_new :: "i=>i"

13692

373 
{*This constant denotes the set of elements introduced at level


374 
@{term "succ(i)"}*}

13543

375 
"Lset_new(i) == {x \<in> Lset(succ(i)). lrank(x) = i}"


376 


377 
lemma Lset_new_iff_lrank_eq:


378 
"Ord(i) ==> x \<in> Lset_new(i) <> L(x) & lrank(x) = i"

13692

379 
by (auto simp add: Lset_new_def Lset_iff_lrank_lt)

13543

380 


381 
lemma Lset_new_eq:


382 
"Ord(i) ==> Lset_new(i) = Lset(succ(i))  Lset(i)"


383 
apply (rule equality_iffI)

13692

384 
apply (simp add: Lset_new_iff_lrank_eq Lset_iff_lrank_lt, auto)


385 
apply (blast elim: leE)

13543

386 
done


387 


388 
lemma Limit_Lset_eq2:


389 
"Limit(i) ==> Lset(i) = (\<Union>j\<in>i. Lset_new(j))"

13692

390 
apply (simp add: Limit_Lset_eq)

13543

391 
apply (rule equalityI)


392 
apply safe


393 
apply (subgoal_tac "Ord(y)")


394 
prefer 2 apply (blast intro: Ord_in_Ord Limit_is_Ord)

13692

395 
apply (simp_all add: Limit_is_Ord Lset_iff_lrank_lt Lset_new_def


396 
Ord_mem_iff_lt)


397 
apply (blast intro: lt_trans)

13543

398 
apply (rule_tac x = "succ(lrank(x))" in bexI)

13692

399 
apply (simp add: Lset_succ_lrank_iff)


400 
apply (blast intro: Limit_has_succ ltD)

13543

401 
done


402 


403 
lemma wf_on_Lset:


404 
"wf[Lset(succ(j))](r(succ(j))) ==> wf[Lset_new(j)](rlimit(i,r))"

13692

405 
apply (simp add: wf_on_def Lset_new_def)


406 
apply (erule wf_subset)


407 
apply (force simp add: rlimit_def)

13543

408 
done


409 


410 
lemma wf_on_rlimit:


411 
"[Limit(i); \<forall>j<i. wf[Lset(j)](r(j)) ] ==> wf[Lset(i)](rlimit(i,r))"


412 
apply (simp add: Limit_Lset_eq2)


413 
apply (rule wf_on_Union)

13692

414 
apply (rule wf_imp_wf_on [OF wf_Memrel [of i]])


415 
apply (blast intro: wf_on_Lset Limit_has_succ Limit_is_Ord ltI)

13543

416 
apply (force simp add: rlimit_def Limit_is_Ord Lset_iff_lrank_lt Lset_new_def


417 
Ord_mem_iff_lt)


418 
done


419 


420 
lemma linear_rlimit:


421 
"[Limit(i); \<forall>j<i. linear(Lset(j), r(j)) ]


422 
==> linear(Lset(i), rlimit(i,r))"

13692

423 
apply (frule Limit_is_Ord)


424 
apply (simp add: Limit_Lset_eq2 Lset_new_def)


425 
apply (simp add: linear_def rlimit_def Ball_def lt_Ord Lset_iff_lrank_lt)


426 
apply (simp add: ltI, clarify)


427 
apply (rename_tac u v)


428 
apply (rule_tac i="lrank(u)" and j="lrank(v)" in Ord_linear_lt, simp_all)


429 
apply (drule_tac x="succ(lrank(u) Un lrank(v))" in ospec)


430 
apply (simp add: ltI)


431 
apply (drule_tac x=u in spec, simp)


432 
apply (drule_tac x=v in spec, simp)

13543

433 
done


434 


435 
lemma well_ord_rlimit:


436 
"[Limit(i); \<forall>j<i. well_ord(Lset(j), r(j)) ]


437 
==> well_ord(Lset(i), rlimit(i,r))"

13692

438 
by (blast intro: well_ordI wf_on_rlimit well_ord_is_wf


439 
linear_rlimit well_ord_is_linear)

13543

440 


441 


442 
subsection{*Transfinite Definition of the Wellordering on @{term "L"}*}


443 


444 
constdefs


445 
L_r :: "[i, i] => i"

13692

446 
"L_r(f,i) ==


447 
transrec(i, \<lambda>x r.

13543

448 
if x=0 then 0


449 
else if Limit(x) then rlimit(x, \<lambda>y. r`y)

13692

450 
else DPow_r(f, r ` Arith.pred(x), Lset(Arith.pred(x))))"

13543

451 


452 
subsubsection{*The Corresponding Recursion Equations*}


453 
lemma [simp]: "L_r(f,0) = 0"


454 
by (simp add: def_transrec [OF L_r_def])


455 

13692

456 
lemma [simp]: "Ord(i) ==> L_r(f, succ(i)) = DPow_r(f, L_r(f,i), Lset(i))"

13543

457 
by (simp add: def_transrec [OF L_r_def])


458 


459 
text{*Needed to handle the limit case*}


460 
lemma L_r_eq:

13692

461 
"Ord(i) ==>

13543

462 
L_r(f, i) =


463 
(if i = 0 then 0


464 
else if Limit(i) then rlimit(i, op `(Lambda(i, L_r(f))))

13692

465 
else DPow_r (f, Lambda(i, L_r(f)) ` Arith.pred(i),


466 
Lset(Arith.pred(i))))"

13543

467 
apply (induct i rule: trans_induct3_rule)


468 
apply (simp_all add: def_transrec [OF L_r_def])


469 
done


470 

13692

471 
lemma rlimit_eqI:


472 
"[Limit(i); \<forall>j<i. r'(j) = r(j)] ==> rlimit(i,r) = rlimit(i,r')"


473 
apply (simp add: rlimit_def)


474 
apply (rule refl iff_refl Collect_cong ex_cong conj_cong)+


475 
apply (simp add: Limit_is_Ord Lset_lrank_lt)


476 
done


477 

13543

478 
text{*I don't know why the limit case is so complicated.*}


479 
lemma [simp]: "Limit(i) ==> L_r(f,i) = rlimit(i, L_r(f))"


480 
apply (simp add: Limit_nonzero def_transrec [OF L_r_def])


481 
apply (rule rlimit_eqI, assumption)


482 
apply (rule oallI)

13692

483 
apply (frule lt_Ord)


484 
apply (simp only: beta ltD L_r_eq [symmetric])

13543

485 
done


486 


487 
lemma (in Nat_Times_Nat) L_r_type:


488 
"Ord(i) ==> L_r(fn,i) \<subseteq> Lset(i) * Lset(i)"


489 
apply (induct i rule: trans_induct3_rule)

13692

490 
apply (simp_all add: Lset_succ DPow_r_type well_ord_DPow_r rlimit_def


491 
Transset_subset_DPow [OF Transset_Lset], blast)

13543

492 
done


493 


494 
lemma (in Nat_Times_Nat) well_ord_L_r:


495 
"Ord(i) ==> well_ord(Lset(i), L_r(fn,i))"


496 
apply (induct i rule: trans_induct3_rule)

13692

497 
apply (simp_all add: well_ord0 Lset_succ L_r_type well_ord_DPow_r


498 
well_ord_rlimit ltD)

13543

499 
done


500 


501 
lemma well_ord_L_r:


502 
"Ord(i) ==> \<exists>r. well_ord(Lset(i), r)"


503 
apply (insert nat_times_nat_lepoll_nat)


504 
apply (unfold lepoll_def)

13692

505 
apply (blast intro: Nat_Times_Nat.well_ord_L_r Nat_Times_Nat.intro)

13543

506 
done


507 


508 


509 
text{*Locale for proving results under the assumption @{text "V=L"}*}


510 
locale V_equals_L =


511 
assumes VL: "L(x)"


512 


513 
text{*The Axiom of Choice holds in @{term L}! Or, to be precise, the


514 
Wellordering Theorem.*}


515 
theorem (in V_equals_L) AC: "\<exists>r. well_ord(x,r)"

13692

516 
apply (insert Transset_Lset VL [of x])

13543

517 
apply (simp add: Transset_def L_def)

13692

518 
apply (blast dest!: well_ord_L_r intro: well_ord_subset)

13543

519 
done


520 


521 
end
