src/HOL/Analysis/Topology_Euclidean_Space.thy
changeset 65037 2cf841ff23be
parent 65036 ab7e11730ad8
child 65038 9391ea7daa17
equal deleted inserted replaced
65036:ab7e11730ad8 65037:2cf841ff23be
  7525   shows "connected (f ` s)"
  7525   shows "connected (f ` s)"
  7526 using connected_continuous_image assms linear_continuous_on linear_conv_bounded_linear by blast
  7526 using connected_continuous_image assms linear_continuous_on linear_conv_bounded_linear by blast
  7527 
  7527 
  7528 text \<open>Continuity implies uniform continuity on a compact domain.\<close>
  7528 text \<open>Continuity implies uniform continuity on a compact domain.\<close>
  7529 
  7529 
  7530 lemma compact_uniformly_continuous:
  7530 subsection \<open>Continuity implies uniform continuity on a compact domain.\<close>
       
  7531 
       
  7532 text\<open>From the proof of the Heine-Borel theorem: Lemma 2 in section 3.7, page 69 of
       
  7533 J. C. Burkill and H. Burkill. A Second Course in Mathematical Analysis (CUP, 2002)\<close>
       
  7534 
       
  7535 lemma Heine_Borel_lemma:
       
  7536   assumes "compact S" and Ssub: "S \<subseteq> \<Union>\<G>" and op: "\<And>G. G \<in> \<G> \<Longrightarrow> open G"
       
  7537   obtains e where "0 < e" "\<And>x. x \<in> S \<Longrightarrow> \<exists>G \<in> \<G>. ball x e \<subseteq> G"
       
  7538 proof -
       
  7539   have False if neg: "\<And>e. 0 < e \<Longrightarrow> \<exists>x \<in> S. \<forall>G \<in> \<G>. \<not> ball x e \<subseteq> G"
       
  7540   proof -
       
  7541     have "\<exists>x \<in> S. \<forall>G \<in> \<G>. \<not> ball x (1 / Suc n) \<subseteq> G" for n
       
  7542       using neg by simp
       
  7543     then obtain f where "\<And>n. f n \<in> S" and fG: "\<And>G n. G \<in> \<G> \<Longrightarrow> \<not> ball (f n) (1 / Suc n) \<subseteq> G"
       
  7544       by metis
       
  7545     then obtain l r where "l \<in> S" "subseq r" and to_l: "(f \<circ> r) \<longlonglongrightarrow> l"
       
  7546       using \<open>compact S\<close> compact_def that by metis
       
  7547     then obtain G where "l \<in> G" "G \<in> \<G>"
       
  7548       using Ssub by auto
       
  7549     then obtain e where "0 < e" and e: "\<And>z. dist z l < e \<Longrightarrow> z \<in> G"
       
  7550       using op open_dist by blast
       
  7551     obtain N1 where N1: "\<And>n. n \<ge> N1 \<Longrightarrow> dist (f (r n)) l < e/2"
       
  7552       using to_l apply (simp add: lim_sequentially)
       
  7553       using \<open>0 < e\<close> half_gt_zero that by blast
       
  7554     obtain N2 where N2: "of_nat N2 > 2/e"
       
  7555       using reals_Archimedean2 by blast
       
  7556     obtain x where "x \<in> ball (f (r (max N1 N2))) (1 / real (Suc (r (max N1 N2))))" and "x \<notin> G"
       
  7557       using fG [OF \<open>G \<in> \<G>\<close>, of "r (max N1 N2)"] by blast
       
  7558     then have "dist (f (r (max N1 N2))) x < 1 / real (Suc (r (max N1 N2)))"
       
  7559       by simp
       
  7560     also have "... \<le> 1 / real (Suc (max N1 N2))"
       
  7561       apply (simp add: divide_simps del: max.bounded_iff)
       
  7562       using \<open>subseq r\<close> seq_suble by blast
       
  7563     also have "... \<le> 1 / real (Suc N2)"
       
  7564       by (simp add: field_simps)
       
  7565     also have "... < e/2"
       
  7566       using N2 \<open>0 < e\<close> by (simp add: field_simps)
       
  7567     finally have "dist (f (r (max N1 N2))) x < e / 2" .
       
  7568     moreover have "dist (f (r (max N1 N2))) l < e/2"
       
  7569       using N1 max.cobounded1 by blast
       
  7570     ultimately have "dist x l < e"
       
  7571       using dist_triangle_half_r by blast
       
  7572     then show ?thesis
       
  7573       using e \<open>x \<notin> G\<close> by blast
       
  7574   qed
       
  7575   then show ?thesis
       
  7576     by (meson that)
       
  7577 qed
       
  7578 
       
  7579 lemma compact_uniformly_equicontinuous:
       
  7580   assumes "compact S"
       
  7581       and cont: "\<And>x e. \<lbrakk>x \<in> S; 0 < e\<rbrakk>
       
  7582                         \<Longrightarrow> \<exists>d. 0 < d \<and>
       
  7583                                 (\<forall>f \<in> \<F>. \<forall>x' \<in> S. dist x' x < d \<longrightarrow> dist (f x') (f x) < e)"
       
  7584       and "0 < e"
       
  7585   obtains d where "0 < d"
       
  7586                   "\<And>f x x'. \<lbrakk>f \<in> \<F>; x \<in> S; x' \<in> S; dist x' x < d\<rbrakk> \<Longrightarrow> dist (f x') (f x) < e"
       
  7587 proof -
       
  7588   obtain d where d_pos: "\<And>x e. \<lbrakk>x \<in> S; 0 < e\<rbrakk> \<Longrightarrow> 0 < d x e"
       
  7589      and d_dist : "\<And>x x' e f. \<lbrakk>dist x' x < d x e; x \<in> S; x' \<in> S; 0 < e; f \<in> \<F>\<rbrakk> \<Longrightarrow> dist (f x') (f x) < e"
       
  7590     using cont by metis
       
  7591   let ?\<G> = "((\<lambda>x. ball x (d x (e / 2))) ` S)"
       
  7592   have Ssub: "S \<subseteq> \<Union> ?\<G>"
       
  7593     by clarsimp (metis d_pos \<open>0 < e\<close> dist_self half_gt_zero_iff)
       
  7594   then obtain k where "0 < k" and k: "\<And>x. x \<in> S \<Longrightarrow> \<exists>G \<in> ?\<G>. ball x k \<subseteq> G"
       
  7595     by (rule Heine_Borel_lemma [OF \<open>compact S\<close>]) auto
       
  7596   moreover have "dist (f v) (f u) < e" if "f \<in> \<F>" "u \<in> S" "v \<in> S" "dist v u < k" for f u v
       
  7597   proof -
       
  7598     obtain G where "G \<in> ?\<G>" "u \<in> G" "v \<in> G"
       
  7599       using k that
       
  7600       by (metis \<open>dist v u < k\<close> \<open>u \<in> S\<close> \<open>0 < k\<close> centre_in_ball subsetD dist_commute mem_ball)
       
  7601     then obtain w where w: "dist w u < d w (e / 2)" "dist w v < d w (e / 2)" "w \<in> S"
       
  7602       by auto
       
  7603     with that d_dist have "dist (f w) (f v) < e/2"
       
  7604       by (metis \<open>0 < e\<close> dist_commute half_gt_zero)
       
  7605     moreover
       
  7606     have "dist (f w) (f u) < e/2"
       
  7607       using that d_dist w by (metis \<open>0 < e\<close> dist_commute divide_pos_pos zero_less_numeral)
       
  7608     ultimately show ?thesis
       
  7609       using dist_triangle_half_r by blast
       
  7610   qed
       
  7611   ultimately show ?thesis using that by blast
       
  7612 qed
       
  7613 
       
  7614 corollary compact_uniformly_continuous:
  7531   fixes f :: "'a :: metric_space \<Rightarrow> 'b :: metric_space"
  7615   fixes f :: "'a :: metric_space \<Rightarrow> 'b :: metric_space"
  7532   assumes f: "continuous_on s f"
  7616   assumes f: "continuous_on S f" and S: "compact S"
  7533     and s: "compact s"
  7617   shows "uniformly_continuous_on S f"
  7534   shows "uniformly_continuous_on s f"
  7618   using f
  7535   unfolding uniformly_continuous_on_def
  7619     unfolding continuous_on_iff uniformly_continuous_on_def
  7536 proof (cases, safe)
  7620     by (force intro: compact_uniformly_equicontinuous [OF S, of "{f}"])
  7537   fix e :: real
       
  7538   assume "0 < e" "s \<noteq> {}"
       
  7539   define R where [simp]:
       
  7540     "R = {(y, d). y \<in> s \<and> 0 < d \<and> ball y d \<inter> s \<subseteq> {x \<in> s. f x \<in> ball (f y) (e/2)}}"
       
  7541   let ?b = "(\<lambda>(y, d). ball y (d/2))"
       
  7542   have "(\<forall>r\<in>R. open (?b r))" "s \<subseteq> (\<Union>r\<in>R. ?b r)"
       
  7543   proof safe
       
  7544     fix y
       
  7545     assume "y \<in> s"
       
  7546     from continuous_openin_preimage_gen[OF f open_ball]
       
  7547     obtain T where "open T" and T: "{x \<in> s. f x \<in> ball (f y) (e/2)} = T \<inter> s"
       
  7548       unfolding openin_subtopology open_openin by metis
       
  7549     then obtain d where "ball y d \<subseteq> T" "0 < d"
       
  7550       using \<open>0 < e\<close> \<open>y \<in> s\<close> by (auto elim!: openE)
       
  7551     with T \<open>y \<in> s\<close> show "y \<in> (\<Union>r\<in>R. ?b r)"
       
  7552       by (intro UN_I[of "(y, d)"]) auto
       
  7553   qed auto
       
  7554   with s obtain D where D: "finite D" "D \<subseteq> R" "s \<subseteq> (\<Union>(y, d)\<in>D. ball y (d/2))"
       
  7555     by (rule compactE_image)
       
  7556   with \<open>s \<noteq> {}\<close> have [simp]: "\<And>x. x < Min (snd ` D) \<longleftrightarrow> (\<forall>(y, d)\<in>D. x < d)"
       
  7557     by (subst Min_gr_iff) auto
       
  7558   show "\<exists>d>0. \<forall>x\<in>s. \<forall>x'\<in>s. dist x' x < d \<longrightarrow> dist (f x') (f x) < e"
       
  7559   proof (rule, safe)
       
  7560     fix x x'
       
  7561     assume in_s: "x' \<in> s" "x \<in> s"
       
  7562     with D obtain y d where x: "x \<in> ball y (d/2)" "(y, d) \<in> D"
       
  7563       by blast
       
  7564     moreover assume "dist x x' < Min (snd`D) / 2"
       
  7565     ultimately have "dist y x' < d"
       
  7566       by (intro dist_triangle_half_r[of x _ d]) (auto simp: dist_commute)
       
  7567     with D x in_s show  "dist (f x) (f x') < e"
       
  7568       by (intro dist_triangle_half_r[of "f y" _ e]) (auto simp: dist_commute subset_eq)
       
  7569   qed (insert D, auto)
       
  7570 qed auto
       
  7571 
  7621 
  7572 subsection \<open>Topological stuff about the set of Reals\<close>
  7622 subsection \<open>Topological stuff about the set of Reals\<close>
  7573 
  7623 
  7574 lemma open_real:
  7624 lemma open_real:
  7575   fixes s :: "real set"
  7625   fixes s :: "real set"
 10205   obtains \<B> :: "'a::euclidean_space set set"
 10255   obtains \<B> :: "'a::euclidean_space set set"
 10206   where "countable \<B>" "\<And>C. C \<in> \<B> \<Longrightarrow> open C"
 10256   where "countable \<B>" "\<And>C. C \<in> \<B> \<Longrightarrow> open C"
 10207        "\<And>S. open S \<Longrightarrow> \<exists>U. U \<subseteq> \<B> \<and> S = \<Union>U"
 10257        "\<And>S. open S \<Longrightarrow> \<exists>U. U \<subseteq> \<B> \<and> S = \<Union>U"
 10208 by (metis ex_countable_basis topological_basis_def)
 10258 by (metis ex_countable_basis topological_basis_def)
 10209 
 10259 
       
 10260 lemma subset_second_countable:
       
 10261   obtains \<B> :: "'a:: euclidean_space set set"
       
 10262     where "countable \<B>"
       
 10263           "{} \<notin> \<B>"
       
 10264           "\<And>C. C \<in> \<B> \<Longrightarrow> openin(subtopology euclidean S) C"
       
 10265           "\<And>T. openin(subtopology euclidean S) T \<Longrightarrow> \<exists>\<U>. \<U> \<subseteq> \<B> \<and> T = \<Union>\<U>"
       
 10266 proof -
       
 10267   obtain \<B> :: "'a set set"
       
 10268     where "countable \<B>"
       
 10269       and opeB: "\<And>C. C \<in> \<B> \<Longrightarrow> openin(subtopology euclidean S) C"
       
 10270       and \<B>:    "\<And>T. openin(subtopology euclidean S) T \<Longrightarrow> \<exists>\<U>. \<U> \<subseteq> \<B> \<and> T = \<Union>\<U>"
       
 10271   proof -
       
 10272     obtain \<C> :: "'a set set"
       
 10273       where "countable \<C>" and ope: "\<And>C. C \<in> \<C> \<Longrightarrow> open C"
       
 10274         and \<C>: "\<And>S. open S \<Longrightarrow> \<exists>U. U \<subseteq> \<C> \<and> S = \<Union>U"
       
 10275       by (metis univ_second_countable that)
       
 10276     show ?thesis
       
 10277     proof
       
 10278       show "countable ((\<lambda>C. S \<inter> C) ` \<C>)"
       
 10279         by (simp add: \<open>countable \<C>\<close>)
       
 10280       show "\<And>C. C \<in> op \<inter> S ` \<C> \<Longrightarrow> openin (subtopology euclidean S) C"
       
 10281         using ope by auto
       
 10282       show "\<And>T. openin (subtopology euclidean S) T \<Longrightarrow> \<exists>\<U>\<subseteq>op \<inter> S ` \<C>. T = \<Union>\<U>"
       
 10283         by (metis \<C> image_mono inf_Sup openin_open)
       
 10284     qed
       
 10285   qed
       
 10286   show ?thesis
       
 10287   proof
       
 10288     show "countable (\<B> - {{}})"
       
 10289       using \<open>countable \<B>\<close> by blast
       
 10290     show "\<And>C. \<lbrakk>C \<in> \<B> - {{}}\<rbrakk> \<Longrightarrow> openin (subtopology euclidean S) C"
       
 10291       by (simp add: \<open>\<And>C. C \<in> \<B> \<Longrightarrow> openin (subtopology euclidean S) C\<close>)
       
 10292     show "\<exists>\<U>\<subseteq>\<B> - {{}}. T = \<Union>\<U>" if "openin (subtopology euclidean S) T" for T
       
 10293       using \<B> [OF that]
       
 10294       apply clarify
       
 10295       apply (rule_tac x="\<U> - {{}}" in exI, auto)
       
 10296         done
       
 10297   qed auto
       
 10298 qed
       
 10299 
 10210 lemma univ_second_countable_sequence:
 10300 lemma univ_second_countable_sequence:
 10211   obtains B :: "nat \<Rightarrow> 'a::euclidean_space set"
 10301   obtains B :: "nat \<Rightarrow> 'a::euclidean_space set"
 10212     where "inj B" "\<And>n. open(B n)" "\<And>S. open S \<Longrightarrow> \<exists>k. S = \<Union>{B n |n. n \<in> k}"
 10302     where "inj B" "\<And>n. open(B n)" "\<And>S. open S \<Longrightarrow> \<exists>k. S = \<Union>{B n |n. n \<in> k}"
 10213 proof -
 10303 proof -
 10214   obtain \<B> :: "'a set set"
 10304   obtain \<B> :: "'a set set"
 10240     done
 10330     done
 10241   show ?thesis
 10331   show ?thesis
 10242     apply (rule that [OF \<open>inj f\<close> _ *])
 10332     apply (rule that [OF \<open>inj f\<close> _ *])
 10243     apply (auto simp: \<open>\<B> = range f\<close> op)
 10333     apply (auto simp: \<open>\<B> = range f\<close> op)
 10244     done
 10334     done
       
 10335 qed
       
 10336 
       
 10337 proposition separable:
       
 10338   fixes S :: "'a:: euclidean_space set"
       
 10339   obtains T where "countable T" "T \<subseteq> S" "S \<subseteq> closure T"
       
 10340 proof -
       
 10341   obtain \<B> :: "'a:: euclidean_space set set"
       
 10342     where "countable \<B>"
       
 10343       and "{} \<notin> \<B>"
       
 10344       and ope: "\<And>C. C \<in> \<B> \<Longrightarrow> openin(subtopology euclidean S) C"
       
 10345       and if_ope: "\<And>T. openin(subtopology euclidean S) T \<Longrightarrow> \<exists>\<U>. \<U> \<subseteq> \<B> \<and> T = \<Union>\<U>"
       
 10346     by (meson subset_second_countable)
       
 10347   then obtain f where f: "\<And>C. C \<in> \<B> \<Longrightarrow> f C \<in> C"
       
 10348     by (metis equals0I)
       
 10349   show ?thesis
       
 10350   proof
       
 10351     show "countable (f ` \<B>)"
       
 10352       by (simp add: \<open>countable \<B>\<close>)
       
 10353     show "f ` \<B> \<subseteq> S"
       
 10354       using ope f openin_imp_subset by blast
       
 10355     show "S \<subseteq> closure (f ` \<B>)"
       
 10356     proof (clarsimp simp: closure_approachable)
       
 10357       fix x and e::real
       
 10358       assume "x \<in> S" "0 < e"
       
 10359       have "openin (subtopology euclidean S) (S \<inter> ball x e)"
       
 10360         by (simp add: openin_Int_open)
       
 10361       with if_ope obtain \<U> where  \<U>: "\<U> \<subseteq> \<B>" "S \<inter> ball x e = \<Union>\<U>"
       
 10362         by meson
       
 10363       show "\<exists>C \<in> \<B>. dist (f C) x < e"
       
 10364       proof (cases "\<U> = {}")
       
 10365         case True
       
 10366         then show ?thesis
       
 10367           using \<open>0 < e\<close>  \<U> \<open>x \<in> S\<close> by auto
       
 10368       next
       
 10369         case False
       
 10370         then obtain C where "C \<in> \<U>" by blast
       
 10371         show ?thesis
       
 10372         proof
       
 10373           show "dist (f C) x < e"
       
 10374             by (metis Int_iff Union_iff \<U> \<open>C \<in> \<U>\<close> dist_commute f mem_ball subsetCE)
       
 10375           show "C \<in> \<B>"
       
 10376             using \<open>\<U> \<subseteq> \<B>\<close> \<open>C \<in> \<U>\<close> by blast
       
 10377         qed
       
 10378       qed
       
 10379     qed
       
 10380   qed
 10245 qed
 10381 qed
 10246 
 10382 
 10247 proposition Lindelof:
 10383 proposition Lindelof:
 10248   fixes \<F> :: "'a::euclidean_space set set"
 10384   fixes \<F> :: "'a::euclidean_space set set"
 10249   assumes \<F>: "\<And>S. S \<in> \<F> \<Longrightarrow> open S"
 10385   assumes \<F>: "\<And>S. S \<in> \<F> \<Longrightarrow> open S"
 10787   then show ?thesis
 10923   then show ?thesis
 10788     by (simp add: connected_closedin_eq)
 10924     by (simp add: connected_closedin_eq)
 10789 qed
 10925 qed
 10790 
 10926 
 10791 lemma continuous_disconnected_range_constant_eq:
 10927 lemma continuous_disconnected_range_constant_eq:
 10792       "(connected s \<longleftrightarrow>
 10928       "(connected S \<longleftrightarrow>
 10793            (\<forall>f::'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1.
 10929            (\<forall>f::'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1.
 10794             \<forall>t. continuous_on s f \<and> f ` s \<subseteq> t \<and> (\<forall>y \<in> t. connected_component_set t y = {y})
 10930             \<forall>t. continuous_on S f \<and> f ` S \<subseteq> t \<and> (\<forall>y \<in> t. connected_component_set t y = {y})
 10795             \<longrightarrow> (\<exists>a::'b. \<forall>x \<in> s. f x = a)))" (is ?thesis1)
 10931             \<longrightarrow> (\<exists>a::'b. \<forall>x \<in> S. f x = a)))" (is ?thesis1)
 10796   and continuous_discrete_range_constant_eq:
 10932   and continuous_discrete_range_constant_eq:
 10797       "(connected s \<longleftrightarrow>
 10933       "(connected S \<longleftrightarrow>
 10798          (\<forall>f::'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1.
 10934          (\<forall>f::'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1.
 10799           continuous_on s f \<and>
 10935           continuous_on S f \<and>
 10800           (\<forall>x \<in> s. \<exists>e. 0 < e \<and> (\<forall>y. y \<in> s \<and> (f y \<noteq> f x) \<longrightarrow> e \<le> norm(f y - f x)))
 10936           (\<forall>x \<in> S. \<exists>e. 0 < e \<and> (\<forall>y. y \<in> S \<and> (f y \<noteq> f x) \<longrightarrow> e \<le> norm(f y - f x)))
 10801           \<longrightarrow> (\<exists>a::'b. \<forall>x \<in> s. f x = a)))" (is ?thesis2)
 10937           \<longrightarrow> (\<exists>a::'b. \<forall>x \<in> S. f x = a)))" (is ?thesis2)
 10802   and continuous_finite_range_constant_eq:
 10938   and continuous_finite_range_constant_eq:
 10803       "(connected s \<longleftrightarrow>
 10939       "(connected S \<longleftrightarrow>
 10804          (\<forall>f::'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1.
 10940          (\<forall>f::'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1.
 10805           continuous_on s f \<and> finite (f ` s)
 10941           continuous_on S f \<and> finite (f ` S)
 10806           \<longrightarrow> (\<exists>a::'b. \<forall>x \<in> s. f x = a)))" (is ?thesis3)
 10942           \<longrightarrow> (\<exists>a::'b. \<forall>x \<in> S. f x = a)))" (is ?thesis3)
 10807 proof -
 10943 proof -
 10808   have *: "\<And>s t u v. \<lbrakk>s \<Longrightarrow> t; t \<Longrightarrow> u; u \<Longrightarrow> v; v \<Longrightarrow> s\<rbrakk>
 10944   have *: "\<And>s t u v. \<lbrakk>s \<Longrightarrow> t; t \<Longrightarrow> u; u \<Longrightarrow> v; v \<Longrightarrow> s\<rbrakk>
 10809     \<Longrightarrow> (s \<longleftrightarrow> t) \<and> (s \<longleftrightarrow> u) \<and> (s \<longleftrightarrow> v)"
 10945     \<Longrightarrow> (s \<longleftrightarrow> t) \<and> (s \<longleftrightarrow> u) \<and> (s \<longleftrightarrow> v)"
 10810     by blast
 10946     by blast
 10811   have "?thesis1 \<and> ?thesis2 \<and> ?thesis3"
 10947   have "?thesis1 \<and> ?thesis2 \<and> ?thesis3"
 10820     by blast+
 10956     by blast+
 10821 qed
 10957 qed
 10822 
 10958 
 10823 lemma continuous_discrete_range_constant:
 10959 lemma continuous_discrete_range_constant:
 10824   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1"
 10960   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1"
 10825   assumes s: "connected s"
 10961   assumes S: "connected S"
 10826       and "continuous_on s f"
 10962       and "continuous_on S f"
 10827       and "\<And>x. x \<in> s \<Longrightarrow> \<exists>e>0. \<forall>y. y \<in> s \<and> f y \<noteq> f x \<longrightarrow> e \<le> norm (f y - f x)"
 10963       and "\<And>x. x \<in> S \<Longrightarrow> \<exists>e>0. \<forall>y. y \<in> S \<and> f y \<noteq> f x \<longrightarrow> e \<le> norm (f y - f x)"
 10828     shows "\<exists>a. \<forall>x \<in> s. f x = a"
 10964     obtains a where "\<And>x. x \<in> S \<Longrightarrow> f x = a"
 10829   using continuous_discrete_range_constant_eq [THEN iffD1, OF s] assms
 10965   using continuous_discrete_range_constant_eq [THEN iffD1, OF S] assms
 10830   by blast
 10966   by blast
 10831 
 10967 
 10832 lemma continuous_finite_range_constant:
 10968 lemma continuous_finite_range_constant:
 10833   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1"
 10969   fixes f :: "'a::topological_space \<Rightarrow> 'b::real_normed_algebra_1"
 10834   assumes "connected s"
 10970   assumes "connected S"
 10835       and "continuous_on s f"
 10971       and "continuous_on S f"
 10836       and "finite (f ` s)"
 10972       and "finite (f ` S)"
 10837     shows "\<exists>a. \<forall>x \<in> s. f x = a"
 10973     obtains a where "\<And>x. x \<in> S \<Longrightarrow> f x = a"
 10838   using assms continuous_finite_range_constant_eq
 10974   using assms continuous_finite_range_constant_eq
 10839   by blast
 10975   by blast
 10840 
 10976 
 10841 
 10977 
 10842 no_notation
 10978 no_notation