# HG changeset patch # User paulson # Date 1599846931 -3600 # Node ID 4a7e85560df758c7d9bdab58602987978d1e4c73 # Parent dc51115fa4aad5f08e46bb5c9651cc3b04101205# Parent f2b786884815494bc7d9a49375f96cc85b19731c merged diff -r dc51115fa4aa -r 4a7e85560df7 src/HOL/Analysis/Path_Connected.thy --- a/src/HOL/Analysis/Path_Connected.thy Fri Sep 11 14:04:16 2020 +0200 +++ b/src/HOL/Analysis/Path_Connected.thy Fri Sep 11 18:55:31 2020 +0100 @@ -48,21 +48,21 @@ unfolding path_def path_image_def using continuous_on_compose by blast -lemma path_translation_eq: - fixes g :: "real \ 'a :: real_normed_vector" - shows "path((\x. a + x) \ g) = path g" +lemma continuous_on_translation_eq: + fixes g :: "'a :: real_normed_vector \ 'b :: real_normed_vector" + shows "continuous_on A ((+) a \ g) = continuous_on A g" proof - have g: "g = (\x. -a + x) \ ((\x. a + x) \ g)" by (rule ext) simp show ?thesis - unfolding path_def - apply safe - apply (subst g) - apply (rule continuous_on_compose) - apply (auto intro: continuous_intros) - done + by (metis (no_types, hide_lams) g continuous_on_compose homeomorphism_def homeomorphism_translation) qed +lemma path_translation_eq: + fixes g :: "real \ 'a :: real_normed_vector" + shows "path((\x. a + x) \ g) = path g" + using continuous_on_translation_eq path_def by blast + lemma path_linear_image_eq: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" assumes "linear f" "inj f" @@ -234,9 +234,7 @@ apply (auto intro: continuous_intros continuous_on_subset[of "{0..1}"]) done show ?thesis - using *[of "reversepath g"] *[of g] - unfolding reversepath_reversepath - by (rule iffI) + using "*" by force qed lemma arc_reversepath: @@ -350,16 +348,29 @@ by auto lemma path_image_join: - "pathfinish g1 = pathstart g2 \ path_image(g1 +++ g2) = path_image g1 \ path_image g2" - apply (rule subset_antisym [OF path_image_join_subset]) - apply (auto simp: pathfinish_def pathstart_def path_image_def joinpaths_def image_def) - apply (drule sym) - apply (rule_tac x="xa/2" in bexI, auto) - apply (rule ccontr) - apply (drule_tac x="(xa+1)/2" in bspec) - apply (auto simp: field_simps) - apply (drule_tac x="1/2" in bspec, auto) - done + assumes "pathfinish g1 = pathstart g2" + shows "path_image(g1 +++ g2) = path_image g1 \ path_image g2" +proof - + have "path_image g1 \ path_image (g1 +++ g2)" + proof (clarsimp simp: path_image_def joinpaths_def) + fix u::real + assume "0 \ u" "u \ 1" + then show "g1 u \ (\x. g1 (2 * x)) ` ({0..1} \ {x. x * 2 \ 1})" + by (rule_tac x="u/2" in image_eqI) auto + qed + moreover + have \
: "g2 u \ (\x. g2 (2 * x - 1)) ` ({0..1} \ {x. \ x * 2 \ 1})" + if "0 < u" "u \ 1" for u + using that assms + by (rule_tac x="(u+1)/2" in image_eqI) (auto simp: field_simps pathfinish_def pathstart_def) + have "g2 0 \ (\x. g1 (2 * x)) ` ({0..1} \ {x. x * 2 \ 1})" + using assms + by (rule_tac x="1/2" in image_eqI) (auto simp: pathfinish_def pathstart_def) + then have "path_image g2 \ path_image (g1 +++ g2)" + by (auto simp: path_image_def joinpaths_def intro!: \
) + ultimately show ?thesis + using path_image_join_subset by blast +qed lemma not_in_path_image_join: assumes "x \ path_image g1" @@ -396,20 +407,28 @@ subsection\<^marker>\tag unimportant\\Simple paths with the endpoints removed\ lemma simple_path_endless: - "simple_path c \ path_image c - {pathstart c,pathfinish c} = c ` {0<..<1}" - apply (auto simp: simple_path_def path_image_def pathstart_def pathfinish_def Ball_def Bex_def image_def) - apply (metis eq_iff le_less_linear) - apply (metis leD linear) - using less_eq_real_def zero_le_one apply blast - using less_eq_real_def zero_le_one apply blast - done + assumes "simple_path c" + shows "path_image c - {pathstart c,pathfinish c} = c ` {0<..<1}" (is "?lhs = ?rhs") +proof + show "?lhs \ ?rhs" + using less_eq_real_def by (auto simp: path_image_def pathstart_def pathfinish_def) + show "?rhs \ ?lhs" + using assms + apply (auto simp: simple_path_def path_image_def pathstart_def pathfinish_def Ball_def) + using less_eq_real_def zero_le_one by blast+ +qed lemma connected_simple_path_endless: - "simple_path c \ connected(path_image c - {pathstart c,pathfinish c})" -apply (simp add: simple_path_endless) -apply (rule connected_continuous_image) -apply (meson continuous_on_subset greaterThanLessThan_subseteq_atLeastAtMost_iff le_numeral_extra(3) le_numeral_extra(4) path_def simple_path_imp_path) -by auto + assumes "simple_path c" + shows "connected(path_image c - {pathstart c,pathfinish c})" +proof - + have "continuous_on {0<..<1} c" + using assms by (simp add: simple_path_def continuous_on_path path_def subset_iff) + then have "connected (c ` {0<..<1})" + using connected_Ioo connected_continuous_image by blast + then show ?thesis + using assms by (simp add: simple_path_endless) +qed lemma nonempty_simple_path_endless: "simple_path c \ path_image c - {pathstart c,pathfinish c} \ {}" @@ -419,13 +438,10 @@ subsection\<^marker>\tag unimportant\\The operations on paths\ lemma path_image_subset_reversepath: "path_image(reversepath g) \ path_image g" - by (auto simp: path_image_def reversepath_def) + by simp lemma path_imp_reversepath: "path g \ path(reversepath g)" - apply (auto simp: path_def reversepath_def) - using continuous_on_compose [of "{0..1}" "\x. 1 - x" g] - apply (auto simp: continuous_on_op_minus) - done + by simp lemma half_bounded_equal: "1 \ x * 2 \ x * 2 \ 1 \ x = (1/2::real)" by simp @@ -434,32 +450,14 @@ assumes "continuous_on {0..1} g1" "continuous_on {0..1} g2" "pathfinish g1 = pathstart g2" shows "continuous_on {0..1} (g1 +++ g2)" proof - - have *: "{0..1::real} = {0..1/2} \ {1/2..1}" + have "{0..1::real} = {0..1/2} \ {1/2..1}" by auto - have gg: "g2 0 = g1 1" - by (metis assms(3) pathfinish_def pathstart_def) - have 1: "continuous_on {0..1/2} (g1 +++ g2)" - apply (rule continuous_on_eq [of _ "g1 \ (\x. 2*x)"]) - apply (rule continuous_intros | simp add: joinpaths_def assms)+ - done - have "continuous_on {1/2..1} (g2 \ (\x. 2*x-1))" - apply (rule continuous_on_subset [of "{1/2..1}"]) - apply (rule continuous_intros | simp add: image_affinity_atLeastAtMost_diff assms)+ - done - then have 2: "continuous_on {1/2..1} (g1 +++ g2)" - apply (rule continuous_on_eq [of "{1/2..1}" "g2 \ (\x. 2*x-1)"]) - apply (rule assms continuous_intros | simp add: joinpaths_def mult.commute half_bounded_equal gg)+ - done - show ?thesis - apply (subst *) - apply (rule continuous_on_closed_Un) - using 1 2 - apply auto - done + then show ?thesis + using assms by (metis path_def path_join) qed lemma path_join_imp: "\path g1; path g2; pathfinish g1 = pathstart g2\ \ path(g1 +++ g2)" - by (simp) + by simp lemma simple_path_join_loop: assumes "arc g1" "arc g2" @@ -479,44 +477,35 @@ using assms by (simp_all add: arc_def pathfinish_def pathstart_def path_image_def) { fix x and y::real - assume xyI: "x = 1 \ y \ 0" - and xy: "x \ 1" "0 \ y" " y * 2 \ 1" "\ x * 2 \ 1" "g2 (2 * x - 1) = g1 (2 * y)" - have g1im: "g1 (2 * y) \ g1 ` {0..1} \ g2 ` {0..1}" - using xy - apply simp - apply (rule_tac x="2 * x - 1" in image_eqI, auto) - done - have False - using subsetD [OF sb g1im] xy - apply auto - apply (drule inj_onD [OF injg1]) - using g21 [symmetric] xyI - apply (auto dest: inj_onD [OF injg2]) - done - } note * = this + assume g2_eq: "g2 (2 * x - 1) = g1 (2 * y)" + and xyI: "x \ 1 \ y \ 0" + and xy: "x \ 1" "0 \ y" " y * 2 \ 1" "\ x * 2 \ 1" + then consider "g1 (2 * y) = g1 0" | "g1 (2 * y) = g2 0" + using sb by force + then have False + proof cases + case 1 + then have "y = 0" + using xy g2_eq by (auto dest!: inj_onD [OF injg1]) + then show ?thesis + using xy g2_eq xyI by (auto dest: inj_onD [OF injg2] simp flip: g21) + next + case 2 + then have "2*x = 1" + using g2_eq g12 inj_onD [OF injg2] atLeastAtMost_iff xy(1) xy(4) by fastforce + with xy show False by auto + qed + } note * = this { fix x and y::real - assume xy: "y \ 1" "0 \ x" "\ y * 2 \ 1" "x * 2 \ 1" "g1 (2 * x) = g2 (2 * y - 1)" - have g1im: "g1 (2 * x) \ g1 ` {0..1} \ g2 ` {0..1}" - using xy - apply simp - apply (rule_tac x="2 * x" in image_eqI, auto) - done - have "x = 0 \ y = 1" - using subsetD [OF sb g1im] xy - apply auto - apply (force dest: inj_onD [OF injg1]) - using g21 [symmetric] - apply (auto dest: inj_onD [OF injg2]) - done + assume xy: "g1 (2 * x) = g2 (2 * y - 1)" "y \ 1" "0 \ x" "\ y * 2 \ 1" "x * 2 \ 1" + then have "x = 0 \ y = 1" + using * xy by force } note ** = this show ?thesis using assms - apply (simp add: arc_def simple_path_def, clarify) - apply (simp add: joinpaths_def split: if_split_asm) - apply (force dest: inj_onD [OF injg1]) - apply (metis *) - apply (metis **) - apply (force dest: inj_onD [OF injg2]) + apply (simp add: arc_def simple_path_def) + apply (auto simp: joinpaths_def split: if_split_asm + dest!: * ** dest: inj_onD [OF injg1] inj_onD [OF injg2]) done qed @@ -537,24 +526,17 @@ using assms by (simp_all add: arc_def pathfinish_def pathstart_def path_image_def) { fix x and y::real - assume xy: "x \ 1" "0 \ y" " y * 2 \ 1" "\ x * 2 \ 1" "g2 (2 * x - 1) = g1 (2 * y)" - have g1im: "g1 (2 * y) \ g1 ` {0..1} \ g2 ` {0..1}" - using xy - apply simp - apply (rule_tac x="2 * x - 1" in image_eqI, auto) - done - have False - using subsetD [OF sb g1im] xy - by (auto dest: inj_onD [OF injg2]) + assume xy: "g2 (2 * x - 1) = g1 (2 * y)" "x \ 1" "0 \ y" " y * 2 \ 1" "\ x * 2 \ 1" + then have "g1 (2 * y) = g2 0" + using sb by force + then have False + using xy inj_onD injg2 by fastforce } note * = this show ?thesis + using assms apply (simp add: arc_def inj_on_def) - apply (clarsimp simp add: arc_imp_path assms) - apply (simp add: joinpaths_def split: if_split_asm) - apply (force dest: inj_onD [OF injg1]) - apply (metis *) - apply (metis *) - apply (force dest: inj_onD [OF injg2]) + apply (auto simp: joinpaths_def arc_imp_path split: if_split_asm + dest: * *[OF sym] inj_onD [OF injg1] inj_onD [OF injg2]) done qed @@ -577,18 +559,18 @@ by auto then have "e > 0" by (metis e_def pathfinish_def pathstart_def) + then have "\e>0. \d>0. \x'\{0..1}. dist x' 0 < d \ dist (g2 x') (g2 0) < e" + using \path g2\ atLeastAtMost_iff zero_le_one unfolding path_def continuous_on_iff + by blast then obtain d1 where "d1 > 0" and d1: "\x'. \x'\{0..1}; norm x' < d1\ \ dist (g2 x') (g2 0) < e/2" - using assms(2) unfolding path_def continuous_on_iff - apply (drule_tac x=0 in bspec, simp) - by (metis half_gt_zero_iff norm_conv_dist) + by (metis \0 < e\ half_gt_zero_iff norm_conv_dist) obtain d2 where "d2 > 0" and d2: "\x'. \x'\{0..1}; dist x' (1/2) < d2\ \ dist ((g1 +++ g2) x') (g1 1) < e/2" using assms(1) \e > 0\ unfolding path_def continuous_on_iff apply (drule_tac x="1/2" in bspec, simp) - apply (drule_tac x="e/2" in spec) - apply (force simp: joinpaths_def) + apply (drule_tac x="e/2" in spec, force simp: joinpaths_def) done have int01_1: "min (1/2) (min d1 d2) / 2 \ {0..1}" using \d1 > 0\ \d2 > 0\ by (simp add: min_def) @@ -681,8 +663,7 @@ unfolding pathstart_def path_image_def using atLeastAtMost_iff by blast show ?rhs using \?lhs\ - apply (rule simple_path_joinE [OF arc_imp_simple_path assms]) - using n1 by force + using \simple_path (g1 +++ g2)\ assms n1 simple_path_joinE by auto next assume ?rhs then show ?lhs using assms @@ -790,9 +771,8 @@ shows "path(subpath u v g)" proof - have "continuous_on {0..1} (g \ (\x. ((v-u) * x+ u)))" - apply (rule continuous_intros | simp)+ - apply (simp add: image_affinity_atLeastAtMost [where c=u]) using assms + apply (intro continuous_intros; simp add: image_affinity_atLeastAtMost [where c=u]) apply (auto simp: path_def continuous_on_subset) done then show ?thesis @@ -841,7 +821,7 @@ (\x y. x \ closed_segment u v \ y \ closed_segment u v \ g x = g y \ x = y \ x = u \ y = v \ x = v \ y = u)" (is "?lhs = ?rhs") -proof (rule iffI) +proof assume ?lhs then have p: "path (\x. g ((v - u) * x + u))" and sim: "(\x y. \x\{0..1}; y\{0..1}; g ((v - u) * x + u) = g ((v - u) * y + u)\ @@ -877,7 +857,7 @@ lemma arc_subpath_eq: "arc(subpath u v g) \ path(subpath u v g) \ u\v \ inj_on g (closed_segment u v)" (is "?lhs = ?rhs") -proof (rule iffI) +proof assume ?lhs then have p: "path (\x. g ((v - u) * x + u))" and sim: "(\x y. \x\{0..1}; y\{0..1}; g ((v - u) * x + u) = g ((v - u) * y + u)\ @@ -929,15 +909,11 @@ lemma arc_simple_path_subpath_interior: "\simple_path g; u \ {0..1}; v \ {0..1}; u \ v; \u-v\ < 1\ \ arc(subpath u v g)" - apply (rule arc_simple_path_subpath) - apply (force simp: simple_path_def)+ - done + by (force simp: simple_path_def intro: arc_simple_path_subpath) lemma path_image_subpath_subset: "\u \ {0..1}; v \ {0..1}\ \ path_image(subpath u v g) \ path_image g" - apply (simp add: closed_segment_real_eq image_affinity_atLeastAtMost path_image_subpath) - apply (auto simp: path_image_def) - done + by (metis atLeastAtMost_iff atLeastatMost_subset_iff path_image_def path_image_subpath subset_image_iff) lemma join_subpaths_middle: "subpath (0) ((1 / 2)) p +++ subpath ((1 / 2)) 1 p = p" by (rule ext) (simp add: joinpaths_def subpath_def field_split_simps) @@ -952,11 +928,13 @@ "\x. 0 \ x \ x < u \ g x \ interior S" "(g u \ interior S)" "(u = 0 \ g u \ closure S)" proof - - have gcon: "continuous_on {0..1} g" using g by (simp add: path_def) - then have com: "compact ({0..1} \ {u. g u \ closure (- S)})" - apply (simp add: Int_commute [of "{0..1}"] compact_eq_bounded_closed closed_vimage_Int [unfolded vimage_def]) - using compact_eq_bounded_closed apply fastforce - done + have gcon: "continuous_on {0..1} g" + using g by (simp add: path_def) + moreover have "bounded ({u. g u \ closure (- S)} \ {0..1})" + using compact_eq_bounded_closed by fastforce + ultimately have com: "compact ({0..1} \ {u. g u \ closure (- S)})" + using closed_vimage_Int + by (metis (full_types) Int_commute closed_atLeastAtMost closed_closure compact_eq_bounded_closed vimage_def) have "1 \ {u. g u \ closure (- S)}" using assms by (simp add: pathfinish_def closure_def) then have dis: "{0..1} \ {u. g u \ closure (- S)} \ {}" @@ -966,8 +944,9 @@ using compact_attains_inf [OF com dis] by fastforce then have umin': "\t. \0 \ t; t \ 1; t < u\ \ g t \ S" using closure_def by fastforce - { assume "u \ 0" - then have "u > 0" using \0 \ u\ by auto + have \
: "g u \ closure S" if "u \ 0" + proof - + have "u > 0" using that \0 \ u\ by auto { fix e::real assume "e > 0" obtain d where "d>0" and d: "\x'. \x' \ {0..1}; dist x' u \ d\ \ dist (g x') (g u) < e" using continuous_onE [OF gcon _ \e > 0\] \0 \ _\ \_ \ 1\ atLeastAtMost_iff by auto @@ -977,14 +956,16 @@ using \0 < u\ \u \ 1\ \d > 0\ by (force intro: d [OF _ *] umin') } - then have "g u \ closure S" + then show ?thesis by (simp add: frontier_def closure_approachable) - } - then show ?thesis - apply (rule_tac u=u in that) - apply (auto simp: \0 \ u\ \u \ 1\ gu interior_closure umin) - using \_ \ 1\ interior_closure umin apply fastforce - done + qed + show ?thesis + proof + show "\x. 0 \ x \ x < u \ g x \ interior S" + using \u \ 1\ interior_closure umin by fastforce + show "g u \ interior S" + by (simp add: gu interior_closure) + qed (use \0 \ u\ \u \ 1\ \
in auto) qed lemma subpath_to_frontier_strong: @@ -997,30 +978,47 @@ and gunot: "(g u \ interior S)" and u0: "(u = 0 \ g u \ closure S)" using subpath_to_frontier_explicit [OF assms] by blast show ?thesis - apply (rule that [OF \0 \ u\ \u \ 1\]) - apply (simp add: gunot) - using \0 \ u\ u0 by (force simp: subpath_def gxin) + proof + show "g u \ interior S" + using gunot by blast + qed (use \0 \ u\ \u \ 1\ u0 in \(force simp: subpath_def gxin)+\) qed lemma subpath_to_frontier: assumes g: "path g" and g0: "pathstart g \ closure S" and g1: "pathfinish g \ S" - obtains u where "0 \ u" "u \ 1" "g u \ frontier S" "(path_image(subpath 0 u g) - {g u}) \ interior S" + obtains u where "0 \ u" "u \ 1" "g u \ frontier S" "path_image(subpath 0 u g) - {g u} \ interior S" proof - obtain u where "0 \ u" "u \ 1" and notin: "g u \ interior S" and disj: "u = 0 \ (\x. 0 \ x \ x < 1 \ subpath 0 u g x \ interior S) \ g u \ closure S" + (is "_ \ ?P") using subpath_to_frontier_strong [OF g g1] by blast show ?thesis - apply (rule that [OF \0 \ u\ \u \ 1\]) - apply (metis DiffI disj frontier_def g0 notin pathstart_def) - using \0 \ u\ g0 disj - apply (simp add: path_image_subpath_gen) - apply (auto simp: closed_segment_eq_real_ivl pathstart_def pathfinish_def subpath_def) - apply (rename_tac y) - apply (drule_tac x="y/u" in spec) - apply (auto split: if_split_asm) - done + proof + show "g u \ frontier S" + by (metis DiffI disj frontier_def g0 notin pathstart_def) + show "path_image (subpath 0 u g) - {g u} \ interior S" + using disj + proof + assume "u = 0" + then show ?thesis + by (simp add: path_image_subpath) + next + assume P: ?P + show ?thesis + proof (clarsimp simp add: path_image_subpath_gen) + fix y + assume y: "y \ closed_segment 0 u" "g y \ interior S" + with \0 \ u\ have "0 \ y" "y \ u" + by (auto simp: closed_segment_eq_real_ivl split: if_split_asm) + then have "y=u \ subpath 0 u g (y/u) \ interior S" + using P less_eq_real_def by force + then show "g y = g u" + using y by (auto simp: subpath_def split: if_split_asm) + qed + qed + qed (use \0 \ u\ \u \ 1\ in auto) qed lemma exists_path_subpath_to_frontier: @@ -1033,12 +1031,12 @@ obtain u where u: "0 \ u" "u \ 1" "g u \ frontier S" "(path_image(subpath 0 u g) - {g u}) \ interior S" using subpath_to_frontier [OF assms] by blast show ?thesis - apply (rule that [of "subpath 0 u g"]) - using assms u - apply (simp_all add: path_image_subpath) - apply (simp add: pathstart_def) - apply (force simp: closed_segment_eq_real_ivl path_image_def) - done + proof + show "path_image (subpath 0 u g) \ path_image g" + by (simp add: path_image_subpath_subset u) + show "pathstart (subpath 0 u g) = pathstart g" + by (metis pathstart_def pathstart_subpath) + qed (use assms u in \auto simp: path_image_subpath\) qed lemma exists_path_subpath_to_frontier_closed: @@ -1052,11 +1050,10 @@ "pathfinish h \ frontier S" using exists_path_subpath_to_frontier [OF g _ g1] closure_closed [OF S] g0 by auto show ?thesis - apply (rule that [OF \path h\]) - using assms h - apply auto - apply (metis Diff_single_insert frontier_subset_eq insert_iff interior_subset subset_iff) - done + proof + show "path_image h \ path_image g \ S" + using assms h interior_subset [of S] by (auto simp: frontier_def) + qed (use h in auto) qed @@ -1144,9 +1141,7 @@ case False then show ?thesis apply (rule_tac x="1 + x - a" in bexI) - using g gne[of "1 + x - a"] a - apply (force simp: field_simps)+ - done + using g gne[of "1 + x - a"] a by (force simp: field_simps)+ next case True then show ?thesis @@ -1286,15 +1281,17 @@ by (auto simp: segment linepath_def) lemma linepath_in_convex_hull: - fixes x::real - assumes a: "a \ convex hull s" - and b: "b \ convex hull s" - and x: "0\x" "x\1" - shows "linepath a b x \ convex hull s" - apply (rule closed_segment_subset_convex_hull [OF a b, THEN subsetD]) - using x - apply (auto simp: linepath_image_01 [symmetric]) - done + fixes x::real + assumes a: "a \ convex hull S" + and b: "b \ convex hull S" + and x: "0\x" "x\1" + shows "linepath a b x \ convex hull S" +proof - + have "linepath a b x \ closed_segment a b" + using x by (auto simp flip: linepath_image_01) + then show ?thesis + using a b convex_contains_segment by blast +qed lemma Re_linepath: "Re(linepath (of_real a) (of_real b) x) = (1 - x)*a + x*b" by (simp add: linepath_def) @@ -1322,10 +1319,8 @@ by (auto simp: linepath_def) lemma has_vector_derivative_linepath_within: - "(linepath a b has_vector_derivative (b - a)) (at x within s)" -apply (simp add: linepath_def has_vector_derivative_def algebra_simps) -apply (rule derivative_eq_intros | simp)+ -done + "(linepath a b has_vector_derivative (b - a)) (at x within S)" + by (force intro: derivative_eq_intros simp add: linepath_def has_vector_derivative_def algebra_simps) subsection\<^marker>\tag unimportant\\Segments via convex hulls\ @@ -1480,105 +1475,98 @@ text \Original formalization by Tom Hales\ -definition\<^marker>\tag important\ "path_component s x y \ - (\g. path g \ path_image g \ s \ pathstart g = x \ pathfinish g = y)" +definition\<^marker>\tag important\ "path_component S x y \ + (\g. path g \ path_image g \ S \ pathstart g = x \ pathfinish g = y)" abbreviation\<^marker>\tag important\ - "path_component_set s x \ Collect (path_component s x)" + "path_component_set S x \ Collect (path_component S x)" lemmas path_defs = path_def pathstart_def pathfinish_def path_image_def path_component_def lemma path_component_mem: - assumes "path_component s x y" - shows "x \ s" and "y \ s" + assumes "path_component S x y" + shows "x \ S" and "y \ S" using assms unfolding path_defs by auto lemma path_component_refl: - assumes "x \ s" - shows "path_component s x x" - unfolding path_defs - apply (rule_tac x="\u. x" in exI) + assumes "x \ S" + shows "path_component S x x" using assms - apply (auto intro!: continuous_intros) - done - -lemma path_component_refl_eq: "path_component s x x \ x \ s" + unfolding path_defs + by (metis (full_types) assms continuous_on_const image_subset_iff path_image_def) + +lemma path_component_refl_eq: "path_component S x x \ x \ S" by (auto intro!: path_component_mem path_component_refl) -lemma path_component_sym: "path_component s x y \ path_component s y x" +lemma path_component_sym: "path_component S x y \ path_component S y x" unfolding path_component_def - apply (erule exE) - apply (rule_tac x="reversepath g" in exI, auto) - done + by (metis (no_types) path_image_reversepath path_reversepath pathfinish_reversepath pathstart_reversepath) lemma path_component_trans: - assumes "path_component s x y" and "path_component s y z" - shows "path_component s x z" + assumes "path_component S x y" and "path_component S y z" + shows "path_component S x z" using assms unfolding path_component_def - apply (elim exE) - apply (rule_tac x="g +++ ga" in exI) - apply (auto simp: path_image_join) - done - -lemma path_component_of_subset: "s \ t \ path_component s x y \ path_component t x y" + by (metis path_join pathfinish_join pathstart_join subset_path_image_join) + +lemma path_component_of_subset: "S \ T \ path_component S x y \ path_component T x y" unfolding path_component_def by auto lemma path_component_linepath: - fixes s :: "'a::real_normed_vector set" - shows "closed_segment a b \ s \ path_component s a b" + fixes S :: "'a::real_normed_vector set" + shows "closed_segment a b \ S \ path_component S a b" unfolding path_component_def by (rule_tac x="linepath a b" in exI, auto) subsubsection\<^marker>\tag unimportant\ \Path components as sets\ lemma path_component_set: - "path_component_set s x = - {y. (\g. path g \ path_image g \ s \ pathstart g = x \ pathfinish g = y)}" + "path_component_set S x = + {y. (\g. path g \ path_image g \ S \ pathstart g = x \ pathfinish g = y)}" by (auto simp: path_component_def) -lemma path_component_subset: "path_component_set s x \ s" +lemma path_component_subset: "path_component_set S x \ S" by (auto simp: path_component_mem(2)) -lemma path_component_eq_empty: "path_component_set s x = {} \ x \ s" +lemma path_component_eq_empty: "path_component_set S x = {} \ x \ S" using path_component_mem path_component_refl_eq by fastforce lemma path_component_mono: - "s \ t \ (path_component_set s x) \ (path_component_set t x)" + "S \ T \ (path_component_set S x) \ (path_component_set T x)" by (simp add: Collect_mono path_component_of_subset) lemma path_component_eq: - "y \ path_component_set s x \ path_component_set s y = path_component_set s x" + "y \ path_component_set S x \ path_component_set S y = path_component_set S x" by (metis (no_types, lifting) Collect_cong mem_Collect_eq path_component_sym path_component_trans) subsection \Path connectedness of a space\ -definition\<^marker>\tag important\ "path_connected s \ - (\x\s. \y\s. \g. path g \ path_image g \ s \ pathstart g = x \ pathfinish g = y)" +definition\<^marker>\tag important\ "path_connected S \ + (\x\S. \y\S. \g. path g \ path_image g \ S \ pathstart g = x \ pathfinish g = y)" lemma path_connectedin_iff_path_connected_real [simp]: "path_connectedin euclideanreal S \ path_connected S" by (simp add: path_connectedin path_connected_def path_defs) -lemma path_connected_component: "path_connected s \ (\x\s. \y\s. path_component s x y)" +lemma path_connected_component: "path_connected S \ (\x\S. \y\S. path_component S x y)" unfolding path_connected_def path_component_def by auto -lemma path_connected_component_set: "path_connected s \ (\x\s. path_component_set s x = s)" +lemma path_connected_component_set: "path_connected S \ (\x\S. path_component_set S x = S)" unfolding path_connected_component path_component_subset using path_component_mem by blast lemma path_component_maximal: - "\x \ t; path_connected t; t \ s\ \ t \ (path_component_set s x)" + "\x \ T; path_connected T; T \ S\ \ T \ (path_component_set S x)" by (metis path_component_mono path_connected_component_set) lemma convex_imp_path_connected: - fixes s :: "'a::real_normed_vector set" - assumes "convex s" - shows "path_connected s" + fixes S :: "'a::real_normed_vector set" + assumes "convex S" + shows "path_connected S" unfolding path_connected_def using assms convex_contains_segment by fastforce @@ -1687,7 +1675,7 @@ qed lemma path_connected_continuous_image: - assumes "continuous_on S f" + assumes contf: "continuous_on S f" and "path_connected S" shows "path_connected (f ` S)" unfolding path_connected_def @@ -1699,12 +1687,8 @@ from x y obtain g where "path g \ path_image g \ S \ pathstart g = x \ pathfinish g = y" using assms(2)[unfolded path_connected_def] by fast then show "\g. path g \ path_image g \ f ` S \ pathstart g = x' \ pathfinish g = y'" - unfolding x' y' - apply (rule_tac x="f \ g" in exI) - unfolding path_defs - apply (intro conjI continuous_on_compose continuous_on_subset[OF assms(1)]) - apply auto - done + unfolding x' y' path_defs + by (fastforce intro: continuous_on_compose continuous_on_subset[OF contf]) qed lemma path_connected_translationI: @@ -1741,11 +1725,7 @@ lemma path_connected_singleton [simp]: "path_connected {a}" unfolding path_connected_def pathstart_def pathfinish_def path_image_def - apply clarify - apply (rule_tac x="\x. a" in exI) - apply (simp add: image_constant_conv) - apply (simp add: path_def) - done + using path_def by fastforce lemma path_connected_Un: assumes "path_connected S" @@ -1804,11 +1784,10 @@ show ?thesis unfolding path_component_def proof (intro exI conjI) - have "continuous_on {0..1} (p \ ((*) y))" - apply (rule continuous_intros)+ - using p [unfolded path_def] y - apply (auto simp: mult_le_one intro: continuous_on_subset [of _ p]) - done + have "continuous_on ((*) y ` {0..1}) p" + by (simp add: continuous_on_path image_mult_atLeastAtMost_if p y) + then have "continuous_on {0..1} (p \ ((*) y))" + using continuous_on_compose continuous_on_mult_const by blast then show "path (\u. p (y * u))" by (simp add: path_def) show "path_image (\u. p (y * u)) \ path_image p" @@ -1830,9 +1809,8 @@ have yz: "path_component s y z" using pa path_component_sym path_component_trans by blast then have "\g. path g \ path_image g \ path_component_set s x \ pathstart g = y \ pathfinish g = z" - apply (simp add: path_component_def, clarify) - apply (rule_tac x=g in exI) - by (simp add: pae path_component_maximal path_connected_path_image pathstart_in_path_image) + apply (simp add: path_component_def) + by (metis pae path_component_maximal path_connected_path_image pathstart_in_path_image) } then show ?thesis by (simp add: path_connected_def) @@ -1847,9 +1825,7 @@ "path_component_set (path_component_set S x) x = path_component_set S x" proof (cases "x \ S") case True show ?thesis - apply (rule subset_antisym) - apply (simp add: path_component_subset) - by (simp add: True path_component_maximal path_component_refl) + by (metis True mem_Collect_eq path_component_refl path_connected_component_set path_connected_path_component) next case False then show ?thesis by (metis False empty_iff path_component_eq_empty) @@ -1859,9 +1835,7 @@ "(path_component_set S x) \ (connected_component_set S x)" proof (cases "x \ S") case True show ?thesis - apply (rule connected_component_maximal) - apply (auto simp: True path_component_subset path_component_refl path_connected_imp_connected) - done + by (simp add: True connected_component_maximal path_component_refl path_component_subset path_connected_imp_connected) next case False then show ?thesis using path_component_eq_empty by auto @@ -1911,10 +1885,8 @@ lemma path_connected_space_subconnected: "path_connected_space X \ (\x \ topspace X. \y \ topspace X. \S. path_connectedin X S \ x \ S \ y \ S)" - unfolding path_connected_space_def Ball_def - apply (intro all_cong1 imp_cong refl, safe) - using path_connectedin_path_image apply fastforce - by (meson path_connectedin) + by (metis path_connectedin path_connectedin_topspace path_connected_space_def) + lemma connectedin_path_image: "pathin X g \ connectedin X (g ` ({0..1}))" by (simp add: path_connectedin_imp_connectedin path_connectedin_path_image) @@ -1926,13 +1898,15 @@ lemma linear_homeomorphism_image: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" assumes "linear f" "inj f" - obtains g where "homeomorphism (f ` S) S g f" -using linear_injective_left_inverse [OF assms] -apply clarify -apply (rule_tac g=g in that) -using assms -apply (auto simp: homeomorphism_def eq_id_iff [symmetric] image_comp comp_def linear_conv_bounded_linear linear_continuous_on) -done + obtains g where "homeomorphism (f ` S) S g f" +proof - + obtain g where "linear g" "g \ f = id" + using assms linear_injective_left_inverse by blast + then have "homeomorphism (f ` S) S g f" + using assms unfolding homeomorphism_def + by (auto simp: eq_id_iff [symmetric] image_comp linear_conv_bounded_linear linear_continuous_on) + then show thesis .. +qed lemma linear_homeomorphic_image: fixes f :: "'a::euclidean_space \ 'b::euclidean_space" @@ -1952,16 +1926,12 @@ using \y1 \ t\ \y2 \ t\ assms by (force simp: path_connected_def) have "path (\z. (x1, h z))" using \path h\ - apply (simp add: path_def) - apply (rule continuous_on_compose2 [where f = h]) - apply (rule continuous_intros | force)+ - done + unfolding path_def + by (intro continuous_intros continuous_on_compose2 [where g = "Pair _"]; force) moreover have "path (\z. (g z, y2))" using \path g\ - apply (simp add: path_def) - apply (rule continuous_on_compose2 [where f = g]) - apply (rule continuous_intros | force)+ - done + unfolding path_def + by (intro continuous_intros continuous_on_compose2 [where g = "Pair _"]; force) ultimately have 1: "path ((\z. (x1, h z)) +++ (\z. (g z, y2)))" by (metis hf gs path_join_imp pathstart_def pathfinish_def) have "path_image ((\z. (x1, h z)) +++ (\z. (g z, y2))) \ path_image (\z. (x1, h z)) \ path_image (\z. (g z, y2))" @@ -1971,11 +1941,8 @@ finally have 2: "path_image ((\z. (x1, h z)) +++ (\z. (g z, y2))) \ (\x\s. \x1\t. {(x, x1)})" . show "\g. path g \ path_image g \ (\x\s. \x1\t. {(x, x1)}) \ pathstart g = (x1, y1) \ pathfinish g = (x2, y2)" - apply (intro exI conjI) - apply (rule 1) - apply (rule 2) - apply (metis hs pathstart_def pathstart_join) - by (metis gf pathfinish_def pathfinish_join) + using 1 2 gf hs + by (metis (no_types, lifting) pathfinish_def pathfinish_join pathstart_def pathstart_join) qed lemma is_interval_path_connected_1: @@ -1995,27 +1962,37 @@ lemma path_component_disjoint: "disjnt (path_component_set S a) (path_component_set S b) \ (a \ path_component_set S b)" -apply (auto simp: disjnt_def) -using path_component_eq apply fastforce -using path_component_sym path_component_trans by blast + unfolding disjnt_iff + using path_component_sym path_component_trans by blast lemma path_component_eq_eq: "path_component S x = path_component S y \ (x \ S) \ (y \ S) \ x \ S \ y \ S \ path_component S x y" -apply (rule iffI, metis (no_types) path_component_mem(1) path_component_refl) -apply (erule disjE, metis Collect_empty_eq_bot path_component_eq_empty) -apply (rule ext) -apply (metis path_component_trans path_component_sym) -done + (is "?lhs = ?rhs") +proof + assume ?lhs then show ?rhs + by (metis (no_types) path_component_mem(1) path_component_refl) +next + assume ?rhs then show ?lhs + proof + assume "x \ S \ y \ S" then show ?lhs + by (metis Collect_empty_eq_bot path_component_eq_empty) + next + assume S: "x \ S \ y \ S \ path_component S x y" show ?lhs + by (rule ext) (metis S path_component_trans path_component_sym) + qed +qed lemma path_component_unique: assumes "x \ c" "c \ S" "path_connected c" "\c'. \x \ c'; c' \ S; path_connected c'\ \ c' \ c" shows "path_component_set S x = c" -apply (rule subset_antisym) -using assms -apply (metis mem_Collect_eq subsetCE path_component_eq_eq path_component_subset path_connected_path_component) -by (simp add: assms path_component_maximal) + (is "?lhs = ?rhs") +proof + show "?lhs \ ?rhs" + using assms + by (metis mem_Collect_eq path_component_refl path_component_subset path_connected_path_component subsetD) +qed (simp add: assms path_component_maximal) lemma path_component_intermediate_subset: "path_component_set u a \ t \ t \ u @@ -2064,9 +2041,7 @@ lemma path_component_of_refl: "path_component_of X x x \ x \ topspace X" - apply (auto simp: path_component_in_topspace) - apply (force simp: path_component_of_def pathin_const) - done + by (metis path_component_in_topspace path_component_of_def pathin_const) lemma path_component_of_sym: assumes "path_component_of X x y" @@ -2074,8 +2049,7 @@ using assms apply (clarsimp simp: path_component_of_def pathin_def) apply (rule_tac x="g \ (\t. 1 - t)" in exI) - apply (auto intro!: continuous_map_compose) - apply (force simp: continuous_map_in_subtopology continuous_on_op_minus) + apply (auto intro!: continuous_map_compose simp: continuous_map_in_subtopology continuous_on_op_minus) done lemma path_component_of_sym_iff: @@ -2159,10 +2133,14 @@ lemma path_component_of: "path_component_of X x y \ (\T. path_connectedin X T \ x \ T \ y \ T)" - apply (auto simp: path_component_of_def) - using path_connectedin_path_image apply fastforce - apply (metis path_connectedin) - done + (is "?lhs = ?rhs") +proof + assume ?lhs then show ?rhs + by (metis atLeastAtMost_iff image_eqI order_refl path_component_of_def path_connectedin_path_image zero_le_one) +next + assume ?rhs then show ?lhs + by (metis path_component_of_def path_connectedin) +qed lemma path_component_of_set: "path_component_of X x y \ (\g. pathin X g \ g 0 = x \ g 1 = y)" @@ -2215,15 +2193,20 @@ x \ topspace X \ y \ topspace X \ path_component_of X x y" by (metis Collect_empty_eq_bot path_component_of_eq_empty path_component_of_equiv) +lemma path_component_of_aux: + "path_component_of X x y + \ path_component_of (subtopology X (Collect (path_component_of X x))) x y" + by (meson path_component_of path_component_of_maximal path_connectedin_subtopology) + lemma path_connectedin_path_component_of: "path_connectedin X (Collect (path_component_of X x))" proof - - have "\y. path_component_of X x y - \ path_component_of (subtopology X (Collect (path_component_of X x))) x y" - by (meson path_component_of path_component_of_maximal path_connectedin_subtopology) + have "topspace (subtopology X (path_component_of_set X x)) = path_component_of_set X x" + by (meson path_component_of_subset_topspace topspace_subtopology_subset) + then have "path_connected_space (subtopology X (path_component_of_set X x))" + by (metis (full_types) path_component_of_aux mem_Collect_eq path_component_of_equiv path_connected_space_iff_path_component) then show ?thesis - apply (simp add: path_connectedin_def path_component_of_subset_topspace path_connected_space_iff_path_component) - by (metis Int_absorb1 mem_Collect_eq path_component_of_equiv path_component_of_subset_topspace topspace_subtopology) + by (simp add: path_component_of_subset_topspace path_connectedin_def) qed lemma path_connectedin_euclidean [simp]: @@ -2254,9 +2237,13 @@ by (metis Diff_cancel Diff_subset Union_path_components_of cSup_singleton diff_Union_pairwise_disjoint insert_subset pairwise_disjoint_path_components_of) lemma nonempty_path_components_of: - "C \ path_components_of X \ (C \ {})" - apply (clarsimp simp: path_components_of_def path_component_of_eq_empty) - by (meson path_component_of_refl) + assumes "C \ path_components_of X" shows "C \ {}" +proof - + have "C \ path_component_of_set X ` topspace X" + using assms path_components_of_def by blast + then show ?thesis + using path_component_of_refl by fastforce +qed lemma path_components_of_subset: "C \ path_components_of X \ C \ topspace X" by (auto simp: path_components_of_def path_component_of_equiv) @@ -2267,9 +2254,7 @@ lemma path_component_in_path_components_of: "Collect (path_component_of X a) \ path_components_of X \ a \ topspace X" - apply (rule iffI) - using nonempty_path_components_of path_component_of_eq_empty apply fastforce - by (simp add: path_components_of_def) + by (metis imageI nonempty_path_components_of path_component_of_eq_empty path_components_of_def) lemma path_connectedin_Union: assumes \: "\S. S \ \ \ path_connectedin X S" "\\ \ {}" @@ -2278,8 +2263,7 @@ obtain a where "\S. S \ \ \ a \ S" using assms by blast then have "\x. x \ topspace (subtopology X (\\)) \ path_component_of (subtopology X (\\)) a x" - apply (simp) - by (meson Union_upper \ path_component_of path_connectedin_subtopology) + by simp (meson Union_upper \ path_component_of path_connectedin_subtopology) then show ?thesis using \ unfolding path_connectedin_def by (metis Sup_le_iff path_component_of_equiv path_connected_space_iff_path_component) @@ -2455,10 +2439,9 @@ lemma homeomorphic_map_path_components_of: assumes "homeomorphic_map X Y f" shows "path_components_of Y = (image f) ` (path_components_of X)" + (is "?lhs = ?rhs") unfolding path_components_of_def homeomorphic_imp_surjective_map [OF assms, symmetric] - apply safe - using assms homeomorphic_map_path_component_of apply fastforce - by (metis assms homeomorphic_map_path_component_of imageI) + using assms homeomorphic_map_path_component_of by fastforce subsection \Sphere is path-connected\ @@ -2554,25 +2537,28 @@ corollary path_connected_complement_bounded_convex: - fixes s :: "'a :: euclidean_space set" - assumes "bounded s" "convex s" and 2: "2 \ DIM('a)" - shows "path_connected (- s)" -proof (cases "s = {}") + fixes S :: "'a :: euclidean_space set" + assumes "bounded S" "convex S" and 2: "2 \ DIM('a)" + shows "path_connected (- S)" +proof (cases "S = {}") case True then show ?thesis using convex_imp_path_connected by auto next case False - then obtain a where "a \ s" by auto - { fix x y assume "x \ s" "y \ s" - then have "x \ a" "y \ a" using \a \ s\ by auto - then have bxy: "bounded(insert x (insert y s))" - by (simp add: \bounded s\) + then obtain a where "a \ S" by auto + have \
[rule_format]: "\y\S. \u. 0 \ u \ u \ 1 \ (1 - u) *\<^sub>R a + u *\<^sub>R y \ S" + using \convex S\ \a \ S\ by (simp add: convex_alt) + { fix x y assume "x \ S" "y \ S" + then have "x \ a" "y \ a" using \a \ S\ by auto + then have bxy: "bounded(insert x (insert y S))" + by (simp add: \bounded S\) then obtain B::real where B: "0 < B" and Bx: "norm (a - x) < B" and By: "norm (a - y) < B" - and "s \ ball a B" + and "S \ ball a B" using bounded_subset_ballD [OF bxy, of a] by (auto simp: dist_norm) define C where "C = B / norm(x - a)" + let ?Cxa = "a + C *\<^sub>R (x - a)" { fix u - assume u: "(1 - u) *\<^sub>R x + u *\<^sub>R (a + C *\<^sub>R (x - a)) \ s" and "0 \ u" "u \ 1" + assume u: "(1 - u) *\<^sub>R x + u *\<^sub>R ?Cxa \ S" and "0 \ u" "u \ 1" have CC: "1 \ 1 + (C - 1) * u" using \x \ a\ \0 \ u\ Bx by (auto simp add: C_def norm_minus_commute) @@ -2591,22 +2577,16 @@ finally have xeq: "(1 - 1 / (1 + (C - 1) * u)) *\<^sub>R a + (1 / (1 + (C - 1) * u)) *\<^sub>R (a + (1 + (C - 1) * u) *\<^sub>R (x - a)) = x" by (simp add: algebra_simps) have False - using \convex s\ - apply (simp add: convex_alt) - apply (drule_tac x=a in bspec) - apply (rule \a \ s\) - apply (drule_tac x="a + (1 + (C - 1) * u) *\<^sub>R (x - a)" in bspec) - using u apply (simp add: *) - apply (drule_tac x="1 / (1 + (C - 1) * u)" in spec) - using \x \ a\ \x \ s\ \0 \ u\ CC - apply (auto simp: xeq) - done + using \
[of "a + (1 + (C - 1) * u) *\<^sub>R (x - a)" "1 / (1 + (C - 1) * u)"] + using u \x \ a\ \x \ S\ \0 \ u\ CC + by (auto simp: xeq *) } - then have pcx: "path_component (- s) x (a + C *\<^sub>R (x - a))" + then have pcx: "path_component (- S) x ?Cxa" by (force simp: closed_segment_def intro!: path_component_linepath) define D where "D = B / norm(y - a)" \ \massive duplication with the proof above\ + let ?Dya = "a + D *\<^sub>R (y - a)" { fix u - assume u: "(1 - u) *\<^sub>R y + u *\<^sub>R (a + D *\<^sub>R (y - a)) \ s" and "0 \ u" "u \ 1" + assume u: "(1 - u) *\<^sub>R y + u *\<^sub>R ?Dya \ S" and "0 \ u" "u \ 1" have DD: "1 \ 1 + (D - 1) * u" using \y \ a\ \0 \ u\ By by (auto simp add: D_def norm_minus_commute) @@ -2625,27 +2605,22 @@ finally have xeq: "(1 - 1 / (1 + (D - 1) * u)) *\<^sub>R a + (1 / (1 + (D - 1) * u)) *\<^sub>R (a + (1 + (D - 1) * u) *\<^sub>R (y - a)) = y" by (simp add: algebra_simps) have False - using \convex s\ - apply (simp add: convex_alt) - apply (drule_tac x=a in bspec) - apply (rule \a \ s\) - apply (drule_tac x="a + (1 + (D - 1) * u) *\<^sub>R (y - a)" in bspec) - using u apply (simp add: *) - apply (drule_tac x="1 / (1 + (D - 1) * u)" in spec) - using \y \ a\ \y \ s\ \0 \ u\ DD - apply (auto simp: xeq) - done + using \
[of "a + (1 + (D - 1) * u) *\<^sub>R (y - a)" "1 / (1 + (D - 1) * u)"] + using u \y \ a\ \y \ S\ \0 \ u\ DD + by (auto simp: xeq *) } - then have pdy: "path_component (- s) y (a + D *\<^sub>R (y - a))" + then have pdy: "path_component (- S) y ?Dya" by (force simp: closed_segment_def intro!: path_component_linepath) - have pyx: "path_component (- s) (a + D *\<^sub>R (y - a)) (a + C *\<^sub>R (x - a))" - apply (rule path_component_of_subset [of "sphere a B"]) - using \s \ ball a B\ - apply (force simp: ball_def dist_norm norm_minus_commute) - apply (rule path_connected_sphere [OF 2, of a B, simplified path_connected_component, rule_format]) - using \x \ a\ using \y \ a\ B apply (auto simp: dist_norm C_def D_def) - done - have "path_component (- s) x y" + have pyx: "path_component (- S) ?Dya ?Cxa" + proof (rule path_component_of_subset) + show "sphere a B \ - S" + using \S \ ball a B\ by (force simp: ball_def dist_norm norm_minus_commute) + have aB: "?Dya \ sphere a B" "?Cxa \ sphere a B" + using \x \ a\ using \y \ a\ B by (auto simp: dist_norm C_def D_def) + then show "path_component (sphere a B) ?Dya ?Cxa" + using path_connected_sphere [OF 2] path_connected_component by blast + qed + have "path_component (- S) x y" by (metis path_component_trans path_component_sym pcx pdy pyx) } then show ?thesis @@ -2653,19 +2628,19 @@ qed lemma connected_complement_bounded_convex: - fixes s :: "'a :: euclidean_space set" - assumes "bounded s" "convex s" "2 \ DIM('a)" - shows "connected (- s)" + fixes S :: "'a :: euclidean_space set" + assumes "bounded S" "convex S" "2 \ DIM('a)" + shows "connected (- S)" using path_connected_complement_bounded_convex [OF assms] path_connected_imp_connected by blast lemma connected_diff_ball: - fixes s :: "'a :: euclidean_space set" - assumes "connected s" "cball a r \ s" "2 \ DIM('a)" - shows "connected (s - ball a r)" - apply (rule connected_diff_open_from_closed [OF ball_subset_cball]) - using assms connected_sphere - apply (auto simp: cball_diff_eq_sphere dist_norm) - done + fixes S :: "'a :: euclidean_space set" + assumes "connected S" "cball a r \ S" "2 \ DIM('a)" + shows "connected (S - ball a r)" +proof (rule connected_diff_open_from_closed [OF ball_subset_cball]) + show "connected (cball a r - ball a r)" + using assms connected_sphere by (auto simp: cball_diff_eq_sphere) +qed (auto simp: assms dist_norm) proposition connected_open_delete: assumes "open S" "connected S" and 2: "2 \ DIM('N::euclidean_space)" @@ -2674,21 +2649,18 @@ case True with \open S\ obtain \ where "\ > 0" and \: "cball a \ \ S" using open_contains_cball_eq by blast - have "dist a (a + \ *\<^sub>R (SOME i. i \ Basis)) = \" - by (simp add: dist_norm SOME_Basis \0 < \\ less_imp_le) - with \ have "\{S - ball a r |r. 0 < r \ r < \} \ {} \ False" - apply (drule_tac c="a + scaleR (\) ((SOME i. i \ Basis))" in subsetD) + define b where "b \ a + \ *\<^sub>R (SOME i. i \ Basis)" + have "dist a b = \" + by (simp add: b_def dist_norm SOME_Basis \0 < \\ less_imp_le) + with \ have "b \ \{S - ball a r |r. 0 < r \ r < \}" by auto then have nonemp: "(\{S - ball a r |r. 0 < r \ r < \}) = {} \ False" by auto have con: "\r. r < \ \ connected (S - ball a r)" using \ by (force intro: connected_diff_ball [OF \connected S\ _ 2]) have "x \ \{S - ball a r |r. 0 < r \ r < \}" if "x \ S - {a}" for x - apply (rule UnionI [of "S - ball a (min \ (dist a x) / 2)"]) - using that \0 < \\ apply simp_all - apply (rule_tac x="min \ (dist a x) / 2" in exI) - apply auto - done + using that \0 < \\ + by (intro UnionI [of "S - ball a (min \ (dist a x) / 2)"]) auto then have "S - {a} = \{S - ball a r | r. 0 < r \ r < \}" by auto then show ?thesis @@ -2700,16 +2672,16 @@ corollary path_connected_open_delete: assumes "open S" "connected S" and 2: "2 \ DIM('N::euclidean_space)" - shows "path_connected(S - {a::'N})" -by (simp add: assms connected_open_delete connected_open_path_connected open_delete) + shows "path_connected(S - {a::'N})" + by (simp add: assms connected_open_delete connected_open_path_connected open_delete) corollary path_connected_punctured_ball: - "2 \ DIM('N::euclidean_space) \ path_connected(ball a r - {a::'N})" -by (simp add: path_connected_open_delete) + "2 \ DIM('N::euclidean_space) \ path_connected(ball a r - {a::'N})" + by (simp add: path_connected_open_delete) corollary connected_punctured_ball: - "2 \ DIM('N::euclidean_space) \ connected(ball a r - {a::'N})" -by (simp add: connected_open_delete) + "2 \ DIM('N::euclidean_space) \ connected(ball a r - {a::'N})" + by (simp add: connected_open_delete) corollary connected_open_delete_finite: fixes S T::"'a::euclidean_space set" @@ -2745,9 +2717,7 @@ with b have "\x \ b\ = norm x" using norm_Basis by (simp add: b) with xb show ?thesis - apply (simp add: abs_if split: if_split_asm) - apply (metis add.inverse_inverse real_vector.scale_minus_left xb) - done + by (metis (mono_tags, hide_lams) abs_eq_iff abs_norm_cancel) qed with \r > 0\ b show "sphere 0 r = {r *\<^sub>R b, - r *\<^sub>R b}" by (force simp: sphere_def dist_norm) @@ -2787,14 +2757,14 @@ have "{x. dist a x \ r \ x \ S} \ {x. r \ dist a x \ x \ S} \ {}" using \b \ S\ \dist a b = r\ by blast moreover have "connected {x. dist a x \ r \ x \ S}" - apply (rule connected_intermediate_closure [of "ball a r"]) - using assms by auto + using assms + by (force intro: connected_intermediate_closure [of "ball a r"]) moreover have "connected {x. r \ dist a x \ x \ S}" - apply (rule connected_intermediate_closure [of "- cball a r"]) - using assms apply (auto intro: connected_complement_bounded_convex) - apply (metis ComplI interior_cball interior_closure mem_ball not_less) - done + proof (rule connected_intermediate_closure [of "- cball a r"]) + show "{x. r \ dist a x \ x \ S} \ closure (- cball a r)" + using interior_closure by (force intro: connected_complement_bounded_convex) + qed (use assms connected_complement_bounded_convex in auto) ultimately show ?thesis by (simp add: CS connected_Un) qed @@ -2818,8 +2788,7 @@ case True with that show ?thesis apply (simp add: image_iff) - apply (rule_tac x=0 in exI, simp) - using vector_choose_size zero_le_one by blast + by (metis (no_types) mem_sphere_0 order_refl vector_choose_size zero_le_one) next case False with that show ?thesis @@ -2832,9 +2801,7 @@ moreover have "path_connected ?D" by (metis path_connected_Times [OF pc] path_connected_sphere 2) ultimately show ?thesis - apply (subst *) - apply (rule path_connected_continuous_image, auto) - done + by (simp add: "*" path_connected_continuous_image) qed ultimately show ?thesis using path_connected_translation by metis @@ -2931,11 +2898,9 @@ fix S assume "S \ A" obtain T where "T \ B" "S \ T" "S \ \(B - {T}) = {}" - apply (rule connected_disjoint_Union_open_pick [OF B, of A]) - using SA SB \S \ A\ by auto + using SA SB \S \ A\ connected_disjoint_Union_open_pick [OF B, of A] eq order_refl by blast moreover obtain S' where "S' \ A" "T \ S'" "T \ \(A - {S'}) = {}" - apply (rule connected_disjoint_Union_open_pick [OF A, of B]) - using SA SB \T \ B\ by auto + using SA SB \T \ B\ connected_disjoint_Union_open_pick [OF A, of B] eq order_refl by blast ultimately have "S' = S" by (metis A Int_subset_iff SA \S \ A\ disjnt_def inf.orderE pairwise_def) with \T \ S'\ have "T \ S" by simp @@ -2983,15 +2948,13 @@ proof (clarsimp simp: bounded_def dist_norm) fix e x show "\y. B \ i \ y \ \ norm (x - y) \ e" - apply (rule_tac x="x + (max B e + 1 + \i \ x\) *\<^sub>R i" in exI) - using i by (auto simp: inner_right_distrib) + using i + by (rule_tac x="x + (max B e + 1 + \i \ x\) *\<^sub>R i" in exI) (auto simp: inner_right_distrib) qed have \
: "\x. B \ i \ x \ x \ S" using * Basis_le_norm [OF i] by (metis abs_ge_self inner_commute order_trans) have "{x. B \ i \ x} \ connected_component_set S (B *\<^sub>R i)" - apply (rule connected_component_maximal) - apply (auto simp: i intro: convex_connected convex_halfspace_ge [of B] \
) - done + by (intro connected_component_maximal) (auto simp: i intro: convex_connected convex_halfspace_ge [of B] \
) then have "\ bounded (connected_component_set S (B *\<^sub>R i))" using bounded_subset unbounded_inner by blast moreover have "B *\<^sub>R i \ S" @@ -3026,9 +2989,11 @@ using assms by (auto intro: connected_complement_bounded_convex) qed (use x' y' dist_norm * in auto) show ?thesis - apply (rule connected_component_eq) - using x' y' x'y' - by (metis (no_types, lifting) connected_component_eq_empty connected_component_eq_eq connected_component_idemp connected_component_in) + proof (rule connected_component_eq) + show "x \ connected_component_set S y" + using x' y' x'y' + by (metis (no_types) connected_component_eq_eq connected_component_in mem_Collect_eq) + qed qed lemma cobounded_unbounded_components: @@ -3169,9 +3134,7 @@ apply (clarsimp simp add: connected_iff_connected_component outside) apply (rule_tac S="connected_component_set (- S) x" in connected_component_of_subset) apply (metis (no_types) assms cobounded_unbounded_component cobounded_unique_unbounded_component connected_component_eq_eq connected_component_idemp double_complement mem_Collect_eq) - apply clarify - apply (metis connected_component_eq_eq connected_component_in) - done + by (simp add: Collect_mono connected_component_eq) lemma outside_connected_component_lt: "outside S = {x. \B. \y. B < norm(y) \ connected_component (- S) x y}" @@ -3180,8 +3143,7 @@ by (metis less_diff_eq norm_minus_commute norm_triangle_ineq2 order.trans pinf(6)) lemma outside_connected_component_le: - "outside S = - {x. \B. \y. B \ norm(y) \ connected_component (- S) x y}" + "outside S = {x. \B. \y. B \ norm(y) \ connected_component (- S) x y}" apply (simp add: outside_connected_component_lt Set.set_eq_iff) by (meson gt_ex leD le_less_linear less_imp_le order.trans) @@ -3195,8 +3157,8 @@ { fix y::'a and z::'a assume yz: "B < norm z" "B < norm y" have "connected_component (- cball 0 B) y z" - apply (intro connected_componentI [OF _ subset_refl] connected_complement_bounded_convex) - using assms yz by (auto simp: dist_norm) + using assms yz + by (force simp: dist_norm intro: connected_componentI [OF _ subset_refl] connected_complement_bounded_convex) then have "connected_component (- S) y z" by (metis connected_component_of_subset Bno Compl_anti_mono mem_cball_0 subset_iff) } note cyz = this @@ -3255,9 +3217,8 @@ if "0 < e" "ball y e \ interior S" "dist y z < e" for e z proof - have "ball y e \ connected_component_set S y" - apply (rule connected_component_maximal) - using that interior_subset mem_ball apply auto - done + using connected_component_maximal that interior_subset + by (metis centre_in_ball connected_ball subset_trans) then show ?thesis using y1 apply (simp add: closure_approachable open_contains_ball_eq [OF open_interior]) by (metis connected_component_eq dist_commute mem_Collect_eq mem_ball mem_interior subsetD \0 < e\ y2) @@ -3282,7 +3243,8 @@ by (metis Diff_iff Sup_upper closure_subset contra_subsetD dist_self frontier_def interior_mono) next case False - have 1: "closed_segment x y \ T \ {}" using \y \ T\ by blast + have 1: "closed_segment x y \ T \ {}" + using \y \ T\ by blast have 2: "closed_segment x y - T \ {}" using False by blast obtain c where "c \ closed_segment x y" "c \ frontier T" @@ -3367,18 +3329,21 @@ by (auto simp: components_eq_sing_iff) lemma interior_inside_frontier: - fixes s :: "'a::real_normed_vector set" - assumes "bounded s" - shows "interior s \ inside (frontier s)" + fixes S :: "'a::real_normed_vector set" + assumes "bounded S" + shows "interior S \ inside (frontier S)" proof - { fix x y - assume x: "x \ interior s" and y: "y \ s" - and cc: "connected_component (- frontier s) x y" - have "connected_component_set (- frontier s) x \ frontier s \ {}" - apply (rule connected_Int_frontier; simp add: set_eq_iff) - apply (meson cc connected_component_in connected_component_refl_eq interior_subset subsetD x) - using y cc by blast - then have "bounded (connected_component_set (- frontier s) x)" + assume x: "x \ interior S" and y: "y \ S" + and cc: "connected_component (- frontier S) x y" + have "connected_component_set (- frontier S) x \ frontier S \ {}" + proof (rule connected_Int_frontier; simp add: set_eq_iff) + show "\u. connected_component (- frontier S) x u \ u \ S" + by (meson cc connected_component_in connected_component_refl_eq interior_subset subsetD x) + show "\u. connected_component (- frontier S) x u \ u \ S" + using y cc by blast + qed + then have "bounded (connected_component_set (- frontier S) x)" using connected_component_in by auto } then show ?thesis @@ -3435,11 +3400,10 @@ by (simp add: * field_split_simps) } note contra = this have "connected_component (- S) z (z + C *\<^sub>R (z-a))" - apply (rule connected_componentI [OF connected_segment [of z "z + C *\<^sub>R (z-a)"]]) - apply (simp add: closed_segment_def) - using contra - apply auto - done + proof (rule connected_componentI [OF connected_segment]) + show "closed_segment z (z + C *\<^sub>R (z - a)) \ - S" + using contra by (force simp add: closed_segment_def) + qed auto then have False using zna B [of "z + C *\<^sub>R (z-a)"] C by (auto simp: field_split_simps max_mult_distrib_right) @@ -3553,9 +3517,8 @@ have "open (connected_component_set (- S) x)" using assms open_connected_component by blast then obtain e where e: "e>0" and e: "\y. dist y x < e \ connected_component (- S) x y" - using dist_not_less_zero - apply (simp add: open_dist) - by (metis Int_iff outside_def connected_component_refl_eq x) + using dist_not_less_zero x + by (auto simp add: open_dist outside_def intro: connected_component_refl) then have "\e>0. ball x e \ outside S" by (metis e dist_commute outside_same_component mem_ball subsetI x) } @@ -3590,20 +3553,18 @@ fixes S :: "'a::real_normed_vector set" assumes "closed S" shows "closure(outside S) \ S \ outside S" - apply (rule closure_minimal, simp) - by (metis assms closed_open inside_outside open_inside) + by (metis assms closed_open closure_minimal inside_outside open_inside sup_ge2) lemma frontier_outside_subset: - fixes S :: "'a::real_normed_vector set" - assumes "closed S" - shows "frontier(outside S) \ S" - apply (simp add: frontier_def open_outside interior_open) - by (metis Diff_subset_conv assms closure_outside_subset interior_eq open_outside sup.commute) + fixes S :: "'a::real_normed_vector set" + assumes "closed S" + shows "frontier(outside S) \ S" + unfolding frontier_def + by (metis Diff_subset_conv assms closure_outside_subset interior_eq open_outside sup_aci(1)) lemma inside_complement_unbounded_connected_empty: "\connected (- S); \ bounded (- S)\ \ inside S = {}" - apply (simp add: inside_def) - by (meson Compl_iff bounded_subset connected_component_maximal order_refl) + using inside_subset by blast lemma inside_bounded_complement_connected_empty: fixes S :: "'a::{real_normed_vector, perfect_space} set" @@ -3619,17 +3580,16 @@ assume x: "x \ T" "x \ S" and bo: "bounded (connected_component_set (- S) x)" show "bounded (connected_component_set (- T) x)" proof (cases "S \ connected_component_set (- T) x = {}") - case True show ?thesis - apply (rule bounded_subset [OF bo]) - apply (rule connected_component_maximal) - using x True apply auto - done + case True then show ?thesis + by (metis bounded_subset [OF bo] compl_le_compl_iff connected_component_idemp connected_component_mono disjoint_eq_subset_Compl double_compl) next - case False then show ?thesis - using assms [unfolded inside_def] x - apply (simp add: disjoint_iff_not_equal, clarify) - apply (drule subsetD, assumption, auto) - by (metis (no_types, hide_lams) ComplI connected_component_eq_eq) + case False + then obtain y where y: "y \ S" "y \ connected_component_set (- T) x" + by (meson disjoint_iff) + then have "bounded (connected_component_set (- T) y)" + using assms [unfolded inside_def] by blast + with y show ?thesis + by (metis connected_component_eq) qed qed @@ -3677,15 +3637,9 @@ then have "d \ -S" using \ using dist_commute by (metis contra_subsetD mem_cball not_le not_less_iff_gr_or_eq) have pimg_sbs_cos: "path_image \ \ -S" - using pimg_sbs apply (auto simp: path_image_def) - apply (drule subsetD) - using \c \ - S\ \S \ T\ interior_subset apply (auto simp: c_def) - done + using \c \ - S\ \S \ T\ c_def interior_subset pimg_sbs by fastforce have "closed_segment c d \ cball c \" - apply (simp add: segment_convex_hull) - apply (rule hull_minimal) - using \\ > 0\ d apply (auto simp: dist_commute) - done + by (metis \0 < \\ centre_in_cball closed_segment_subset convex_cball d dist_commute less_eq_real_def mem_cball) with \ have "closed_segment c d \ -S" by blast moreover have con_gcd: "connected (path_image \ \ closed_segment c d)" by (rule connected_Un) (auto simp: c_def \path \\ connected_path_image) @@ -3717,9 +3671,10 @@ using connected_convex_1_gen assms False inside_convex by blast next case 2 - have coms: "compact S" - using assms apply (simp add: S compact_eq_bounded_closed) - by (meson bounded_inside bounded_subset compact_imp_bounded) + have "bounded S" + using assms by (meson bounded_inside bounded_subset compact_imp_bounded) + then have coms: "compact S" + by (simp add: S compact_eq_bounded_closed) then have bst: "bounded (S \ T)" by (simp add: compact_imp_bounded T) then obtain r where "0 < r" and r: "S \ T \ ball 0 r" @@ -3727,11 +3682,9 @@ have outst: "outside S \ outside T \ {}" proof - have "- ball 0 r \ outside S" - apply (rule outside_subset_convex) - using r by auto + by (meson convex_ball le_supE outside_subset_convex r) moreover have "- ball 0 r \ outside T" - apply (rule outside_subset_convex) - using r by auto + by (meson convex_ball le_supE outside_subset_convex r) ultimately show ?thesis by (metis Compl_subset_Compl_iff Int_subset_iff bounded_ball inf.orderE outside_bounded_nonempty outside_no_overlap) qed @@ -3756,31 +3709,32 @@ next case False then obtain b where b: "b \ S" "b \ inside S" by blast - have *: "\y T. y \ S \ connected T \ a \ T \ y \ T \ T \ (S \ inside S)" if "a \ (S \ inside S)" for a - using that proof + have *: "\y T. y \ S \ connected T \ a \ T \ y \ T \ T \ (S \ inside S)" + if "a \ S \ inside S" for a + using that + proof assume "a \ S" then show ?thesis - apply (rule_tac x=a in exI) - apply (rule_tac x="{a}" in exI, simp) - done + by (rule_tac x=a in exI, rule_tac x="{a}" in exI, simp) next assume a: "a \ inside S" + then have ain: "a \ closure (inside S)" + by (simp add: closure_def) show ?thesis apply (rule exists_path_subpath_to_frontier [OF path_linepath [of a b], of "inside S"]) - using a apply (simp add: closure_def) - apply (simp add: b) - apply (rule_tac x="pathfinish h" in exI) - apply (rule_tac x="path_image h" in exI) - apply (simp add: pathfinish_in_path_image connected_path_image, auto) - using frontier_inside_subset S apply fastforce - by (metis (no_types, lifting) frontier_inside_subset insertE insert_Diff interior_eq open_inside pathfinish_in_path_image S subsetCE) + apply (simp_all add: ain b) + subgoal for h + apply (rule_tac x="pathfinish h" in exI) + apply (simp add: subsetD [OF frontier_inside_subset[OF S]]) + apply (rule_tac x="path_image h" in exI) + apply (simp add: pathfinish_in_path_image connected_path_image, auto) + by (metis Diff_single_insert S frontier_inside_subset insert_iff interior_subset subsetD) + done qed show ?thesis apply (simp add: connected_iff_connected_component) - apply (simp add: connected_component_def) - apply (clarify dest!: *) - apply (rename_tac u u' T t') - apply (rule_tac x="(S \ T \ t')" in exI) - apply (auto intro!: connected_Un cons) + apply (clarsimp simp add: connected_component_def dest!: *) + subgoal for x y u u' T t' + by (rule_tac x="(S \ T \ t')" in exI) (auto intro!: connected_Un cons) done qed @@ -3797,28 +3751,27 @@ have *: "\y T. y \ S \ connected T \ a \ T \ y \ T \ T \ (S \ outside S)" if "a \ (S \ outside S)" for a using that proof assume "a \ S" then show ?thesis - apply (rule_tac x=a in exI) - apply (rule_tac x="{a}" in exI, simp) - done + by (rule_tac x=a in exI, rule_tac x="{a}" in exI, simp) next assume a: "a \ outside S" + then have ain: "a \ closure (outside S)" + by (simp add: closure_def) show ?thesis apply (rule exists_path_subpath_to_frontier [OF path_linepath [of a b], of "outside S"]) - using a apply (simp add: closure_def) - apply (simp add: b) + apply (simp_all add: ain b) + subgoal for h apply (rule_tac x="pathfinish h" in exI) + apply (simp add: subsetD [OF frontier_outside_subset[OF S]]) apply (rule_tac x="path_image h" in exI) apply (simp add: pathfinish_in_path_image connected_path_image, auto) - using frontier_outside_subset S apply fastforce - by (metis (no_types, lifting) frontier_outside_subset insertE insert_Diff interior_eq open_outside pathfinish_in_path_image S subsetCE) + by (metis (no_types, lifting) frontier_outside_subset insertE insert_Diff interior_eq open_outside pathfinish_in_path_image S subsetCE) + done qed show ?thesis apply (simp add: connected_iff_connected_component) - apply (simp add: connected_component_def) - apply (clarify dest!: *) - apply (rename_tac u u' T t') - apply (rule_tac x="(S \ T \ t')" in exI) - apply (auto simp: intro!: connected_Un cons) + apply (clarsimp simp add: connected_component_def dest!: *) + subgoal for x y u u' T t' + by (rule_tac x="(S \ T \ t')" in exI) (auto intro!: connected_Un cons) done qed @@ -3830,26 +3783,34 @@ inside_complement_unbounded_connected_empty unbounded_outside union_with_outside) lemma inside_in_components: - "inside S \ components (- S) \ connected(inside S) \ inside S \ {}" - apply (simp add: in_components_maximal) - apply (auto intro: inside_same_component connected_componentI) - apply (metis IntI empty_iff inside_no_overlap) - done - -text\The proof is virtually the same as that above.\ + "inside S \ components (- S) \ connected(inside S) \ inside S \ {}" (is "?lhs = ?rhs") +proof + assume R: ?rhs + then have "\x. \x \ S; x \ inside S\ \ \ connected (inside S)" + by (simp add: inside_outside) + with R show ?lhs + unfolding in_components_maximal + by (auto intro: inside_same_component connected_componentI) +qed (simp add: in_components_maximal) + +text\The proof is like that above.\ lemma outside_in_components: - "outside S \ components (- S) \ connected(outside S) \ outside S \ {}" - apply (simp add: in_components_maximal) - apply (auto intro: outside_same_component connected_componentI) - apply (metis IntI empty_iff outside_no_overlap) - done + "outside S \ components (- S) \ connected(outside S) \ outside S \ {}" (is "?lhs = ?rhs") +proof + assume R: ?rhs + then have "\x. \x \ S; x \ outside S\ \ \ connected (outside S)" + by (meson disjoint_iff outside_no_overlap) + with R show ?lhs + unfolding in_components_maximal + by (auto intro: outside_same_component connected_componentI) +qed (simp add: in_components_maximal) lemma bounded_unique_outside: - fixes S :: "'a :: euclidean_space set" - shows "\bounded S; DIM('a) \ 2\ \ (c \ components (- S) \ \ bounded c \ c = outside S)" - apply (rule iffI) - apply (metis cobounded_unique_unbounded_components connected_outside double_compl outside_bounded_nonempty outside_in_components unbounded_outside) - by (simp add: connected_outside outside_bounded_nonempty outside_in_components unbounded_outside) + fixes S :: "'a :: euclidean_space set" + assumes "bounded S" "DIM('a) \ 2" + shows "(c \ components (- S) \ \ bounded c \ c = outside S)" + using assms + by (metis cobounded_unique_unbounded_components connected_outside double_compl outside_bounded_nonempty outside_in_components unbounded_outside) subsection\Condition for an open map's image to contain a ball\ @@ -3865,22 +3826,20 @@ case True then show ?thesis by simp next case False - obtain w where w: "w \ frontier (f ` S)" - and dw_le: "\y. y \ frontier (f ` S) \ norm (f a - w) \ norm (f a - y)" - apply (rule distance_attains_inf [of "frontier(f ` S)" "f a"]) - using \a \ S\ by (auto simp: frontier_eq_empty dist_norm False) - then obtain \ where \: "\n. \ n \ f ` S" and tendsw: "\ \ w" - by (metis Diff_iff frontier_def closure_sequential) + then have "closed (frontier (f ` S))" "frontier (f ` S) \ {}" + using \a \ S\ by (auto simp: frontier_eq_empty) + then obtain w where w: "w \ frontier (f ` S)" + and dw_le: "\y. y \ frontier (f ` S) \ norm (f a - w) \ norm (f a - y)" + by (auto simp add: dist_norm intro: distance_attains_inf [of "frontier(f ` S)" "f a"]) + then obtain \ where \: "\n. \ n \ f ` S" and tendsw: "\ \ w" + by (metis Diff_iff frontier_def closure_sequential) then have "\n. \x \ S. \ n = f x" by force then obtain z where zs: "\n. z n \ S" and fz: "\n. \ n = f (z n)" by metis then obtain y K where y: "y \ closure S" and "strict_mono (K :: nat \ nat)" and Klim: "(z \ K) \ y" using \bounded S\ - apply (simp add: compact_closure [symmetric] compact_def) - apply (drule_tac x=z in spec) - using closure_subset apply force - done + unfolding compact_closure [symmetric] compact_def by (meson closure_subset subset_iff) then have ftendsw: "((\n. f (z n)) \ K) \ w" by (metis LIMSEQ_subseq_LIMSEQ fun.map_cong0 fz tendsw) have zKs: "\n. (z \ K) n \ S" by (simp add: zs) @@ -3901,11 +3860,9 @@ have \
: "\y. \norm (f a - y) < r; y \ frontier (f ` S)\ \ False" by (metis dw_le norm_minus_commute not_less order_trans rle wy) show ?thesis - apply (rule **) (*such a horrible mess*) - apply (rule connected_Int_frontier [where t = "f`S", OF connected_ball]) - using \a \ S\ \0 < r\ - apply (auto simp: disjoint_iff_not_equal dist_norm dest: \
) - done + apply (rule ** [OF connected_Int_frontier [where t = "f`S", OF connected_ball]]) + (*such a horrible mess*) + using \a \ S\ \0 < r\ by (auto simp: disjoint_iff_not_equal dist_norm dest: \
) qed