# HG changeset patch # User huffman # Date 1312840741 25200 # Node ID efd1ea744101e25cd3169c9d4663b07be693be81 # Parent 5b970711fb39fb779db3bdb6a2e499ffc0484863 lemma bolzano_weierstrass_imp_compact diff -r 5b970711fb39 -r efd1ea744101 src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy --- a/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy Mon Aug 08 14:44:20 2011 -0700 +++ b/src/HOL/Multivariate_Analysis/Topology_Euclidean_Space.thy Mon Aug 08 14:59:01 2011 -0700 @@ -2704,6 +2704,139 @@ subsubsection {* Complete the chain of compactness variants *} +lemma islimpt_range_imp_convergent_subsequence: + fixes f :: "nat \ 'a::metric_space" + assumes "l islimpt (range f)" + shows "\r. subseq r \ ((f \ r) ---> l) sequentially" +proof (intro exI conjI) + have *: "\e. 0 < e \ \n. 0 < dist (f n) l \ dist (f n) l < e" + using assms unfolding islimpt_def + by (drule_tac x="ball l e" in spec) + (auto simp add: zero_less_dist_iff dist_commute) + + def t \ "\e. LEAST n. 0 < dist (f n) l \ dist (f n) l < e" + have f_t_neq: "\e. 0 < e \ 0 < dist (f (t e)) l" + unfolding t_def by (rule LeastI2_ex [OF * conjunct1]) + have f_t_closer: "\e. 0 < e \ dist (f (t e)) l < e" + unfolding t_def by (rule LeastI2_ex [OF * conjunct2]) + have t_le: "\n e. 0 < dist (f n) l \ dist (f n) l < e \ t e \ n" + unfolding t_def by (simp add: Least_le) + have less_tD: "\n e. n < t e \ 0 < dist (f n) l \ e \ dist (f n) l" + unfolding t_def by (drule not_less_Least) simp + have t_antimono: "\e e'. 0 < e \ e \ e' \ t e' \ t e" + apply (rule t_le) + apply (erule f_t_neq) + apply (erule (1) less_le_trans [OF f_t_closer]) + done + have t_dist_f_neq: "\n. 0 < dist (f n) l \ t (dist (f n) l) \ n" + by (drule f_t_closer) auto + have t_less: "\e. 0 < e \ t e < t (dist (f (t e)) l)" + apply (subst less_le) + apply (rule conjI) + apply (rule t_antimono) + apply (erule f_t_neq) + apply (erule f_t_closer [THEN less_imp_le]) + apply (rule t_dist_f_neq [symmetric]) + apply (erule f_t_neq) + done + have dist_f_t_less': + "\e e'. 0 < e \ 0 < e' \ t e \ t e' \ dist (f (t e')) l < e" + apply (simp add: le_less) + apply (erule disjE) + apply (rule less_trans) + apply (erule f_t_closer) + apply (rule le_less_trans) + apply (erule less_tD) + apply (erule f_t_neq) + apply (erule f_t_closer) + apply (erule subst) + apply (erule f_t_closer) + done + + def r \ "nat_rec (t 1) (\_ x. t (dist (f x) l))" + have r_simps: "r 0 = t 1" "\n. r (Suc n) = t (dist (f (r n)) l)" + unfolding r_def by simp_all + have f_r_neq: "\n. 0 < dist (f (r n)) l" + by (induct_tac n) (simp_all add: r_simps f_t_neq) + + show "subseq r" + unfolding subseq_Suc_iff + apply (rule allI) + apply (case_tac n) + apply (simp_all add: r_simps) + apply (rule t_less, rule zero_less_one) + apply (rule t_less, rule f_r_neq) + done + show "((f \ r) ---> l) sequentially" + unfolding Lim_sequentially o_def + apply (clarify, rule_tac x="t e" in exI, clarify) + apply (drule le_trans, rule seq_suble [OF `subseq r`]) + apply (case_tac n, simp_all add: r_simps dist_f_t_less' f_r_neq) + done +qed + +lemma finite_range_imp_infinite_repeats: + fixes f :: "nat \ 'a" + assumes "finite (range f)" + shows "\k. infinite {n. f n = k}" +proof - + { fix A :: "'a set" assume "finite A" + hence "\f. infinite {n. f n \ A} \ \k. infinite {n. f n = k}" + proof (induct) + case empty thus ?case by simp + next + case (insert x A) + show ?case + proof (cases "finite {n. f n = x}") + case True + with `infinite {n. f n \ insert x A}` + have "infinite {n. f n \ A}" by simp + thus "\k. infinite {n. f n = k}" by (rule insert) + next + case False thus "\k. infinite {n. f n = k}" .. + qed + qed + } note H = this + from assms show "\k. infinite {n. f n = k}" + by (rule H) simp +qed + +lemma bolzano_weierstrass_imp_compact: + fixes s :: "'a::metric_space set" + assumes "\t. infinite t \ t \ s --> (\x \ s. x islimpt t)" + shows "compact s" +proof - + { fix f :: "nat \ 'a" assume f: "\n. f n \ s" + have "\l\s. \r. subseq r \ ((f \ r) ---> l) sequentially" + proof (cases "finite (range f)") + case True + hence "\l. infinite {n. f n = l}" + by (rule finite_range_imp_infinite_repeats) + then obtain l where "infinite {n. f n = l}" .. + hence "\r. subseq r \ (\n. r n \ {n. f n = l})" + by (rule infinite_enumerate) + then obtain r where "subseq r" and fr: "\n. f (r n) = l" by auto + hence "subseq r \ ((f \ r) ---> l) sequentially" + unfolding o_def by (simp add: fr Lim_const) + hence "\r. subseq r \ ((f \ r) ---> l) sequentially" + by - (rule exI) + from f have "\n. f (r n) \ s" by simp + hence "l \ s" by (simp add: fr) + thus "\l\s. \r. subseq r \ ((f \ r) ---> l) sequentially" + by (rule rev_bexI) fact + next + case False + with f assms have "\x\s. x islimpt (range f)" by auto + then obtain l where "l \ s" "l islimpt (range f)" .. + have "\r. subseq r \ ((f \ r) ---> l) sequentially" + using `l islimpt (range f)` + by (rule islimpt_range_imp_convergent_subsequence) + with `l \ s` show "\l\s. \r. subseq r \ ((f \ r) ---> l) sequentially" .. + qed + } + thus ?thesis unfolding compact_def by auto +qed + primrec helper_2::"(real \ 'a::metric_space) \ nat \ 'a" where "helper_2 beyond 0 = beyond 0" | "helper_2 beyond (Suc n) = beyond (dist undefined (helper_2 beyond n) + 1 )"