# HG changeset patch # User huffman # Date 1126027351 -7200 # Node ID a39d1430d271eb3948a301aa399cc805baecbffa # Parent 8608f7a881ebabdfe53c787b85c2cd00888165aa reimplement Filter.thy with locales diff -r 8608f7a881eb -r a39d1430d271 src/HOL/Hyperreal/Filter.thy --- a/src/HOL/Hyperreal/Filter.thy Tue Sep 06 19:10:43 2005 +0200 +++ b/src/HOL/Hyperreal/Filter.thy Tue Sep 06 19:22:31 2005 +0200 @@ -3,518 +3,359 @@ Author : Jacques D. Fleuriot Copyright : 1998 University of Cambridge Conversion to Isar and new proofs by Lawrence C Paulson, 2004 + Conversion to locales by Brian Huffman, 2005 *) -header{*Filters and Ultrafilters*} +header {* Filters and Ultrafilters *} theory Filter imports Zorn begin -constdefs - - is_Filter :: "['a set set,'a set] => bool" - "is_Filter F S == (F <= Pow(S) & S \ F & {} ~: F & - (\u \ F. \v \ F. u Int v \ F) & - (\u v. u \ F & u <= v & v <= S --> v \ F))" +subsection {* Definitions and basic properties *} - Filter :: "'a set => 'a set set set" - "Filter S == {X. is_Filter X S}" - - (* free filter does not contain any finite set *) - - Freefilter :: "'a set => 'a set set set" - "Freefilter S == {X. X \ Filter S & (\x \ X. ~ finite x)}" - - Ultrafilter :: "'a set => 'a set set set" - "Ultrafilter S == {X. X \ Filter S & (\A \ Pow(S). A \ X | S - A \ X)}" - - FreeUltrafilter :: "'a set => 'a set set set" - "FreeUltrafilter S == {X. X \ Ultrafilter S & (\x \ X. ~ finite x)}" +subsubsection {* Filters *} - (* A locale makes proof of Ultrafilter Theorem more modular *) -locale (open) UFT = - fixes frechet :: "'a set => 'a set set" - and superfrechet :: "'a set => 'a set set set" - assumes not_finite_UNIV: "~finite (UNIV :: 'a set)" - defines frechet_def: - "frechet S == {A. finite (S - A)}" - and superfrechet_def: - "superfrechet S == {G. G \ Filter S & frechet S <= G}" - - -(*------------------------------------------------------------------ - Properties of Filters and Freefilters - - rules for intro, destruction etc. - ------------------------------------------------------------------*) +locale filter = + fixes F :: "'a set set" + assumes UNIV [iff]: "UNIV \ F" + assumes empty [iff]: "{} \ F" + assumes Int: "\u \ F; v \ F\ \ u \ v \ F" + assumes subset: "\u \ F; u \ v\ \ v \ F" -lemma is_FilterD1: "is_Filter X S ==> X <= Pow(S)" -apply (simp add: is_Filter_def) -done - -lemma is_FilterD2: "is_Filter X S ==> X ~= {}" -apply (auto simp add: is_Filter_def) -done +lemma (in filter) memD: "A \ F \ - A \ F" +proof + assume "A \ F" and "- A \ F" + hence "A \ (- A) \ F" by (rule Int) + thus "False" by simp +qed -lemma is_FilterD3: "is_Filter X S ==> {} ~: X" -apply (simp add: is_Filter_def) -done - -lemma mem_FiltersetI: "is_Filter X S ==> X \ Filter S" -apply (simp add: Filter_def) -done - -lemma mem_FiltersetD: "X \ Filter S ==> is_Filter X S" -apply (simp add: Filter_def) -done +lemma (in filter) not_memI: "- A \ F \ A \ F" +by (drule memD, simp) -lemma Filter_empty_not_mem: "X \ Filter S ==> {} ~: X" -apply (erule mem_FiltersetD [THEN is_FilterD3]) -done +lemma (in filter) Int_iff: "(x \ y \ F) = (x \ F \ y \ F)" +by (auto elim: subset intro: Int) -lemmas Filter_empty_not_memE = Filter_empty_not_mem [THEN notE, standard] - -lemma mem_FiltersetD1: "[| X \ Filter S; A \ X; B \ X |] ==> A Int B \ X" -apply (unfold Filter_def is_Filter_def) -apply blast -done +subsubsection {* Ultrafilters *} -lemma mem_FiltersetD2: "[| X \ Filter S; A \ X; A <= B; B <= S|] ==> B \ X" -apply (unfold Filter_def is_Filter_def) -apply blast -done +locale ultrafilter = filter + + assumes ultra: "A \ F \ - A \ F" -lemma mem_FiltersetD3: "[| X \ Filter S; A \ X |] ==> A \ Pow S" -apply (unfold Filter_def is_Filter_def) -apply blast -done - -lemma mem_FiltersetD4: "X \ Filter S ==> S \ X" -apply (unfold Filter_def is_Filter_def) -apply blast -done +lemma (in ultrafilter) memI: "- A \ F \ A \ F" +by (cut_tac ultra [of A], simp) -lemma is_FilterI: - "[| X <= Pow(S); - S \ X; - X ~= {}; - {} ~: X; - \u \ X. \v \ X. u Int v \ X; - \u v. u \ X & u<=v & v<=S --> v \ X - |] ==> is_Filter X S" -apply (unfold is_Filter_def) -apply blast -done +lemma (in ultrafilter) not_memD: "A \ F \ - A \ F" +by (rule memI, simp) + +lemma (in ultrafilter) not_mem_iff: "(A \ F) = (- A \ F)" +by (rule iffI [OF not_memD not_memI]) -lemma mem_FiltersetI2: "[| X <= Pow(S); - S \ X; - X ~= {}; - {} ~: X; - \u \ X. \v \ X. u Int v \ X; - \u v. u \ X & u<=v & v<=S --> v \ X - |] ==> X \ Filter S" -by (blast intro: mem_FiltersetI is_FilterI) +lemma (in ultrafilter) Compl_iff: "(- A \ F) = (A \ F)" +by (rule iffI [OF not_memI not_memD]) -lemma is_FilterE_lemma: - "is_Filter X S ==> X <= Pow(S) & - S \ X & - X ~= {} & - {} ~: X & - (\u \ X. \v \ X. u Int v \ X) & - (\u v. u \ X & u <= v & v<=S --> v \ X)" -apply (unfold is_Filter_def) -apply fast +lemma (in ultrafilter) Un_iff: "(x \ y \ F) = (x \ F \ y \ F)" + apply (rule iffI) + apply (erule contrapos_pp) + apply (simp add: Int_iff not_mem_iff) + apply (auto elim: subset) done -lemma memFiltersetE_lemma: - "X \ Filter S ==> X <= Pow(S) & - S \ X & - X ~= {} & - {} ~: X & - (\u \ X. \v \ X. u Int v \ X) & - (\u v. u \ X & u <= v & v<=S --> v \ X)" -by (erule mem_FiltersetD [THEN is_FilterE_lemma]) +subsubsection {* Free ultrafilters *} + +locale freeultrafilter = ultrafilter + + assumes infinite: "A \ F \ infinite A" -lemma Freefilter_Filter: "X \ Freefilter S ==> X \ Filter S" -apply (simp add: Filter_def Freefilter_def) -done +lemma (in freeultrafilter) finite: "finite A \ A \ F" +by (erule contrapos_pn, erule infinite) + +lemma (in freeultrafilter) filter: "filter F" . + +lemma (in freeultrafilter) ultrafilter: "ultrafilter F" +by (rule ultrafilter.intro) -lemma mem_Freefilter_not_finite: "X \ Freefilter S ==> \y \ X. ~finite(y)" -apply (simp add: Freefilter_def) -done - -lemma mem_FreefiltersetD1: "[| X \ Freefilter S; x \ X |] ==> ~ finite x" -apply (blast dest!: mem_Freefilter_not_finite) -done +subsection {* Maximal filter = ultrafilter *} -lemmas mem_FreefiltersetE1 = mem_FreefiltersetD1 [THEN notE, standard] +text {* + A filter F is an ultrafilter iff it is a maximal filter, + i.e. whenever G is a filter and @{term "F \ G"} then @{term "F = G"} +*} +text {* + Lemmas that shows existence of an extension to what was assumed to + be a maximal filter. Will be used to derive contradiction in proof of + property of ultrafilter. +*} -lemma mem_FreefiltersetD2: "[| X \ Freefilter S; finite x|] ==> x ~: X" -apply (blast dest!: mem_Freefilter_not_finite) -done - -lemma mem_FreefiltersetI1: - "[| X \ Filter S; \x. ~(x \ X & finite x) |] ==> X \ Freefilter S" -by (simp add: Freefilter_def) +lemma extend_lemma1: "UNIV \ F \ A \ {X. \f\F. A \ f \ X}" +by blast -lemma mem_FreefiltersetI2: - "[| X \ Filter S; \x. (x ~: X | ~ finite x) |] ==> X \ Freefilter S" -by (simp add: Freefilter_def) - -lemma Filter_Int_not_empty: "[| X \ Filter S; A \ X; B \ X |] ==> A Int B ~= {}" -apply (frule_tac A = "A" and B = "B" in mem_FiltersetD1) -apply (auto dest!: Filter_empty_not_mem) -done - -lemmas Filter_Int_not_emptyE = Filter_Int_not_empty [THEN notE, standard] - -subsection{*Ultrafilters and Free Ultrafilters*} - -lemma Ultrafilter_Filter: "X \ Ultrafilter S ==> X \ Filter S" -apply (simp add: Ultrafilter_def) -done +lemma extend_lemma2: "F \ {X. \f\F. A \ f \ X}" +by blast -lemma mem_UltrafiltersetD2: - "X \ Ultrafilter S ==> \A \ Pow(S). A \ X | S - A \ X" -by (auto simp add: Ultrafilter_def) - -lemma mem_UltrafiltersetD3: - "[|X \ Ultrafilter S; A <= S; A ~: X |] ==> S - A \ X" -by (auto simp add: Ultrafilter_def) - -lemma mem_UltrafiltersetD4: - "[|X \ Ultrafilter S; A <= S; S - A ~: X |] ==> A \ X" -by (auto simp add: Ultrafilter_def) - -lemma mem_UltrafiltersetI: - "[| X \ Filter S; - \A \ Pow(S). A \ X | S - A \ X |] ==> X \ Ultrafilter S" -by (simp add: Ultrafilter_def) +lemma (in filter) extend_filter: +assumes A: "- A \ F" +shows "filter {X. \f\F. A \ f \ X}" (is "filter ?X") +proof (rule filter.intro) + show "UNIV \ ?X" by blast +next + show "{} \ ?X" + proof (clarify) + fix f assume f: "f \ F" and Af: "A \ f \ {}" + from Af have fA: "f \ - A" by blast + from f fA have "- A \ F" by (rule subset) + with A show "False" by simp + qed +next + fix u and v + assume u: "u \ ?X" and v: "v \ ?X" + from u obtain f where f: "f \ F" and Af: "A \ f \ u" by blast + from v obtain g where g: "g \ F" and Ag: "A \ g \ v" by blast + from f g have fg: "f \ g \ F" by (rule Int) + from Af Ag have Afg: "A \ (f \ g) \ u \ v" by blast + from fg Afg show "u \ v \ ?X" by blast +next + fix u and v + assume uv: "u \ v" and u: "u \ ?X" + from u obtain f where f: "f \ F" and Afu: "A \ f \ u" by blast + from Afu uv have Afv: "A \ f \ v" by blast + from f Afv have "\f\F. A \ f \ v" by blast + thus "v \ ?X" by simp +qed -lemma FreeUltrafilter_Ultrafilter: - "X \ FreeUltrafilter S ==> X \ Ultrafilter S" -by (auto simp add: Ultrafilter_def FreeUltrafilter_def) - -lemma mem_FreeUltrafilter_not_finite: - "X \ FreeUltrafilter S ==> \y \ X. ~finite(y)" -by (simp add: FreeUltrafilter_def) - -lemma mem_FreeUltrafiltersetD1: "[| X \ FreeUltrafilter S; x \ X |] ==> ~ finite x" -apply (blast dest!: mem_FreeUltrafilter_not_finite) -done - -lemmas mem_FreeUltrafiltersetE1 = mem_FreeUltrafiltersetD1 [THEN notE, standard] +lemma (in filter) max_filter_ultrafilter: +assumes max: "\G. \filter G; F \ G\ \ F = G" +shows "ultrafilter_axioms F" +proof (rule ultrafilter_axioms.intro) + fix A show "A \ F \ - A \ F" + proof (rule disjCI) + let ?X = "{X. \f\F. A \ f \ X}" + assume AF: "- A \ F" + from AF have X: "filter ?X" by (rule extend_filter) + from UNIV have AX: "A \ ?X" by (rule extend_lemma1) + have FX: "F \ ?X" by (rule extend_lemma2) + from X FX have "F = ?X" by (rule max) + with AX show "A \ F" by simp + qed +qed -lemma mem_FreeUltrafiltersetD2: "[| X \ FreeUltrafilter S; finite x|] ==> x ~: X" -apply (blast dest!: mem_FreeUltrafilter_not_finite) -done - -lemma mem_FreeUltrafiltersetI1: - "[| X \ Ultrafilter S; - \x. ~(x \ X & finite x) |] ==> X \ FreeUltrafilter S" -by (simp add: FreeUltrafilter_def) +lemma (in ultrafilter) max_filter: +assumes G: "filter G" and sub: "F \ G" shows "F = G" +proof + show "F \ G" . + show "G \ F" + proof + fix A assume A: "A \ G" + from G A have "- A \ G" by (rule filter.memD) + with sub have B: "- A \ F" by blast + thus "A \ F" by (rule memI) + qed +qed -lemma mem_FreeUltrafiltersetI2: - "[| X \ Ultrafilter S; - \x. (x ~: X | ~ finite x) |] ==> X \ FreeUltrafilter S" -by (simp add: FreeUltrafilter_def) +subsection {* ultrafilter Theorem *} -lemma FreeUltrafilter_iff: - "(X \ FreeUltrafilter S) = (X \ Freefilter S & (\x \ Pow(S). x \ X | S - x \ X))" -by (auto simp add: FreeUltrafilter_def Freefilter_def Ultrafilter_def) +text "A locale makes proof of ultrafilter Theorem more modular" +locale (open) UFT = + fixes frechet :: "'a set set" + and superfrechet :: "'a set set set" + assumes infinite_UNIV: "infinite (UNIV :: 'a set)" + + defines frechet_def: "frechet \ {A. finite (- A)}" + and superfrechet_def: "superfrechet \ {G. filter G \ frechet \ G}" -(*------------------------------------------------------------------- - A Filter F on S is an ultrafilter iff it is a maximal filter - i.e. whenever G is a filter on I and F <= F then F = G - --------------------------------------------------------------------*) -(*--------------------------------------------------------------------- - lemmas that shows existence of an extension to what was assumed to - be a maximal filter. Will be used to derive contradiction in proof of - property of ultrafilter - ---------------------------------------------------------------------*) -lemma lemma_set_extend: "[| F ~= {}; A <= S |] ==> \x. x \ {X. X <= S & (\f \ F. A Int f <= X)}" -apply blast -done +lemma (in UFT) superfrechetI: + "\filter G; frechet \ G\ \ G \ superfrechet" +by (simp add: superfrechet_def) -lemma lemma_set_not_empty: "a \ X ==> X ~= {}" -apply (safe) -done +lemma (in UFT) superfrechetD1: + "G \ superfrechet \ filter G" +by (simp add: superfrechet_def) + +lemma (in UFT) superfrechetD2: + "G \ superfrechet \ frechet \ G" +by (simp add: superfrechet_def) + +text {* A few properties of free filters *} -lemma lemma_empty_Int_subset_Compl: "x Int F <= {} ==> F <= - x" -apply blast -done +lemma filter_cofinite: +assumes inf: "infinite (UNIV :: 'a set)" +shows "filter {A:: 'a set. finite (- A)}" (is "filter ?F") +proof (rule filter.intro) + show "UNIV \ ?F" by simp +next + show "{} \ ?F" by simp +next + fix u v assume "u \ ?F" and "v \ ?F" + thus "u \ v \ ?F" by simp +next + fix u v assume uv: "u \ v" and u: "u \ ?F" + from uv have vu: "- v \ - u" by simp + from u show "v \ ?F" + by (simp add: finite_subset [OF vu]) +qed -lemma mem_Filterset_disjI: - "[| F \ Filter S; A ~: F; A <= S|] - ==> \B. B ~: F | ~ B <= A" -apply (unfold Filter_def is_Filter_def) -apply blast -done +text {* + We prove: 1. Existence of maximal filter i.e. ultrafilter; + 2. Freeness property i.e ultrafilter is free. + Use a locale to prove various lemmas and then + export main result: The ultrafilter Theorem +*} -lemma Ultrafilter_max_Filter: "F \ Ultrafilter S ==> - (F \ Filter S & (\G \ Filter S. F <= G --> F = G))" -apply (auto simp add: Ultrafilter_def) -apply (drule_tac x = "x" in bspec) -apply (erule mem_FiltersetD3 , assumption) -apply (safe) -apply (drule subsetD , assumption) -apply (blast dest!: Filter_Int_not_empty) -done +lemma (in UFT) filter_frechet: "filter frechet" +by (unfold frechet_def, rule filter_cofinite [OF infinite_UNIV]) + +lemma (in UFT) frechet_in_superfrechet: "frechet \ superfrechet" +by (rule superfrechetI [OF filter_frechet subset_refl]) + +lemma (in UFT) lemma_mem_chain_filter: + "\c \ chain superfrechet; x \ c\ \ filter x" +by (unfold chain_def superfrechet_def, blast) -(*-------------------------------------------------------------------------------- - This is a very long and tedious proof; need to break it into parts. - Have proof that {X. X <= S & (\f \ F. A Int f <= X)} is a filter as - a lemma ---------------------------------------------------------------------------------*) -lemma max_Filter_Ultrafilter: - "[| F \ Filter S; - \G \ Filter S. F <= G --> F = G |] ==> F \ Ultrafilter S" -apply (simp add: Ultrafilter_def) -apply (safe) -apply (rule ccontr) -apply (frule mem_FiltersetD [THEN is_FilterD2]) -apply (frule_tac x = "{X. X <= S & (\f \ F. A Int f <= X) }" in bspec) -apply (rule mem_FiltersetI2) -apply (blast intro: elim:); -apply (simp add: ); -apply (blast dest: mem_FiltersetD3) -apply (erule lemma_set_extend [THEN exE]) -apply (assumption , erule lemma_set_not_empty) -txt{*First we prove @{term "{} \ {X. X \ S \ (\f\F. A \ f \ X)}"}*} - apply (clarify ); - apply (drule lemma_empty_Int_subset_Compl) - apply (frule mem_Filterset_disjI) - apply assumption; - apply (blast intro: elim:); - apply (fast dest: mem_FiltersetD3 elim:) -txt{*Next case: @{term "u \ v"} is an element*} - apply (intro ballI) -apply (simp add: ); - apply (rule conjI, blast) -apply (clarify ); - apply (rule_tac x = "f Int fa" in bexI) - apply (fast intro: elim:); - apply (blast dest: mem_FiltersetD1 elim:) - apply force; -apply (blast dest: mem_FiltersetD3 elim:) -done +subsubsection {* Unions of chains of superfrechets *} + +text "In this section we prove that superfrechet is closed +with respect to unions of non-empty chains. We must show + 1) Union of a chain is a filter, + 2) Union of a chain contains frechet. + +Number 2 is trivial, but 1 requires us to prove all the filter rules." -lemma Ultrafilter_iff: "(F \ Ultrafilter S) = (F \ Filter S & (\G \ Filter S. F <= G --> F = G))" -apply (blast intro!: Ultrafilter_max_Filter max_Filter_Ultrafilter) -done - - -subsection{* A Few Properties of Freefilters*} +lemma (in UFT) Union_chain_UNIV: +"\c \ chain superfrechet; c \ {}\ \ UNIV \ \c" +proof - + assume 1: "c \ chain superfrechet" and 2: "c \ {}" + from 2 obtain x where 3: "x \ c" by blast + from 1 3 have "filter x" by (rule lemma_mem_chain_filter) + hence "UNIV \ x" by (rule filter.UNIV) + with 3 show "UNIV \ \c" by blast +qed -lemma lemma_Compl_cancel_eq: "F1 Int F2 = ((F1 Int Y) Int F2) Un ((F2 Int (- Y)) Int F1)" -apply auto -done - -lemma finite_IntI1: "finite X ==> finite (X Int Y)" -apply (erule Int_lower1 [THEN finite_subset]) -done - -lemma finite_IntI2: "finite Y ==> finite (X Int Y)" -apply (erule Int_lower2 [THEN finite_subset]) -done +lemma (in UFT) Union_chain_empty: +"c \ chain superfrechet \ {} \ \c" +proof + assume 1: "c \ chain superfrechet" and 2: "{} \ \c" + from 2 obtain x where 3: "x \ c" and 4: "{} \ x" .. + from 1 3 have "filter x" by (rule lemma_mem_chain_filter) + hence "{} \ x" by (rule filter.empty) + with 4 show "False" by simp +qed -lemma finite_Int_Compl_cancel: "[| finite (F1 Int Y); - finite (F2 Int (- Y)) - |] ==> finite (F1 Int F2)" -apply (rule_tac Y1 = "Y" in lemma_Compl_cancel_eq [THEN ssubst]) -apply (rule finite_UnI) -apply (auto intro!: finite_IntI1 finite_IntI2) -done - -lemma Freefilter_lemma_not_finite: "U \ Freefilter S ==> - ~ (\f1 \ U. \f2 \ U. finite (f1 Int x) - & finite (f2 Int (- x)))" -apply (safe) -apply (frule_tac A = "f1" and B = "f2" in Freefilter_Filter [THEN mem_FiltersetD1]) -apply (drule_tac [3] x = "f1 Int f2" in mem_FreefiltersetD1) -apply (drule_tac [4] finite_Int_Compl_cancel) -apply auto -done - -(* the lemmas below follow *) -lemma Freefilter_Compl_not_finite_disjI: "U \ Freefilter S ==> - \f \ U. ~ finite (f Int x) | ~finite (f Int (- x))" -by (blast dest!: Freefilter_lemma_not_finite bspec) - -lemma Freefilter_Compl_not_finite_disjI2: "U \ Freefilter S ==> (\f \ U. ~ finite (f Int x)) | (\f \ U. ~finite (f Int (- x)))" -apply (blast dest!: Freefilter_lemma_not_finite bspec) -done +lemma (in UFT) Union_chain_Int: +"\c \ chain superfrechet; u \ \c; v \ \c\ \ u \ v \ \c" +proof - + assume c: "c \ chain superfrechet" + assume "u \ \c" + then obtain x where ux: "u \ x" and xc: "x \ c" .. + assume "v \ \c" + then obtain y where vy: "v \ y" and yc: "y \ c" .. + from c xc yc have "x \ y \ y \ x" by (rule chainD) + with xc yc have xyc: "x \ y \ c" + by (auto simp add: Un_absorb1 Un_absorb2) + with c have fxy: "filter (x \ y)" by (rule lemma_mem_chain_filter) + from ux have uxy: "u \ x \ y" by simp + from vy have vxy: "v \ x \ y" by simp + from fxy uxy vxy have "u \ v \ x \ y" by (rule filter.Int) + with xyc show "u \ v \ \c" .. +qed -lemma cofinite_Filter: "~ finite (UNIV:: 'a set) ==> {A:: 'a set. finite (- A)} \ Filter UNIV" -apply (rule mem_FiltersetI2) -apply (auto simp del: Collect_empty_eq) -apply (erule_tac c = "UNIV" in equalityCE) -apply auto -apply (erule Compl_anti_mono [THEN finite_subset]) -apply assumption -done - -lemma not_finite_UNIV_disjI: "~finite(UNIV :: 'a set) ==> ~finite (X :: 'a set) | ~finite (- X)" -apply (drule_tac A1 = "X" in Compl_partition [THEN ssubst]) -apply simp -done - -lemma not_finite_UNIV_Compl: "[| ~finite(UNIV :: 'a set); finite (X :: 'a set) |] ==> ~finite (- X)" -apply (drule_tac X = "X" in not_finite_UNIV_disjI) -apply blast -done +lemma (in UFT) Union_chain_subset: +"\c \ chain superfrechet; u \ \c; u \ v\ \ v \ \c" +proof - + assume c: "c \ chain superfrechet" + and u: "u \ \c" and uv: "u \ v" + from u obtain x where ux: "u \ x" and xc: "x \ c" .. + from c xc have fx: "filter x" by (rule lemma_mem_chain_filter) + from fx ux uv have vx: "v \ x" by (rule filter.subset) + with xc show "v \ \c" .. +qed -lemma mem_cofinite_Filter_not_finite: - "~ finite (UNIV:: 'a set) - ==> \X \ {A:: 'a set. finite (- A)}. ~ finite X" -by (auto dest: not_finite_UNIV_disjI) - -lemma cofinite_Freefilter: - "~ finite (UNIV:: 'a set) ==> {A:: 'a set. finite (- A)} \ Freefilter UNIV" -apply (rule mem_FreefiltersetI2) -apply (rule cofinite_Filter , assumption) -apply (blast dest!: mem_cofinite_Filter_not_finite) -done - -(*????Set.thy*) -lemma UNIV_diff_Compl [simp]: "UNIV - x = - x" -apply auto -done - -lemma FreeUltrafilter_contains_cofinite_set: - "[| ~finite(UNIV :: 'a set); (U :: 'a set set): FreeUltrafilter UNIV - |] ==> {X. finite(- X)} <= U" -by (auto simp add: Ultrafilter_def FreeUltrafilter_def) +lemma (in UFT) Union_chain_filter: +assumes "c \ chain superfrechet" and "c \ {}" +shows "filter (\c)" +proof (rule filter.intro) + show "UNIV \ \c" by (rule Union_chain_UNIV) +next + show "{} \ \c" by (rule Union_chain_empty) +next + fix u v assume "u \ \c" and "v \ \c" + show "u \ v \ \c" by (rule Union_chain_Int) +next + fix u v assume "u \ \c" and "u \ v" + show "v \ \c" by (rule Union_chain_subset) +qed -(*-------------------------------------------------------------------- - We prove: 1. Existence of maximal filter i.e. ultrafilter - 2. Freeness property i.e ultrafilter is free - Use a locale to prove various lemmas and then - export main result: The Ultrafilter Theorem - -------------------------------------------------------------------*) - -lemma (in UFT) chain_Un_subset_Pow: - "!!(c :: 'a set set set). c \ chain (superfrechet S) ==> Union c <= Pow S" -apply (simp add: chain_def superfrechet_def frechet_def) -apply (blast dest: mem_FiltersetD3 elim:) -done +lemma (in UFT) lemma_mem_chain_frechet_subset: + "\c \ chain superfrechet; x \ c\ \ frechet \ x" +by (unfold superfrechet_def chain_def, blast) -lemma (in UFT) mem_chain_psubset_empty: - "!!(c :: 'a set set set). c: chain (superfrechet S) - ==> !x: c. {} < x" -by (auto simp add: chain_def Filter_def is_Filter_def superfrechet_def frechet_def) - -lemma (in UFT) chain_Un_not_empty: "!!(c :: 'a set set set). - [| c: chain (superfrechet S); - c ~= {} |] - ==> Union(c) ~= {}" -apply (drule mem_chain_psubset_empty) -apply (safe) -apply (drule bspec , assumption) -apply (auto dest: Union_upper bspec simp add: psubset_def) -done +lemma (in UFT) Union_chain_superfrechet: + "\c \ {}; c \ chain superfrechet\ \ \c \ superfrechet" +proof (rule superfrechetI) + assume 1: "c \ chain superfrechet" and 2: "c \ {}" + thus "filter (\c)" by (rule Union_chain_filter) + from 2 obtain x where 3: "x \ c" by blast + from 1 3 have "frechet \ x" by (rule lemma_mem_chain_frechet_subset) + also from 3 have "x \ \c" by blast + finally show "frechet \ \c" . +qed -lemma (in UFT) Filter_empty_not_mem_Un: - "!!(c :: 'a set set set). c \ chain (superfrechet S) ==> {} ~: Union(c)" -by (auto simp add: is_Filter_def Filter_def chain_def superfrechet_def) - -lemma (in UFT) Filter_Un_Int: "c \ chain (superfrechet S) - ==> \u \ Union(c). \v \ Union(c). u Int v \ Union(c)" -apply (safe) -apply (frule_tac x = "X" and y = "Xa" in chainD) -apply (assumption)+ -apply (drule chainD2) -apply (erule disjE) - apply (rule_tac [2] X = "X" in UnionI) - apply (rule_tac X = "Xa" in UnionI) -apply (auto intro: mem_FiltersetD1 simp add: superfrechet_def) -done +subsubsection {* Existence of free ultrafilter *} -lemma (in UFT) Filter_Un_subset: "c \ chain (superfrechet S) - ==> \u v. u \ Union(c) & - (u :: 'a set) <= v & v <= S --> v \ Union(c)" -apply (safe) -apply (drule chainD2) -apply (drule subsetD , assumption) -apply (rule UnionI , assumption) -apply (auto intro: mem_FiltersetD2 simp add: superfrechet_def) -done - -lemma (in UFT) lemma_mem_chain_Filter: - "!!(c :: 'a set set set). - [| c \ chain (superfrechet S); - x \ c - |] ==> x \ Filter S" -by (auto simp add: chain_def superfrechet_def) +lemma (in UFT) max_cofinite_filter_Ex: + "\U\superfrechet. \G\superfrechet. U \ G \ U = G" +proof (rule Zorn_Lemma2 [rule_format]) + fix c assume c: "c \ chain superfrechet" + show "\U\superfrechet. \G\c. G \ U" (is "?U") + proof (cases) + assume "c = {}" + with frechet_in_superfrechet show "?U" by blast + next + assume A: "c \ {}" + from A c have "\c \ superfrechet" + by (rule Union_chain_superfrechet) + thus "?U" by blast + qed +qed -lemma (in UFT) lemma_mem_chain_frechet_subset: - "!!(c :: 'a set set set). - [| c \ chain (superfrechet S); - x \ c - |] ==> frechet S <= x" -by (auto simp add: chain_def superfrechet_def) +lemma (in UFT) mem_superfrechet_all_infinite: + "\U \ superfrechet; A \ U\ \ infinite A" +proof + assume U: "U \ superfrechet" and A: "A \ U" and fin: "finite A" + from U have fil: "filter U" and fre: "frechet \ U" + by (simp_all add: superfrechet_def) + from fin have "- A \ frechet" by (simp add: frechet_def) + with fre have cA: "- A \ U" by (rule subsetD) + from fil A cA have "A \ - A \ U" by (rule filter.Int) + with fil show "False" by (simp add: filter.empty) +qed -lemma (in UFT) Un_chain_mem_cofinite_Filter_set: "!!(c :: 'a set set set). - [| c ~= {}; - c \ chain (superfrechet (UNIV :: 'a set)) - |] ==> Union c \ superfrechet (UNIV)" -apply (simp (no_asm) add: superfrechet_def frechet_def) -apply (safe) -apply (rule mem_FiltersetI2) -apply (erule chain_Un_subset_Pow) -apply (rule UnionI , assumption) -apply (erule lemma_mem_chain_Filter [THEN mem_FiltersetD4] , assumption) -apply (erule chain_Un_not_empty) -apply (erule_tac [2] Filter_empty_not_mem_Un) -apply (erule_tac [2] Filter_Un_Int) -apply (erule_tac [2] Filter_Un_subset) -apply (subgoal_tac [2] "xa \ frechet (UNIV) ") -apply (blast intro: elim:); -apply (rule UnionI) -apply assumption; -apply (rule lemma_mem_chain_frechet_subset [THEN subsetD]) -apply (auto simp add: frechet_def) -done +text {* There exists a free ultrafilter on any infinite set *} -lemma (in UFT) max_cofinite_Filter_Ex: "\U \ superfrechet (UNIV). - \G \ superfrechet (UNIV). U <= G --> U = G" -apply (rule Zorn_Lemma2) -apply (insert not_finite_UNIV [THEN cofinite_Filter]) -apply (safe) -apply (rule_tac Q = "c={}" in excluded_middle [THEN disjE]) -apply (rule_tac x = "Union c" in bexI , blast) -apply (rule Un_chain_mem_cofinite_Filter_set); -apply (auto simp add: superfrechet_def frechet_def) -done +lemma (in UFT) freeultrafilter_ex: + "\U::'a set set. freeultrafilter U" +proof - + from max_cofinite_filter_Ex obtain U + where U: "U \ superfrechet" + and max [rule_format]: "\G\superfrechet. U \ G \ U = G" .. + from U have fil: "filter U" by (rule superfrechetD1) + from U have fre: "frechet \ U" by (rule superfrechetD2) + have ultra: "ultrafilter_axioms U" + proof (rule filter.max_filter_ultrafilter [OF fil]) + fix G assume G: "filter G" and UG: "U \ G" + from fre UG have "frechet \ G" by simp + with G have "G \ superfrechet" by (rule superfrechetI) + from this UG show "U = G" by (rule max) + qed + have free: "freeultrafilter_axioms U" + proof (rule freeultrafilter_axioms.intro) + fix A assume "A \ U" + with U show "infinite A" by (rule mem_superfrechet_all_infinite) + qed + from fil ultra free have "freeultrafilter U" + by (rule freeultrafilter.intro) + thus ?thesis .. +qed -lemma (in UFT) max_cofinite_Freefilter_Ex: "\U \ superfrechet UNIV. ( - \G \ superfrechet UNIV. U <= G --> U = G) - & (\x \ U. ~finite x)" -apply (insert not_finite_UNIV [THEN UFT.max_cofinite_Filter_Ex]); -apply (safe) -apply (rule_tac x = "U" in bexI) -apply (auto simp add: superfrechet_def frechet_def) -apply (drule_tac c = "- x" in subsetD) -apply (simp (no_asm_simp)) -apply (frule_tac A = "x" and B = "- x" in mem_FiltersetD1) -apply (drule_tac [3] Filter_empty_not_mem) -apply (auto ); -done - -text{*There exists a free ultrafilter on any infinite set*} - -theorem (in UFT) FreeUltrafilter_ex: "\U. U \ FreeUltrafilter (UNIV :: 'a set)" -apply (simp add: FreeUltrafilter_def) -apply (insert not_finite_UNIV [THEN UFT.max_cofinite_Freefilter_Ex]) -apply (simp add: superfrechet_def Ultrafilter_iff frechet_def) -apply (safe) -apply (rule_tac x = "U" in exI) -apply (safe) -apply blast -done - -theorems FreeUltrafilter_Ex = UFT.FreeUltrafilter_ex +lemmas freeultrafilter_Ex = UFT.freeultrafilter_ex end diff -r 8608f7a881eb -r a39d1430d271 src/HOL/Hyperreal/HyperDef.thy --- a/src/HOL/Hyperreal/HyperDef.thy Tue Sep 06 19:10:43 2005 +0200 +++ b/src/HOL/Hyperreal/HyperDef.thy Tue Sep 06 19:22:31 2005 +0200 @@ -15,7 +15,7 @@ constdefs FreeUltrafilterNat :: "nat set set" ("\") - "FreeUltrafilterNat == (SOME U. U \ FreeUltrafilter (UNIV:: nat set))" + "FreeUltrafilterNat == (SOME U. freeultrafilter U)" hyprel :: "((nat=>real)*(nat=>real)) set" "hyprel == {p. \X Y. p = ((X::nat=>real),Y) & @@ -113,66 +113,53 @@ text{*Also, proof of various properties of @{term FreeUltrafilterNat}: an arbitrary free ultrafilter*} -lemma FreeUltrafilterNat_Ex: "\U. U \ FreeUltrafilter (UNIV::nat set)" -by (rule not_finite_nat [THEN FreeUltrafilter_Ex]) +lemma FreeUltrafilterNat_Ex: "\U::nat set set. freeultrafilter U" +by (rule not_finite_nat [THEN freeultrafilter_Ex]) -lemma FreeUltrafilterNat_mem [simp]: - "FreeUltrafilterNat \ FreeUltrafilter(UNIV:: nat set)" +lemma FreeUltrafilterNat_mem [simp]: "freeultrafilter FreeUltrafilterNat" apply (unfold FreeUltrafilterNat_def) -apply (rule FreeUltrafilterNat_Ex [THEN exE]) -apply (rule someI2, assumption+) +apply (rule someI_ex) +apply (rule FreeUltrafilterNat_Ex) done +lemma UltrafilterNat_mem: "ultrafilter FreeUltrafilterNat" +by (rule FreeUltrafilterNat_mem [THEN freeultrafilter.ultrafilter]) + +lemma FilterNat_mem: "filter FreeUltrafilterNat" +by (rule FreeUltrafilterNat_mem [THEN freeultrafilter.filter]) + lemma FreeUltrafilterNat_finite: "finite x ==> x \ FreeUltrafilterNat" -apply (unfold FreeUltrafilterNat_def) -apply (rule FreeUltrafilterNat_Ex [THEN exE]) -apply (rule someI2, assumption) -apply (blast dest: mem_FreeUltrafiltersetD1) -done +by (rule FreeUltrafilterNat_mem [THEN freeultrafilter.finite]) lemma FreeUltrafilterNat_not_finite: "x \ FreeUltrafilterNat ==> ~ finite x" -by (blast dest: FreeUltrafilterNat_finite) +by (rule FreeUltrafilterNat_mem [THEN freeultrafilter.infinite]) lemma FreeUltrafilterNat_empty [simp]: "{} \ FreeUltrafilterNat" -apply (unfold FreeUltrafilterNat_def) -apply (rule FreeUltrafilterNat_Ex [THEN exE]) -apply (rule someI2, assumption) -apply (blast dest: FreeUltrafilter_Ultrafilter Ultrafilter_Filter - Filter_empty_not_mem) -done +by (rule FilterNat_mem [THEN filter.empty]) lemma FreeUltrafilterNat_Int: "[| X \ FreeUltrafilterNat; Y \ FreeUltrafilterNat |] ==> X Int Y \ FreeUltrafilterNat" -apply (insert FreeUltrafilterNat_mem) -apply (blast dest: FreeUltrafilter_Ultrafilter Ultrafilter_Filter mem_FiltersetD1) -done +by (rule FilterNat_mem [THEN filter.Int]) lemma FreeUltrafilterNat_subset: "[| X \ FreeUltrafilterNat; X \ Y |] ==> Y \ FreeUltrafilterNat" -apply (insert FreeUltrafilterNat_mem) -apply (blast dest: FreeUltrafilter_Ultrafilter Ultrafilter_Filter mem_FiltersetD2) -done +by (rule FilterNat_mem [THEN filter.subset]) lemma FreeUltrafilterNat_Compl: "X \ FreeUltrafilterNat ==> -X \ FreeUltrafilterNat" -proof - assume "X \ \" and "- X \ \" - hence "X Int - X \ \" by (rule FreeUltrafilterNat_Int) - thus False by force -qed +apply (erule contrapos_pn) +apply (erule UltrafilterNat_mem [THEN ultrafilter.not_mem_iff, THEN iffD2]) +done lemma FreeUltrafilterNat_Compl_mem: "X\ FreeUltrafilterNat ==> -X \ FreeUltrafilterNat" -apply (cut_tac FreeUltrafilterNat_mem [THEN FreeUltrafilter_iff [THEN iffD1]]) -apply (safe, drule_tac x = X in bspec) -apply (auto) -done +by (rule UltrafilterNat_mem [THEN ultrafilter.not_mem_iff, THEN iffD1]) lemma FreeUltrafilterNat_Compl_iff1: "(X \ FreeUltrafilterNat) = (-X \ FreeUltrafilterNat)" -by (blast dest: FreeUltrafilterNat_Compl FreeUltrafilterNat_Compl_mem) +by (rule UltrafilterNat_mem [THEN ultrafilter.not_mem_iff]) lemma FreeUltrafilterNat_Compl_iff2: "(X \ FreeUltrafilterNat) = (-X \ FreeUltrafilterNat)" @@ -184,7 +171,7 @@ done lemma FreeUltrafilterNat_UNIV [iff]: "UNIV \ FreeUltrafilterNat" -by (rule FreeUltrafilterNat_mem [THEN FreeUltrafilter_Ultrafilter, THEN Ultrafilter_Filter, THEN mem_FiltersetD4]) +by (rule FilterNat_mem [THEN filter.UNIV]) lemma FreeUltrafilterNat_Nat_set_refl [intro]: "{n. P(n) = P(n)} \ FreeUltrafilterNat" diff -r 8608f7a881eb -r a39d1430d271 src/HOL/Hyperreal/NatStar.thy --- a/src/HOL/Hyperreal/NatStar.thy Tue Sep 06 19:10:43 2005 +0200 +++ b/src/HOL/Hyperreal/NatStar.thy Tue Sep 06 19:22:31 2005 +0200 @@ -166,6 +166,7 @@ lemma InternalNatSets_UNIV_diff: "X \ InternalNatSets ==> UNIV - X \ InternalNatSets" +apply (subgoal_tac "UNIV - X = - X") by (auto intro: InternalNatSets_Compl) text{*Nonstandard extension of a set (defined using a constant