paulson@13551: (* Title \ Zorn.thy paulson@13551: ID \ $Id$ paulson@13551: Author \ Jacques D. Fleuriot paulson@13551: Copyright \ 1998 University of Cambridge paulson@13551: Description \ Zorn's Lemma -- See Larry Paulson's Zorn.thy in ZF paulson@13551: *) paulson@13551: paulson@13551: header {*Zorn's Lemma*} paulson@13551: paulson@13551: theory Zorn = Main: paulson@13551: paulson@13551: text{*The lemma and section numbers refer to an unpublished article ``Towards paulson@13551: the Mechanization of the Proofs of Some Classical Theorems of Set Theory,'' by paulson@13551: Abrial and Laffitte. *} paulson@13551: paulson@13551: constdefs paulson@13551: chain :: "'a::ord set => 'a set set" paulson@13551: "chain S == {F. F \ S & (\x \ F. \y \ F. x \ y | y \ x)}" paulson@13551: paulson@13551: super :: "['a::ord set,'a set] => 'a set set" paulson@13551: "super S c == {d. d \ chain(S) & c < d}" paulson@13551: paulson@13551: maxchain :: "'a::ord set => 'a set set" paulson@13551: "maxchain S == {c. c \ chain S & super S c = {}}" paulson@13551: paulson@13551: succ :: "['a::ord set,'a set] => 'a set" paulson@13551: "succ S c == if (c \ chain S| c \ maxchain S) paulson@13551: then c else (@c'. c': (super S c))" paulson@13551: paulson@13551: consts paulson@13551: "TFin" :: "'a::ord set => 'a set set" paulson@13551: paulson@13551: inductive "TFin(S)" paulson@13551: intros paulson@13551: succI: "x \ TFin S ==> succ S x \ TFin S" paulson@13551: Pow_UnionI: "Y \ Pow(TFin S) ==> Union(Y) \ TFin S" paulson@13551: paulson@13551: monos Pow_mono paulson@13551: paulson@13551: paulson@13551: subsection{*Mathematical Preamble*} paulson@13551: paulson@13551: lemma Union_lemma0: "(\x \ C. x \ A | B \ x) ==> Union(C)<=A | B \ Union(C)" paulson@13551: by blast paulson@13551: paulson@13551: paulson@13551: text{*This is theorem @{text increasingD2} of ZF/Zorn.thy*} paulson@13551: lemma Abrial_axiom1: "x \ succ S x" paulson@13551: apply (unfold succ_def) paulson@13551: apply (rule split_if [THEN iffD2]) paulson@13551: apply (auto simp add: super_def maxchain_def psubset_def) paulson@13551: apply (rule swap, assumption) paulson@13551: apply (rule someI2, blast+) paulson@13551: done paulson@13551: paulson@13551: lemmas TFin_UnionI = TFin.Pow_UnionI [OF PowI] paulson@13551: paulson@13551: lemma TFin_induct: paulson@13551: "[| n \ TFin S; paulson@13551: !!x. [| x \ TFin S; P(x) |] ==> P(succ S x); paulson@13551: !!Y. [| Y \ TFin S; Ball Y P |] ==> P(Union Y) |] paulson@13551: ==> P(n)" paulson@13551: apply (erule TFin.induct, blast+) paulson@13551: done paulson@13551: paulson@13551: lemma succ_trans: "x \ y ==> x \ succ S y" paulson@13551: apply (erule subset_trans) paulson@13551: apply (rule Abrial_axiom1) paulson@13551: done paulson@13551: paulson@13551: text{*Lemma 1 of section 3.1*} paulson@13551: lemma TFin_linear_lemma1: paulson@13551: "[| n \ TFin S; m \ TFin S; paulson@13551: \x \ TFin S. x \ m --> x = m | succ S x \ m paulson@13551: |] ==> n \ m | succ S m \ n" paulson@13551: apply (erule TFin_induct) paulson@13551: apply (erule_tac [2] Union_lemma0) txt{*or just Blast_tac*} paulson@13551: apply (blast del: subsetI intro: succ_trans) paulson@13551: done paulson@13551: paulson@13551: text{* Lemma 2 of section 3.2 *} paulson@13551: lemma TFin_linear_lemma2: paulson@13551: "m \ TFin S ==> \n \ TFin S. n \ m --> n=m | succ S n \ m" paulson@13551: apply (erule TFin_induct) paulson@13551: apply (rule impI [THEN ballI]) paulson@13551: txt{*case split using TFin_linear_lemma1*} paulson@13551: apply (rule_tac n1 = n and m1 = x in TFin_linear_lemma1 [THEN disjE], paulson@13551: assumption+) paulson@13551: apply (drule_tac x = n in bspec, assumption) paulson@13551: apply (blast del: subsetI intro: succ_trans, blast) paulson@13551: txt{*second induction step*} paulson@13551: apply (rule impI [THEN ballI]) paulson@13551: apply (rule Union_lemma0 [THEN disjE]) paulson@13551: apply (rule_tac [3] disjI2) paulson@13551: prefer 2 apply blast paulson@13551: apply (rule ballI) paulson@13551: apply (rule_tac n1 = n and m1 = x in TFin_linear_lemma1 [THEN disjE], paulson@13551: assumption+, auto) paulson@13551: apply (blast intro!: Abrial_axiom1 [THEN subsetD]) paulson@13551: done paulson@13551: paulson@13551: text{*Re-ordering the premises of Lemma 2*} paulson@13551: lemma TFin_subsetD: paulson@13551: "[| n \ m; m \ TFin S; n \ TFin S |] ==> n=m | succ S n \ m" paulson@13551: apply (rule TFin_linear_lemma2 [rule_format]) paulson@13551: apply (assumption+) paulson@13551: done paulson@13551: paulson@13551: text{*Consequences from section 3.3 -- Property 3.2, the ordering is total*} paulson@13551: lemma TFin_subset_linear: "[| m \ TFin S; n \ TFin S|] ==> n \ m | m \ n" paulson@13551: apply (rule disjE) paulson@13551: apply (rule TFin_linear_lemma1 [OF _ _TFin_linear_lemma2]) paulson@13551: apply (assumption+, erule disjI2) paulson@13551: apply (blast del: subsetI paulson@13551: intro: subsetI Abrial_axiom1 [THEN subset_trans]) paulson@13551: done paulson@13551: paulson@13551: text{*Lemma 3 of section 3.3*} paulson@13551: lemma eq_succ_upper: "[| n \ TFin S; m \ TFin S; m = succ S m |] ==> n \ m" paulson@13551: apply (erule TFin_induct) paulson@13551: apply (drule TFin_subsetD) paulson@13551: apply (assumption+, force, blast) paulson@13551: done paulson@13551: paulson@13551: text{*Property 3.3 of section 3.3*} paulson@13551: lemma equal_succ_Union: "m \ TFin S ==> (m = succ S m) = (m = Union(TFin S))" paulson@13551: apply (rule iffI) paulson@13551: apply (rule Union_upper [THEN equalityI]) paulson@13551: apply (rule_tac [2] eq_succ_upper [THEN Union_least]) paulson@13551: apply (assumption+) paulson@13551: apply (erule ssubst) paulson@13551: apply (rule Abrial_axiom1 [THEN equalityI]) paulson@13551: apply (blast del: subsetI paulson@13551: intro: subsetI TFin_UnionI TFin.succI) paulson@13551: done paulson@13551: paulson@13551: subsection{*Hausdorff's Theorem: Every Set Contains a Maximal Chain.*} paulson@13551: paulson@13551: text{*NB: We assume the partial ordering is @{text "\"}, paulson@13551: the subset relation!*} paulson@13551: paulson@13551: lemma empty_set_mem_chain: "({} :: 'a set set) \ chain S" paulson@13551: by (unfold chain_def, auto) paulson@13551: paulson@13551: lemma super_subset_chain: "super S c \ chain S" paulson@13551: by (unfold super_def, fast) paulson@13551: paulson@13551: lemma maxchain_subset_chain: "maxchain S \ chain S" paulson@13551: by (unfold maxchain_def, fast) paulson@13551: paulson@13551: lemma mem_super_Ex: "c \ chain S - maxchain S ==> ? d. d \ super S c" paulson@13551: by (unfold super_def maxchain_def, auto) paulson@13551: paulson@13551: lemma select_super: "c \ chain S - maxchain S ==> paulson@13551: (@c'. c': super S c): super S c" paulson@13551: apply (erule mem_super_Ex [THEN exE]) paulson@13551: apply (rule someI2, auto) paulson@13551: done paulson@13551: paulson@13551: lemma select_not_equals: "c \ chain S - maxchain S ==> paulson@13551: (@c'. c': super S c) \ c" paulson@13551: apply (rule notI) paulson@13551: apply (drule select_super) paulson@13551: apply (simp add: super_def psubset_def) paulson@13551: done paulson@13551: paulson@13551: lemma succI3: "c \ chain S - maxchain S ==> succ S c = (@c'. c': super S c)" paulson@13551: apply (unfold succ_def) paulson@13551: apply (fast intro!: if_not_P) paulson@13551: done paulson@13551: paulson@13551: lemma succ_not_equals: "c \ chain S - maxchain S ==> succ S c \ c" paulson@13551: apply (frule succI3) paulson@13551: apply (simp (no_asm_simp)) paulson@13551: apply (rule select_not_equals, assumption) paulson@13551: done paulson@13551: paulson@13551: lemma TFin_chain_lemma4: "c \ TFin S ==> (c :: 'a set set): chain S" paulson@13551: apply (erule TFin_induct) paulson@13551: apply (simp add: succ_def select_super [THEN super_subset_chain[THEN subsetD]]) paulson@13551: apply (unfold chain_def) paulson@13551: apply (rule CollectI, safe) paulson@13551: apply (drule bspec, assumption) paulson@13551: apply (rule_tac [2] m1 = Xa and n1 = X in TFin_subset_linear [THEN disjE], paulson@13551: blast+) paulson@13551: done paulson@13551: paulson@13551: theorem Hausdorff: "\c. (c :: 'a set set): maxchain S" paulson@13551: apply (rule_tac x = "Union (TFin S) " in exI) paulson@13551: apply (rule classical) paulson@13551: apply (subgoal_tac "succ S (Union (TFin S)) = Union (TFin S) ") paulson@13551: prefer 2 paulson@13551: apply (blast intro!: TFin_UnionI equal_succ_Union [THEN iffD2, symmetric]) paulson@13551: apply (cut_tac subset_refl [THEN TFin_UnionI, THEN TFin_chain_lemma4]) paulson@13551: apply (drule DiffI [THEN succ_not_equals], blast+) paulson@13551: done paulson@13551: paulson@13551: paulson@13551: subsection{*Zorn's Lemma: If All Chains Have Upper Bounds Then paulson@13551: There Is a Maximal Element*} paulson@13551: paulson@13551: lemma chain_extend: paulson@13551: "[| c \ chain S; z \ S; paulson@13551: \x \ c. x<=(z:: 'a set) |] ==> {z} Un c \ chain S" paulson@13551: by (unfold chain_def, blast) paulson@13551: paulson@13551: lemma chain_Union_upper: "[| c \ chain S; x \ c |] ==> x \ Union(c)" paulson@13551: by (unfold chain_def, auto) paulson@13551: paulson@13551: lemma chain_ball_Union_upper: "c \ chain S ==> \x \ c. x \ Union(c)" paulson@13551: by (unfold chain_def, auto) paulson@13551: paulson@13551: lemma maxchain_Zorn: paulson@13551: "[| c \ maxchain S; u \ S; Union(c) \ u |] ==> Union(c) = u" paulson@13551: apply (rule ccontr) paulson@13551: apply (simp add: maxchain_def) paulson@13551: apply (erule conjE) paulson@13551: apply (subgoal_tac " ({u} Un c) \ super S c") paulson@13551: apply simp paulson@13551: apply (unfold super_def psubset_def) paulson@13551: apply (blast intro: chain_extend dest: chain_Union_upper) paulson@13551: done paulson@13551: paulson@13551: theorem Zorn_Lemma: paulson@13551: "\c \ chain S. Union(c): S ==> \y \ S. \z \ S. y \ z --> y = z" paulson@13551: apply (cut_tac Hausdorff maxchain_subset_chain) paulson@13551: apply (erule exE) paulson@13551: apply (drule subsetD, assumption) paulson@13551: apply (drule bspec, assumption) paulson@13551: apply (rule_tac x = "Union (c) " in bexI) paulson@13551: apply (rule ballI, rule impI) paulson@13551: apply (blast dest!: maxchain_Zorn, assumption) paulson@13551: done paulson@13551: paulson@13551: subsection{*Alternative version of Zorn's Lemma*} paulson@13551: paulson@13551: lemma Zorn_Lemma2: paulson@13551: "\c \ chain S. \y \ S. \x \ c. x \ y paulson@13551: ==> \y \ S. \x \ S. (y :: 'a set) \ x --> y = x" paulson@13551: apply (cut_tac Hausdorff maxchain_subset_chain) paulson@13551: apply (erule exE) paulson@13551: apply (drule subsetD, assumption) paulson@13551: apply (drule bspec, assumption, erule bexE) paulson@13551: apply (rule_tac x = y in bexI) paulson@13551: prefer 2 apply assumption paulson@13551: apply clarify paulson@13551: apply (rule ccontr) paulson@13551: apply (frule_tac z = x in chain_extend) paulson@13551: apply (assumption, blast) paulson@13551: apply (unfold maxchain_def super_def psubset_def) paulson@13551: apply (blast elim!: equalityCE) paulson@13551: done paulson@13551: paulson@13551: text{*Various other lemmas*} paulson@13551: paulson@13551: lemma chainD: "[| c \ chain S; x \ c; y \ c |] ==> x \ y | y \ x" paulson@13551: by (unfold chain_def, blast) paulson@13551: paulson@13551: lemma chainD2: "!!(c :: 'a set set). c \ chain S ==> c \ S" paulson@13551: by (unfold chain_def, blast) paulson@13551: paulson@13551: end paulson@13551: