| author | wenzelm | 
| Thu, 12 Oct 2017 21:22:02 +0200 | |
| changeset 66852 | d20a668b394e | 
| parent 65064 | a4abec71279a | 
| child 66884 | c2128ab11f61 | 
| permissions | -rw-r--r-- | 
| 64846 | 1 | (* Title: HOL/Analysis/Jordan_Curve.thy | 
| 2 | Authors: LC Paulson, based on material from HOL Light | |
| 3 | *) | |
| 4 | ||
| 5 | section \<open>The Jordan Curve Theorem and Applications\<close> | |
| 6 | ||
| 7 | theory Jordan_Curve | |
| 8 | imports Arcwise_Connected Further_Topology | |
| 9 | ||
| 10 | begin | |
| 11 | ||
| 12 | subsection\<open>Janiszewski's theorem.\<close> | |
| 13 | ||
| 14 | lemma Janiszewski_weak: | |
| 15 | fixes a b::complex | |
| 16 | assumes "compact S" "compact T" and conST: "connected(S \<inter> T)" | |
| 17 | and ccS: "connected_component (- S) a b" and ccT: "connected_component (- T) a b" | |
| 18 | shows "connected_component (- (S \<union> T)) a b" | |
| 19 | proof - | |
| 20 | have [simp]: "a \<notin> S" "a \<notin> T" "b \<notin> S" "b \<notin> T" | |
| 21 | by (meson ComplD ccS ccT connected_component_in)+ | |
| 22 | have clo: "closedin (subtopology euclidean (S \<union> T)) S" "closedin (subtopology euclidean (S \<union> T)) T" | |
| 23 | by (simp_all add: assms closed_subset compact_imp_closed) | |
| 24 | obtain g where contg: "continuous_on S g" | |
| 25 | and g: "\<And>x. x \<in> S \<Longrightarrow> exp (\<i>* of_real (g x)) = (x - a) /\<^sub>R cmod (x - a) / ((x - b) /\<^sub>R cmod (x - b))" | |
| 26 | using ccS \<open>compact S\<close> | |
| 27 | apply (simp add: Borsuk_maps_homotopic_in_connected_component_eq [symmetric]) | |
| 28 | apply (subst (asm) homotopic_circlemaps_divide) | |
| 29 | apply (auto simp: inessential_eq_continuous_logarithm_circle) | |
| 30 | done | |
| 31 | obtain h where conth: "continuous_on T h" | |
| 32 | and h: "\<And>x. x \<in> T \<Longrightarrow> exp (\<i>* of_real (h x)) = (x - a) /\<^sub>R cmod (x - a) / ((x - b) /\<^sub>R cmod (x - b))" | |
| 33 | using ccT \<open>compact T\<close> | |
| 34 | apply (simp add: Borsuk_maps_homotopic_in_connected_component_eq [symmetric]) | |
| 35 | apply (subst (asm) homotopic_circlemaps_divide) | |
| 36 | apply (auto simp: inessential_eq_continuous_logarithm_circle) | |
| 37 | done | |
| 38 | have "continuous_on (S \<union> T) (\<lambda>x. (x - a) /\<^sub>R cmod (x - a))" "continuous_on (S \<union> T) (\<lambda>x. (x - b) /\<^sub>R cmod (x - b))" | |
| 39 | by (intro continuous_intros; force)+ | |
| 40 | moreover have "(\<lambda>x. (x - a) /\<^sub>R cmod (x - a)) ` (S \<union> T) \<subseteq> sphere 0 1" "(\<lambda>x. (x - b) /\<^sub>R cmod (x - b)) ` (S \<union> T) \<subseteq> sphere 0 1" | |
| 41 | by (auto simp: divide_simps) | |
| 42 | moreover have "\<exists>g. continuous_on (S \<union> T) g \<and> | |
| 43 | (\<forall>x\<in>S \<union> T. (x - a) /\<^sub>R cmod (x - a) / ((x - b) /\<^sub>R cmod (x - b)) = exp (\<i>*complex_of_real (g x)))" | |
| 44 |   proof (cases "S \<inter> T = {}")
 | |
| 45 | case True | |
| 46 | have "continuous_on (S \<union> T) (\<lambda>x. if x \<in> S then g x else h x)" | |
| 47 | apply (rule continuous_on_cases_local [OF clo contg conth]) | |
| 48 | using True by auto | |
| 49 | then show ?thesis | |
| 50 | by (rule_tac x="(\<lambda>x. if x \<in> S then g x else h x)" in exI) (auto simp: g h) | |
| 51 | next | |
| 52 | case False | |
| 53 | have diffpi: "\<exists>n. g x = h x + 2* of_int n*pi" if "x \<in> S \<inter> T" for x | |
| 54 | proof - | |
| 55 | have "exp (\<i>* of_real (g x)) = exp (\<i>* of_real (h x))" | |
| 56 | using that by (simp add: g h) | |
| 57 | then obtain n where "complex_of_real (g x) = complex_of_real (h x) + 2* of_int n*complex_of_real pi" | |
| 58 | apply (auto simp: exp_eq) | |
| 59 | by (metis complex_i_not_zero distrib_left mult.commute mult_cancel_left) | |
| 60 | then show ?thesis | |
| 61 | apply (rule_tac x=n in exI) | |
| 62 | using of_real_eq_iff by fastforce | |
| 63 | qed | |
| 64 | have contgh: "continuous_on (S \<inter> T) (\<lambda>x. g x - h x)" | |
| 65 | by (intro continuous_intros continuous_on_subset [OF contg] continuous_on_subset [OF conth]) auto | |
| 66 | moreover have disc: | |
| 67 | "\<exists>e>0. \<forall>y. y \<in> S \<inter> T \<and> g y - h y \<noteq> g x - h x \<longrightarrow> e \<le> norm ((g y - h y) - (g x - h x))" | |
| 68 | if "x \<in> S \<inter> T" for x | |
| 69 | proof - | |
| 70 | obtain nx where nx: "g x = h x + 2* of_int nx*pi" | |
| 71 | using \<open>x \<in> S \<inter> T\<close> diffpi by blast | |
| 72 | have "2*pi \<le> norm (g y - h y - (g x - h x))" if y: "y \<in> S \<inter> T" and neq: "g y - h y \<noteq> g x - h x" for y | |
| 73 | proof - | |
| 74 | obtain ny where ny: "g y = h y + 2* of_int ny*pi" | |
| 75 | using \<open>y \<in> S \<inter> T\<close> diffpi by blast | |
| 76 |         { assume "nx \<noteq> ny"
 | |
| 77 | then have "1 \<le> \<bar>real_of_int ny - real_of_int nx\<bar>" | |
| 78 | by linarith | |
| 79 | then have "(2*pi)*1 \<le> (2*pi)*\<bar>real_of_int ny - real_of_int nx\<bar>" | |
| 80 | by simp | |
| 81 | also have "... = \<bar>2*real_of_int ny*pi - 2*real_of_int nx*pi\<bar>" | |
| 82 | by (simp add: algebra_simps abs_if) | |
| 83 | finally have "2*pi \<le> \<bar>2*real_of_int ny*pi - 2*real_of_int nx*pi\<bar>" by simp | |
| 84 | } | |
| 85 | with neq show ?thesis | |
| 86 | by (simp add: nx ny) | |
| 87 | qed | |
| 88 | then show ?thesis | |
| 89 | by (rule_tac x="2*pi" in exI) auto | |
| 90 | qed | |
| 91 | ultimately obtain z where z: "\<And>x. x \<in> S \<inter> T \<Longrightarrow> g x - h x = z" | |
| 92 | using continuous_discrete_range_constant [OF conST contgh] by blast | |
| 65064 
a4abec71279a
Renamed ii to imaginary_unit in order to free up ii as a variable name.  Also replaced some legacy def commands
 paulson <lp15@cam.ac.uk> parents: 
64846diff
changeset | 93 | obtain w where "exp(\<i> * of_real(h w)) = exp (\<i> * of_real(z + h w))" | 
| 64846 | 94 | using disc z False | 
| 95 | by auto (metis diff_add_cancel g h of_real_add) | |
| 96 | then have [simp]: "exp (\<i>* of_real z) = 1" | |
| 97 | by (metis cis_conv_exp cis_mult exp_not_eq_zero mult_cancel_right1) | |
| 98 | show ?thesis | |
| 99 | proof (intro exI conjI) | |
| 100 | show "continuous_on (S \<union> T) (\<lambda>x. if x \<in> S then g x else z + h x)" | |
| 101 | apply (intro continuous_intros continuous_on_cases_local [OF clo contg] conth) | |
| 102 | using z by fastforce | |
| 103 | qed (auto simp: g h algebra_simps exp_add) | |
| 104 | qed | |
| 105 | ultimately have *: "homotopic_with (\<lambda>x. True) (S \<union> T) (sphere 0 1) | |
| 106 | (\<lambda>x. (x - a) /\<^sub>R cmod (x - a)) (\<lambda>x. (x - b) /\<^sub>R cmod (x - b))" | |
| 107 | by (subst homotopic_circlemaps_divide) (auto simp: inessential_eq_continuous_logarithm_circle) | |
| 108 | show ?thesis | |
| 109 | apply (rule Borsuk_maps_homotopic_in_connected_component_eq [THEN iffD1]) | |
| 110 | using assms by (auto simp: *) | |
| 111 | qed | |
| 112 | ||
| 113 | ||
| 114 | theorem Janiszewski: | |
| 115 | fixes a b::complex | |
| 116 | assumes "compact S" "closed T" and conST: "connected(S \<inter> T)" | |
| 117 | and ccS: "connected_component (- S) a b" and ccT: "connected_component (- T) a b" | |
| 118 | shows "connected_component (- (S \<union> T)) a b" | |
| 119 | proof - | |
| 120 | have "path_component(- T) a b" | |
| 121 | by (simp add: \<open>closed T\<close> ccT open_Compl open_path_connected_component) | |
| 122 | then obtain g where g: "path g" "path_image g \<subseteq> - T" "pathstart g = a" "pathfinish g = b" | |
| 123 | by (auto simp: path_component_def) | |
| 124 |   obtain C where C: "compact C" "connected C" "a \<in> C" "b \<in> C" "C \<inter> T = {}"
 | |
| 125 | proof | |
| 126 | show "compact (path_image g)" | |
| 127 | by (simp add: \<open>path g\<close> compact_path_image) | |
| 128 | show "connected (path_image g)" | |
| 129 | by (simp add: \<open>path g\<close> connected_path_image) | |
| 130 | qed (use g in auto) | |
| 131 | obtain r where "0 < r" and r: "C \<union> S \<subseteq> ball 0 r" | |
| 132 | by (metis \<open>compact C\<close> \<open>compact S\<close> bounded_Un compact_imp_bounded bounded_subset_ballD) | |
| 133 | have "connected_component (- (S \<union> (T \<inter> cball 0 r \<union> sphere 0 r))) a b" | |
| 134 | proof (rule Janiszewski_weak [OF \<open>compact S\<close>]) | |
| 135 | show comT': "compact ((T \<inter> cball 0 r) \<union> sphere 0 r)" | |
| 136 | by (simp add: \<open>closed T\<close> closed_Int_compact compact_Un) | |
| 137 | have "S \<inter> (T \<inter> cball 0 r \<union> sphere 0 r) = S \<inter> T" | |
| 138 | using r by auto | |
| 139 | with conST show "connected (S \<inter> (T \<inter> cball 0 r \<union> sphere 0 r))" | |
| 140 | by simp | |
| 141 | show "connected_component (- (T \<inter> cball 0 r \<union> sphere 0 r)) a b" | |
| 142 | using conST C r | |
| 143 | apply (simp add: connected_component_def) | |
| 144 | apply (rule_tac x=C in exI) | |
| 145 | by auto | |
| 146 | qed (simp add: ccS) | |
| 147 | then obtain U where U: "connected U" "U \<subseteq> - S" "U \<subseteq> - T \<union> - cball 0 r" "U \<subseteq> - sphere 0 r" "a \<in> U" "b \<in> U" | |
| 148 | by (auto simp: connected_component_def) | |
| 149 | show ?thesis | |
| 150 | unfolding connected_component_def | |
| 151 | proof (intro exI conjI) | |
| 152 | show "U \<subseteq> - (S \<union> T)" | |
| 153 | using U r \<open>0 < r\<close> \<open>a \<in> C\<close> connected_Int_frontier [of U "cball 0 r"] | |
| 154 | apply simp | |
| 155 | by (metis ball_subset_cball compl_inf disjoint_eq_subset_Compl disjoint_iff_not_equal inf.orderE inf_sup_aci(3) subsetCE) | |
| 156 | qed (auto simp: U) | |
| 157 | qed | |
| 158 | ||
| 159 | lemma Janiszewski_connected: | |
| 160 | fixes S :: "complex set" | |
| 161 | assumes ST: "compact S" "closed T" "connected(S \<inter> T)" | |
| 162 | and notST: "connected (- S)" "connected (- T)" | |
| 163 | shows "connected(- (S \<union> T))" | |
| 164 | using Janiszewski [OF ST] | |
| 165 | by (metis IntD1 IntD2 notST compl_sup connected_iff_connected_component) | |
| 166 | ||
| 167 | subsection\<open>The Jordan Curve theorem\<close> | |
| 168 | ||
| 169 | lemma exists_double_arc: | |
| 170 | fixes g :: "real \<Rightarrow> 'a::real_normed_vector" | |
| 171 | assumes "simple_path g" "pathfinish g = pathstart g" "a \<in> path_image g" "b \<in> path_image g" "a \<noteq> b" | |
| 172 | obtains u d where "arc u" "arc d" "pathstart u = a" "pathfinish u = b" | |
| 173 | "pathstart d = b" "pathfinish d = a" | |
| 174 |                     "(path_image u) \<inter> (path_image d) = {a,b}"
 | |
| 175 | "(path_image u) \<union> (path_image d) = path_image g" | |
| 176 | proof - | |
| 177 | obtain u where u: "0 \<le> u" "u \<le> 1" "g u = a" | |
| 178 | using assms by (auto simp: path_image_def) | |
| 179 | define h where "h \<equiv> shiftpath u g" | |
| 180 | have "simple_path h" | |
| 181 | using \<open>simple_path g\<close> simple_path_shiftpath \<open>0 \<le> u\<close> \<open>u \<le> 1\<close> assms(2) h_def by blast | |
| 182 | have "pathstart h = g u" | |
| 183 | by (simp add: \<open>u \<le> 1\<close> h_def pathstart_shiftpath) | |
| 184 | have "pathfinish h = g u" | |
| 185 | by (simp add: \<open>0 \<le> u\<close> assms h_def pathfinish_shiftpath) | |
| 186 | have pihg: "path_image h = path_image g" | |
| 187 | by (simp add: \<open>0 \<le> u\<close> \<open>u \<le> 1\<close> assms h_def path_image_shiftpath) | |
| 188 | then obtain v where v: "0 \<le> v" "v \<le> 1" "h v = b" | |
| 189 | using assms by (metis (mono_tags, lifting) atLeastAtMost_iff imageE path_image_def) | |
| 190 | show ?thesis | |
| 191 | proof | |
| 192 | show "arc (subpath 0 v h)" | |
| 193 | by (metis (no_types) \<open>pathstart h = g u\<close> \<open>simple_path h\<close> arc_simple_path_subpath \<open>a \<noteq> b\<close> atLeastAtMost_iff zero_le_one order_refl pathstart_def u(3) v) | |
| 194 | show "arc (subpath v 1 h)" | |
| 195 | by (metis (no_types) \<open>pathfinish h = g u\<close> \<open>simple_path h\<close> arc_simple_path_subpath \<open>a \<noteq> b\<close> atLeastAtMost_iff zero_le_one order_refl pathfinish_def u(3) v) | |
| 196 | show "pathstart (subpath 0 v h) = a" | |
| 197 | by (metis \<open>pathstart h = g u\<close> pathstart_def pathstart_subpath u(3)) | |
| 198 | show "pathfinish (subpath 0 v h) = b" "pathstart (subpath v 1 h) = b" | |
| 199 | by (simp_all add: v(3)) | |
| 200 | show "pathfinish (subpath v 1 h) = a" | |
| 201 | by (metis \<open>pathfinish h = g u\<close> pathfinish_def pathfinish_subpath u(3)) | |
| 202 |     show "path_image (subpath 0 v h) \<inter> path_image (subpath v 1 h) = {a, b}"
 | |
| 203 | proof | |
| 204 |       show "path_image (subpath 0 v h) \<inter> path_image (subpath v 1 h) \<subseteq> {a, b}"
 | |
| 205 | using v \<open>pathfinish (subpath v 1 h) = a\<close> \<open>simple_path h\<close> | |
| 206 | apply (auto simp: simple_path_def path_image_subpath image_iff Ball_def) | |
| 207 | by (metis (full_types) less_eq_real_def less_irrefl less_le_trans) | |
| 208 |       show "{a, b} \<subseteq> path_image (subpath 0 v h) \<inter> path_image (subpath v 1 h)"
 | |
| 209 | using v \<open>pathstart (subpath 0 v h) = a\<close> \<open>pathfinish (subpath v 1 h) = a\<close> | |
| 210 | apply (auto simp: path_image_subpath image_iff) | |
| 211 | by (metis atLeastAtMost_iff order_refl) | |
| 212 | qed | |
| 213 | show "path_image (subpath 0 v h) \<union> path_image (subpath v 1 h) = path_image g" | |
| 214 | using v apply (simp add: path_image_subpath pihg [symmetric]) | |
| 215 | using path_image_def by fastforce | |
| 216 | qed | |
| 217 | qed | |
| 218 | ||
| 219 | ||
| 220 | theorem Jordan_curve: | |
| 221 | fixes c :: "real \<Rightarrow> complex" | |
| 222 | assumes "simple_path c" and loop: "pathfinish c = pathstart c" | |
| 223 | obtains inner outer where | |
| 224 |                 "inner \<noteq> {}" "open inner" "connected inner"
 | |
| 225 |                 "outer \<noteq> {}" "open outer" "connected outer"
 | |
| 226 |                 "bounded inner" "\<not> bounded outer" "inner \<inter> outer = {}"
 | |
| 227 | "inner \<union> outer = - path_image c" | |
| 228 | "frontier inner = path_image c" | |
| 229 | "frontier outer = path_image c" | |
| 230 | proof - | |
| 231 | have "path c" | |
| 232 | by (simp add: assms simple_path_imp_path) | |
| 233 | have hom: "(path_image c) homeomorphic (sphere(0::complex) 1)" | |
| 234 | by (simp add: assms homeomorphic_simple_path_image_circle) | |
| 235 | with Jordan_Brouwer_separation have "\<not> connected (- (path_image c))" | |
| 236 | by fastforce | |
| 237 | then obtain inner where inner: "inner \<in> components (- path_image c)" and "bounded inner" | |
| 238 | using cobounded_has_bounded_component [of "- (path_image c)"] | |
| 239 | using \<open>\<not> connected (- path_image c)\<close> \<open>simple_path c\<close> bounded_simple_path_image by force | |
| 240 | obtain outer where outer: "outer \<in> components (- path_image c)" and "\<not> bounded outer" | |
| 241 | using cobounded_unbounded_components [of "- (path_image c)"] | |
| 242 | using \<open>path c\<close> bounded_path_image by auto | |
| 243 | show ?thesis | |
| 244 | proof | |
| 245 |     show "inner \<noteq> {}"
 | |
| 246 | using inner in_components_nonempty by auto | |
| 247 | show "open inner" | |
| 248 | by (meson \<open>simple_path c\<close> compact_imp_closed compact_simple_path_image inner open_Compl open_components) | |
| 249 | show "connected inner" | |
| 250 | using in_components_connected inner by blast | |
| 251 |     show "outer \<noteq> {}"
 | |
| 252 | using outer in_components_nonempty by auto | |
| 253 | show "open outer" | |
| 254 | by (meson \<open>simple_path c\<close> compact_imp_closed compact_simple_path_image outer open_Compl open_components) | |
| 255 | show "connected outer" | |
| 256 | using in_components_connected outer by blast | |
| 257 |     show "inner \<inter> outer = {}"
 | |
| 258 | by (meson \<open>\<not> bounded outer\<close> \<open>bounded inner\<close> \<open>connected outer\<close> bounded_subset components_maximal in_components_subset inner outer) | |
| 259 | show fro_inner: "frontier inner = path_image c" | |
| 260 | by (simp add: Jordan_Brouwer_frontier [OF hom inner]) | |
| 261 | show fro_outer: "frontier outer = path_image c" | |
| 262 | by (simp add: Jordan_Brouwer_frontier [OF hom outer]) | |
| 263 | have False if m: "middle \<in> components (- path_image c)" and "middle \<noteq> inner" "middle \<noteq> outer" for middle | |
| 264 | proof - | |
| 265 | have "frontier middle = path_image c" | |
| 266 | by (simp add: Jordan_Brouwer_frontier [OF hom] that) | |
| 267 |       have middle: "open middle" "connected middle" "middle \<noteq> {}"
 | |
| 268 | apply (meson \<open>simple_path c\<close> compact_imp_closed compact_simple_path_image m open_Compl open_components) | |
| 269 | using in_components_connected in_components_nonempty m by blast+ | |
| 270 | obtain a0 b0 where "a0 \<in> path_image c" "b0 \<in> path_image c" "a0 \<noteq> b0" | |
| 271 | using simple_path_image_uncountable [OF \<open>simple_path c\<close>] | |
| 272 | by (metis Diff_cancel countable_Diff_eq countable_empty insert_iff subsetI subset_singleton_iff) | |
| 273 | obtain a b g where ab: "a \<in> path_image c" "b \<in> path_image c" "a \<noteq> b" | |
| 274 | and "arc g" "pathstart g = a" "pathfinish g = b" | |
| 275 |                      and pag_sub: "path_image g - {a,b} \<subseteq> middle"
 | |
| 276 | proof (rule dense_accessible_frontier_point_pairs [OF \<open>open middle\<close> \<open>connected middle\<close>, of "path_image c \<inter> ball a0 (dist a0 b0)" "path_image c \<inter> ball b0 (dist a0 b0)"]) | |
| 277 | show "openin (subtopology euclidean (frontier middle)) (path_image c \<inter> ball a0 (dist a0 b0))" | |
| 278 | "openin (subtopology euclidean (frontier middle)) (path_image c \<inter> ball b0 (dist a0 b0))" | |
| 279 | by (simp_all add: \<open>frontier middle = path_image c\<close> openin_open_Int) | |
| 280 | show "path_image c \<inter> ball a0 (dist a0 b0) \<noteq> path_image c \<inter> ball b0 (dist a0 b0)" | |
| 281 | using \<open>a0 \<noteq> b0\<close> \<open>b0 \<in> path_image c\<close> by auto | |
| 282 |         show "path_image c \<inter> ball a0 (dist a0 b0) \<noteq> {}"
 | |
| 283 | using \<open>a0 \<in> path_image c\<close> \<open>a0 \<noteq> b0\<close> by auto | |
| 284 |         show "path_image c \<inter> ball b0 (dist a0 b0) \<noteq> {}"
 | |
| 285 | using \<open>b0 \<in> path_image c\<close> \<open>a0 \<noteq> b0\<close> by auto | |
| 286 | qed (use arc_distinct_ends arc_imp_simple_path simple_path_endless that in fastforce) | |
| 287 | obtain u d where "arc u" "arc d" | |
| 288 | and "pathstart u = a" "pathfinish u = b" "pathstart d = b" "pathfinish d = a" | |
| 289 |                    and ud_ab: "(path_image u) \<inter> (path_image d) = {a,b}"
 | |
| 290 | and ud_Un: "(path_image u) \<union> (path_image d) = path_image c" | |
| 291 | using exists_double_arc [OF assms ab] by blast | |
| 292 | obtain x y where "x \<in> inner" "y \<in> outer" | |
| 293 |         using \<open>inner \<noteq> {}\<close> \<open>outer \<noteq> {}\<close> by auto
 | |
| 294 |       have "inner \<inter> middle = {}" "middle \<inter> outer = {}"
 | |
| 295 | using components_nonoverlap inner outer m that by blast+ | |
| 296 | have "connected_component (- (path_image u \<union> path_image g \<union> (path_image d \<union> path_image g))) x y" | |
| 297 | proof (rule Janiszewski) | |
| 298 | show "compact (path_image u \<union> path_image g)" | |
| 299 | by (simp add: \<open>arc g\<close> \<open>arc u\<close> compact_Un compact_arc_image) | |
| 300 | show "closed (path_image d \<union> path_image g)" | |
| 301 | by (simp add: \<open>arc d\<close> \<open>arc g\<close> closed_Un closed_arc_image) | |
| 302 | show "connected ((path_image u \<union> path_image g) \<inter> (path_image d \<union> path_image g))" | |
| 303 |           by (metis Un_Diff_cancel \<open>arc g\<close> \<open>path_image u \<inter> path_image d = {a, b}\<close> \<open>pathfinish g = b\<close> \<open>pathstart g = a\<close> connected_arc_image insert_Diff1 pathfinish_in_path_image pathstart_in_path_image sup_bot.right_neutral sup_commute sup_inf_distrib1)
 | |
| 304 | show "connected_component (- (path_image u \<union> path_image g)) x y" | |
| 305 | unfolding connected_component_def | |
| 306 | proof (intro exI conjI) | |
| 307 | have "connected ((inner \<union> (path_image c - path_image u)) \<union> (outer \<union> (path_image c - path_image u)))" | |
| 308 | proof (rule connected_Un) | |
| 309 | show "connected (inner \<union> (path_image c - path_image u))" | |
| 310 | apply (rule connected_intermediate_closure [OF \<open>connected inner\<close>]) | |
| 311 | using fro_inner [symmetric] apply (auto simp: closure_subset frontier_def) | |
| 312 | done | |
| 313 | show "connected (outer \<union> (path_image c - path_image u))" | |
| 314 | apply (rule connected_intermediate_closure [OF \<open>connected outer\<close>]) | |
| 315 | using fro_outer [symmetric] apply (auto simp: closure_subset frontier_def) | |
| 316 | done | |
| 317 |             have "(inner \<inter> outer) \<union> (path_image c - path_image u) \<noteq> {}"
 | |
| 318 |               by (metis \<open>arc d\<close>  ud_ab Diff_Int Diff_cancel Un_Diff \<open>inner \<inter> outer = {}\<close> \<open>pathfinish d = a\<close> \<open>pathstart d = b\<close> arc_simple_path insert_commute nonempty_simple_path_endless sup_bot_left ud_Un)
 | |
| 319 |             then show "(inner \<union> (path_image c - path_image u)) \<inter> (outer \<union> (path_image c - path_image u)) \<noteq> {}"
 | |
| 320 | by auto | |
| 321 | qed | |
| 322 | then show "connected (inner \<union> outer \<union> (path_image c - path_image u))" | |
| 323 | by (metis sup.right_idem sup_assoc sup_commute) | |
| 324 | have "inner \<subseteq> - path_image u" "outer \<subseteq> - path_image u" | |
| 325 | using in_components_subset inner outer ud_Un by auto | |
| 326 | moreover have "inner \<subseteq> - path_image g" "outer \<subseteq> - path_image g" | |
| 327 |             using \<open>inner \<inter> middle = {}\<close> \<open>inner \<subseteq> - path_image u\<close>
 | |
| 328 |             using \<open>middle \<inter> outer = {}\<close> \<open>outer \<subseteq> - path_image u\<close> pag_sub ud_ab by fastforce+
 | |
| 329 | moreover have "path_image c - path_image u \<subseteq> - path_image g" | |
| 330 | using in_components_subset m pag_sub ud_ab by fastforce | |
| 331 | ultimately show "inner \<union> outer \<union> (path_image c - path_image u) \<subseteq> - (path_image u \<union> path_image g)" | |
| 332 | by force | |
| 333 | show "x \<in> inner \<union> outer \<union> (path_image c - path_image u)" | |
| 334 | by (auto simp: \<open>x \<in> inner\<close>) | |
| 335 | show "y \<in> inner \<union> outer \<union> (path_image c - path_image u)" | |
| 336 | by (auto simp: \<open>y \<in> outer\<close>) | |
| 337 | qed | |
| 338 | show "connected_component (- (path_image d \<union> path_image g)) x y" | |
| 339 | unfolding connected_component_def | |
| 340 | proof (intro exI conjI) | |
| 341 | have "connected ((inner \<union> (path_image c - path_image d)) \<union> (outer \<union> (path_image c - path_image d)))" | |
| 342 | proof (rule connected_Un) | |
| 343 | show "connected (inner \<union> (path_image c - path_image d))" | |
| 344 | apply (rule connected_intermediate_closure [OF \<open>connected inner\<close>]) | |
| 345 | using fro_inner [symmetric] apply (auto simp: closure_subset frontier_def) | |
| 346 | done | |
| 347 | show "connected (outer \<union> (path_image c - path_image d))" | |
| 348 | apply (rule connected_intermediate_closure [OF \<open>connected outer\<close>]) | |
| 349 | using fro_outer [symmetric] apply (auto simp: closure_subset frontier_def) | |
| 350 | done | |
| 351 |             have "(inner \<inter> outer) \<union> (path_image c - path_image d) \<noteq> {}"
 | |
| 352 | using \<open>arc u\<close> \<open>pathfinish u = b\<close> \<open>pathstart u = a\<close> arc_imp_simple_path nonempty_simple_path_endless ud_Un ud_ab by fastforce | |
| 353 |             then show "(inner \<union> (path_image c - path_image d)) \<inter> (outer \<union> (path_image c - path_image d)) \<noteq> {}"
 | |
| 354 | by auto | |
| 355 | qed | |
| 356 | then show "connected (inner \<union> outer \<union> (path_image c - path_image d))" | |
| 357 | by (metis sup.right_idem sup_assoc sup_commute) | |
| 358 | have "inner \<subseteq> - path_image d" "outer \<subseteq> - path_image d" | |
| 359 | using in_components_subset inner outer ud_Un by auto | |
| 360 | moreover have "inner \<subseteq> - path_image g" "outer \<subseteq> - path_image g" | |
| 361 |             using \<open>inner \<inter> middle = {}\<close> \<open>inner \<subseteq> - path_image d\<close>
 | |
| 362 |             using \<open>middle \<inter> outer = {}\<close> \<open>outer \<subseteq> - path_image d\<close> pag_sub ud_ab by fastforce+
 | |
| 363 | moreover have "path_image c - path_image d \<subseteq> - path_image g" | |
| 364 | using in_components_subset m pag_sub ud_ab by fastforce | |
| 365 | ultimately show "inner \<union> outer \<union> (path_image c - path_image d) \<subseteq> - (path_image d \<union> path_image g)" | |
| 366 | by force | |
| 367 | show "x \<in> inner \<union> outer \<union> (path_image c - path_image d)" | |
| 368 | by (auto simp: \<open>x \<in> inner\<close>) | |
| 369 | show "y \<in> inner \<union> outer \<union> (path_image c - path_image d)" | |
| 370 | by (auto simp: \<open>y \<in> outer\<close>) | |
| 371 | qed | |
| 372 | qed | |
| 373 | then have "connected_component (- (path_image u \<union> path_image d \<union> path_image g)) x y" | |
| 374 | by (simp add: Un_ac) | |
| 375 | moreover have "~(connected_component (- (path_image c)) x y)" | |
| 376 | by (metis (no_types, lifting) \<open>\<not> bounded outer\<close> \<open>bounded inner\<close> \<open>x \<in> inner\<close> \<open>y \<in> outer\<close> componentsE connected_component_eq inner mem_Collect_eq outer) | |
| 377 | ultimately show False | |
| 378 | by (auto simp: ud_Un [symmetric] connected_component_def) | |
| 379 | qed | |
| 380 |     then have "components (- path_image c) = {inner,outer}"
 | |
| 381 | using inner outer by blast | |
| 382 | then have "Union (components (- path_image c)) = inner \<union> outer" | |
| 383 | by simp | |
| 384 | then show "inner \<union> outer = - path_image c" | |
| 385 | by auto | |
| 386 | qed (auto simp: \<open>bounded inner\<close> \<open>\<not> bounded outer\<close>) | |
| 387 | qed | |
| 388 | ||
| 389 | ||
| 390 | corollary Jordan_disconnected: | |
| 391 | fixes c :: "real \<Rightarrow> complex" | |
| 392 | assumes "simple_path c" "pathfinish c = pathstart c" | |
| 393 | shows "\<not> connected(- path_image c)" | |
| 394 | using Jordan_curve [OF assms] | |
| 395 | by (metis Jordan_Brouwer_separation assms homeomorphic_simple_path_image_circle zero_less_one) | |
| 396 | ||
| 397 | ||
| 398 | corollary Jordan_inside_outside: | |
| 399 | fixes c :: "real \<Rightarrow> complex" | |
| 400 | assumes "simple_path c" "pathfinish c = pathstart c" | |
| 401 |     shows "inside(path_image c) \<noteq> {} \<and>
 | |
| 402 | open(inside(path_image c)) \<and> | |
| 403 | connected(inside(path_image c)) \<and> | |
| 404 |           outside(path_image c) \<noteq> {} \<and>
 | |
| 405 | open(outside(path_image c)) \<and> | |
| 406 | connected(outside(path_image c)) \<and> | |
| 407 | bounded(inside(path_image c)) \<and> | |
| 408 | \<not> bounded(outside(path_image c)) \<and> | |
| 409 |           inside(path_image c) \<inter> outside(path_image c) = {} \<and>
 | |
| 410 | inside(path_image c) \<union> outside(path_image c) = | |
| 411 | - path_image c \<and> | |
| 412 | frontier(inside(path_image c)) = path_image c \<and> | |
| 413 | frontier(outside(path_image c)) = path_image c" | |
| 414 | proof - | |
| 415 | obtain inner outer | |
| 416 |     where *: "inner \<noteq> {}" "open inner" "connected inner"
 | |
| 417 |              "outer \<noteq> {}" "open outer" "connected outer"
 | |
| 418 |              "bounded inner" "\<not> bounded outer" "inner \<inter> outer = {}"
 | |
| 419 | "inner \<union> outer = - path_image c" | |
| 420 | "frontier inner = path_image c" | |
| 421 | "frontier outer = path_image c" | |
| 422 | using Jordan_curve [OF assms] by blast | |
| 423 | then have inner: "inside(path_image c) = inner" | |
| 424 | by (metis dual_order.antisym inside_subset interior_eq interior_inside_frontier) | |
| 425 | have outer: "outside(path_image c) = outer" | |
| 426 | using \<open>inner \<union> outer = - path_image c\<close> \<open>inside (path_image c) = inner\<close> | |
| 427 |           outside_inside \<open>inner \<inter> outer = {}\<close> by auto
 | |
| 428 | show ?thesis | |
| 429 | using * by (auto simp: inner outer) | |
| 430 | qed | |
| 431 | ||
| 432 | subsubsection\<open>Triple-curve or "theta-curve" theorem\<close> | |
| 433 | ||
| 434 | text\<open>Proof that there is no fourth component taken from | |
| 435 | Kuratowski's Topology vol 2, para 61, II.\<close> | |
| 436 | ||
| 437 | theorem split_inside_simple_closed_curve: | |
| 438 | fixes c :: "real \<Rightarrow> complex" | |
| 439 | assumes "simple_path c1" and c1: "pathstart c1 = a" "pathfinish c1 = b" | |
| 440 | and "simple_path c2" and c2: "pathstart c2 = a" "pathfinish c2 = b" | |
| 441 | and "simple_path c" and c: "pathstart c = a" "pathfinish c = b" | |
| 442 | and "a \<noteq> b" | |
| 443 |       and c1c2: "path_image c1 \<inter> path_image c2 = {a,b}"
 | |
| 444 |       and c1c: "path_image c1 \<inter> path_image c = {a,b}"
 | |
| 445 |       and c2c: "path_image c2 \<inter> path_image c = {a,b}"
 | |
| 446 |       and ne_12: "path_image c \<inter> inside(path_image c1 \<union> path_image c2) \<noteq> {}"
 | |
| 447 |   obtains "inside(path_image c1 \<union> path_image c) \<inter> inside(path_image c2 \<union> path_image c) = {}"
 | |
| 448 | "inside(path_image c1 \<union> path_image c) \<union> inside(path_image c2 \<union> path_image c) \<union> | |
| 449 |            (path_image c - {a,b}) = inside(path_image c1 \<union> path_image c2)"
 | |
| 450 | proof - | |
| 451 | let ?\<Theta> = "path_image c" let ?\<Theta>1 = "path_image c1" let ?\<Theta>2 = "path_image c2" | |
| 452 | have sp: "simple_path (c1 +++ reversepath c2)" "simple_path (c1 +++ reversepath c)" "simple_path (c2 +++ reversepath c)" | |
| 453 | using assms by (auto simp: simple_path_join_loop_eq arc_simple_path simple_path_reversepath) | |
| 454 | then have op_in12: "open (inside (?\<Theta>1 \<union> ?\<Theta>2))" | |
| 455 | and op_out12: "open (outside (?\<Theta>1 \<union> ?\<Theta>2))" | |
| 456 | and op_in1c: "open (inside (?\<Theta>1 \<union> ?\<Theta>))" | |
| 457 | and op_in2c: "open (inside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 458 | and op_out1c: "open (outside (?\<Theta>1 \<union> ?\<Theta>))" | |
| 459 | and op_out2c: "open (outside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 460 | and co_in1c: "connected (inside (?\<Theta>1 \<union> ?\<Theta>))" | |
| 461 | and co_in2c: "connected (inside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 462 | and co_out12c: "connected (outside (?\<Theta>1 \<union> ?\<Theta>2))" | |
| 463 | and co_out1c: "connected (outside (?\<Theta>1 \<union> ?\<Theta>))" | |
| 464 | and co_out2c: "connected (outside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 465 |      and pa_c: "?\<Theta> - {pathstart c, pathfinish c} \<subseteq> - ?\<Theta>1"
 | |
| 466 |                "?\<Theta> - {pathstart c, pathfinish c} \<subseteq> - ?\<Theta>2"
 | |
| 467 |      and pa_c1: "?\<Theta>1 - {pathstart c1, pathfinish c1} \<subseteq> - ?\<Theta>2"
 | |
| 468 |                 "?\<Theta>1 - {pathstart c1, pathfinish c1} \<subseteq> - ?\<Theta>"
 | |
| 469 |      and pa_c2: "?\<Theta>2 - {pathstart c2, pathfinish c2} \<subseteq> - ?\<Theta>1"
 | |
| 470 |                 "?\<Theta>2 - {pathstart c2, pathfinish c2} \<subseteq> - ?\<Theta>"
 | |
| 471 |      and co_c: "connected(?\<Theta> - {pathstart c,pathfinish c})"
 | |
| 472 |      and co_c1: "connected(?\<Theta>1 - {pathstart c1,pathfinish c1})"
 | |
| 473 |      and co_c2: "connected(?\<Theta>2 - {pathstart c2,pathfinish c2})"
 | |
| 474 | and fr_in: "frontier(inside(?\<Theta>1 \<union> ?\<Theta>2)) = ?\<Theta>1 \<union> ?\<Theta>2" | |
| 475 | "frontier(inside(?\<Theta>2 \<union> ?\<Theta>)) = ?\<Theta>2 \<union> ?\<Theta>" | |
| 476 | "frontier(inside(?\<Theta>1 \<union> ?\<Theta>)) = ?\<Theta>1 \<union> ?\<Theta>" | |
| 477 | and fr_out: "frontier(outside(?\<Theta>1 \<union> ?\<Theta>2)) = ?\<Theta>1 \<union> ?\<Theta>2" | |
| 478 | "frontier(outside(?\<Theta>2 \<union> ?\<Theta>)) = ?\<Theta>2 \<union> ?\<Theta>" | |
| 479 | "frontier(outside(?\<Theta>1 \<union> ?\<Theta>)) = ?\<Theta>1 \<union> ?\<Theta>" | |
| 480 | using Jordan_inside_outside [of "c1 +++ reversepath c2"] | |
| 481 | using Jordan_inside_outside [of "c1 +++ reversepath c"] | |
| 482 | using Jordan_inside_outside [of "c2 +++ reversepath c"] assms | |
| 483 | apply (simp_all add: path_image_join closed_Un closed_simple_path_image open_inside open_outside) | |
| 484 | apply (blast elim: | metis connected_simple_path_endless)+ | |
| 485 | done | |
| 486 |   have inout_12: "inside (?\<Theta>1 \<union> ?\<Theta>2) \<inter> (?\<Theta> - {pathstart c, pathfinish c}) \<noteq> {}"
 | |
| 487 | by (metis (no_types, lifting) c c1c ne_12 Diff_Int_distrib Diff_empty Int_empty_right Int_left_commute inf_sup_absorb inf_sup_aci(1) inside_no_overlap) | |
| 488 |   have pi_disjoint:  "?\<Theta> \<inter> outside(?\<Theta>1 \<union> ?\<Theta>2) = {}"
 | |
| 489 | proof (rule ccontr) | |
| 490 |     assume "?\<Theta> \<inter> outside (?\<Theta>1 \<union> ?\<Theta>2) \<noteq> {}"
 | |
| 491 | then show False | |
| 492 | using connectedD [OF co_c, of "inside(?\<Theta>1 \<union> ?\<Theta>2)" "outside(?\<Theta>1 \<union> ?\<Theta>2)"] | |
| 493 | using c c1c2 pa_c op_in12 op_out12 inout_12 | |
| 494 | apply auto | |
| 495 | apply (metis Un_Diff_cancel2 Un_iff compl_sup disjoint_insert(1) inf_commute inf_compl_bot_left2 inside_Un_outside mk_disjoint_insert sup_inf_absorb) | |
| 496 | done | |
| 497 | qed | |
| 498 | have out_sub12: "outside(?\<Theta>1 \<union> ?\<Theta>2) \<subseteq> outside(?\<Theta>1 \<union> ?\<Theta>)" "outside(?\<Theta>1 \<union> ?\<Theta>2) \<subseteq> outside(?\<Theta>2 \<union> ?\<Theta>)" | |
| 499 | by (metis Un_commute pi_disjoint outside_Un_outside_Un)+ | |
| 500 |   have pa1_disj_in2: "?\<Theta>1 \<inter> inside (?\<Theta>2 \<union> ?\<Theta>) = {}"
 | |
| 501 | proof (rule ccontr) | |
| 502 |     assume ne: "?\<Theta>1 \<inter> inside (?\<Theta>2 \<union> ?\<Theta>) \<noteq> {}"
 | |
| 503 |     have 1: "inside (?\<Theta> \<union> ?\<Theta>2) \<inter> ?\<Theta> = {}"
 | |
| 504 | by (metis (no_types) Diff_Int_distrib Diff_cancel inf_sup_absorb inf_sup_aci(3) inside_no_overlap) | |
| 505 |     have 2: "outside (?\<Theta> \<union> ?\<Theta>2) \<inter> ?\<Theta> = {}"
 | |
| 506 | by (metis (no_types) Int_empty_right Int_left_commute inf_sup_absorb outside_no_overlap) | |
| 507 | have "outside (?\<Theta>2 \<union> ?\<Theta>) \<subseteq> outside (?\<Theta>1 \<union> ?\<Theta>2)" | |
| 508 | apply (subst Un_commute, rule outside_Un_outside_Un) | |
| 509 | using connectedD [OF co_c1, of "inside(?\<Theta>2 \<union> ?\<Theta>)" "outside(?\<Theta>2 \<union> ?\<Theta>)"] | |
| 510 | pa_c1 op_in2c op_out2c ne c1 c2c 1 2 by (auto simp: inf_sup_aci) | |
| 511 | with out_sub12 | |
| 512 | have "outside(?\<Theta>1 \<union> ?\<Theta>2) = outside(?\<Theta>2 \<union> ?\<Theta>)" by blast | |
| 513 | then have "frontier(outside(?\<Theta>1 \<union> ?\<Theta>2)) = frontier(outside(?\<Theta>2 \<union> ?\<Theta>))" | |
| 514 | by simp | |
| 515 | then show False | |
| 516 | using inout_12 pi_disjoint c c1c c2c fr_out by auto | |
| 517 | qed | |
| 518 |   have pa2_disj_in1: "?\<Theta>2 \<inter> inside(?\<Theta>1 \<union> ?\<Theta>) = {}"
 | |
| 519 | proof (rule ccontr) | |
| 520 |     assume ne: "?\<Theta>2 \<inter> inside (?\<Theta>1 \<union> ?\<Theta>) \<noteq> {}"
 | |
| 521 |     have 1: "inside (?\<Theta> \<union> ?\<Theta>1) \<inter> ?\<Theta> = {}"
 | |
| 522 | by (metis (no_types) Diff_Int_distrib Diff_cancel inf_sup_absorb inf_sup_aci(3) inside_no_overlap) | |
| 523 |     have 2: "outside (?\<Theta> \<union> ?\<Theta>1) \<inter> ?\<Theta> = {}"
 | |
| 524 | by (metis (no_types) Int_empty_right Int_left_commute inf_sup_absorb outside_no_overlap) | |
| 525 | have "outside (?\<Theta>1 \<union> ?\<Theta>) \<subseteq> outside (?\<Theta>1 \<union> ?\<Theta>2)" | |
| 526 | apply (rule outside_Un_outside_Un) | |
| 527 | using connectedD [OF co_c2, of "inside(?\<Theta>1 \<union> ?\<Theta>)" "outside(?\<Theta>1 \<union> ?\<Theta>)"] | |
| 528 | pa_c2 op_in1c op_out1c ne c2 c1c 1 2 by (auto simp: inf_sup_aci) | |
| 529 | with out_sub12 | |
| 530 | have "outside(?\<Theta>1 \<union> ?\<Theta>2) = outside(?\<Theta>1 \<union> ?\<Theta>)" | |
| 531 | by blast | |
| 532 | then have "frontier(outside(?\<Theta>1 \<union> ?\<Theta>2)) = frontier(outside(?\<Theta>1 \<union> ?\<Theta>))" | |
| 533 | by simp | |
| 534 | then show False | |
| 535 | using inout_12 pi_disjoint c c1c c2c fr_out by auto | |
| 536 | qed | |
| 537 | have in_sub_in1: "inside(?\<Theta>1 \<union> ?\<Theta>) \<subseteq> inside(?\<Theta>1 \<union> ?\<Theta>2)" | |
| 538 | using pa2_disj_in1 out_sub12 by (auto simp: inside_outside) | |
| 539 | have in_sub_in2: "inside(?\<Theta>2 \<union> ?\<Theta>) \<subseteq> inside(?\<Theta>1 \<union> ?\<Theta>2)" | |
| 540 | using pa1_disj_in2 out_sub12 by (auto simp: inside_outside) | |
| 541 | have in_sub_out12: "inside(?\<Theta>1 \<union> ?\<Theta>) \<subseteq> outside(?\<Theta>2 \<union> ?\<Theta>)" | |
| 542 | proof | |
| 543 | fix x | |
| 544 | assume x: "x \<in> inside (?\<Theta>1 \<union> ?\<Theta>)" | |
| 545 | then have xnot: "x \<notin> ?\<Theta>" | |
| 546 | by (simp add: inside_def) | |
| 547 | obtain z where zim: "z \<in> ?\<Theta>1" and zout: "z \<in> outside(?\<Theta>2 \<union> ?\<Theta>)" | |
| 548 | apply (auto simp: outside_inside) | |
| 549 | using nonempty_simple_path_endless [OF \<open>simple_path c1\<close>] | |
| 550 | by (metis Diff_Diff_Int Diff_iff ex_in_conv c1 c1c c1c2 pa1_disj_in2) | |
| 551 | obtain e where "e > 0" and e: "ball z e \<subseteq> outside(?\<Theta>2 \<union> ?\<Theta>)" | |
| 552 | using zout op_out2c open_contains_ball_eq by blast | |
| 553 | have "z \<in> frontier (inside (?\<Theta>1 \<union> ?\<Theta>))" | |
| 554 | using zim by (auto simp: fr_in) | |
| 555 | then obtain w where w1: "w \<in> inside (?\<Theta>1 \<union> ?\<Theta>)" and dwz: "dist w z < e" | |
| 556 | using zim \<open>e > 0\<close> by (auto simp: frontier_def closure_approachable) | |
| 557 | then have w2: "w \<in> outside (?\<Theta>2 \<union> ?\<Theta>)" | |
| 558 | by (metis e dist_commute mem_ball subsetCE) | |
| 559 | then have "connected_component (- ?\<Theta>2 \<inter> - ?\<Theta>) z w" | |
| 560 | apply (simp add: connected_component_def) | |
| 561 | apply (rule_tac x = "outside(?\<Theta>2 \<union> ?\<Theta>)" in exI) | |
| 562 | using zout apply (auto simp: co_out2c) | |
| 563 | apply (simp_all add: outside_inside) | |
| 564 | done | |
| 565 | moreover have "connected_component (- ?\<Theta>2 \<inter> - ?\<Theta>) w x" | |
| 566 | unfolding connected_component_def | |
| 567 | using pa2_disj_in1 co_in1c x w1 union_with_outside by fastforce | |
| 568 | ultimately have eq: "connected_component_set (- ?\<Theta>2 \<inter> - ?\<Theta>) x = | |
| 569 | connected_component_set (- ?\<Theta>2 \<inter> - ?\<Theta>) z" | |
| 570 | by (metis (mono_tags, lifting) connected_component_eq mem_Collect_eq) | |
| 571 | show "x \<in> outside (?\<Theta>2 \<union> ?\<Theta>)" | |
| 572 | using zout x pa2_disj_in1 by (auto simp: outside_def eq xnot) | |
| 573 | qed | |
| 574 | have in_sub_out21: "inside(?\<Theta>2 \<union> ?\<Theta>) \<subseteq> outside(?\<Theta>1 \<union> ?\<Theta>)" | |
| 575 | proof | |
| 576 | fix x | |
| 577 | assume x: "x \<in> inside (?\<Theta>2 \<union> ?\<Theta>)" | |
| 578 | then have xnot: "x \<notin> ?\<Theta>" | |
| 579 | by (simp add: inside_def) | |
| 580 | obtain z where zim: "z \<in> ?\<Theta>2" and zout: "z \<in> outside(?\<Theta>1 \<union> ?\<Theta>)" | |
| 581 | apply (auto simp: outside_inside) | |
| 582 | using nonempty_simple_path_endless [OF \<open>simple_path c2\<close>] | |
| 583 | by (metis (no_types, hide_lams) Diff_Diff_Int Diff_iff c1c2 c2 c2c ex_in_conv pa2_disj_in1) | |
| 584 | obtain e where "e > 0" and e: "ball z e \<subseteq> outside(?\<Theta>1 \<union> ?\<Theta>)" | |
| 585 | using zout op_out1c open_contains_ball_eq by blast | |
| 586 | have "z \<in> frontier (inside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 587 | using zim by (auto simp: fr_in) | |
| 588 | then obtain w where w2: "w \<in> inside (?\<Theta>2 \<union> ?\<Theta>)" and dwz: "dist w z < e" | |
| 589 | using zim \<open>e > 0\<close> by (auto simp: frontier_def closure_approachable) | |
| 590 | then have w1: "w \<in> outside (?\<Theta>1 \<union> ?\<Theta>)" | |
| 591 | by (metis e dist_commute mem_ball subsetCE) | |
| 592 | then have "connected_component (- ?\<Theta>1 \<inter> - ?\<Theta>) z w" | |
| 593 | apply (simp add: connected_component_def) | |
| 594 | apply (rule_tac x = "outside(?\<Theta>1 \<union> ?\<Theta>)" in exI) | |
| 595 | using zout apply (auto simp: co_out1c) | |
| 596 | apply (simp_all add: outside_inside) | |
| 597 | done | |
| 598 | moreover have "connected_component (- ?\<Theta>1 \<inter> - ?\<Theta>) w x" | |
| 599 | unfolding connected_component_def | |
| 600 | using pa1_disj_in2 co_in2c x w2 union_with_outside by fastforce | |
| 601 | ultimately have eq: "connected_component_set (- ?\<Theta>1 \<inter> - ?\<Theta>) x = | |
| 602 | connected_component_set (- ?\<Theta>1 \<inter> - ?\<Theta>) z" | |
| 603 | by (metis (no_types, lifting) connected_component_eq mem_Collect_eq) | |
| 604 | show "x \<in> outside (?\<Theta>1 \<union> ?\<Theta>)" | |
| 605 | using zout x pa1_disj_in2 by (auto simp: outside_def eq xnot) | |
| 606 | qed | |
| 607 | show ?thesis | |
| 608 | proof | |
| 609 |     show "inside (?\<Theta>1 \<union> ?\<Theta>) \<inter> inside (?\<Theta>2 \<union> ?\<Theta>) = {}"
 | |
| 610 | by (metis Int_Un_distrib in_sub_out12 bot_eq_sup_iff disjoint_eq_subset_Compl outside_inside) | |
| 611 | have *: "outside (?\<Theta>1 \<union> ?\<Theta>) \<inter> outside (?\<Theta>2 \<union> ?\<Theta>) \<subseteq> outside (?\<Theta>1 \<union> ?\<Theta>2)" | |
| 612 | proof (rule components_maximal) | |
| 613 | show out_in: "outside (?\<Theta>1 \<union> ?\<Theta>2) \<in> components (- (?\<Theta>1 \<union> ?\<Theta>2))" | |
| 614 | apply (simp only: outside_in_components co_out12c) | |
| 615 | by (metis bounded_empty fr_out(1) frontier_empty unbounded_outside) | |
| 616 | have conn_U: "connected (- (closure (inside (?\<Theta>1 \<union> ?\<Theta>)) \<union> closure (inside (?\<Theta>2 \<union> ?\<Theta>))))" | |
| 617 | proof (rule Janiszewski_connected, simp_all) | |
| 618 | show "bounded (inside (?\<Theta>1 \<union> ?\<Theta>))" | |
| 619 | by (simp add: \<open>simple_path c1\<close> \<open>simple_path c\<close> bounded_inside bounded_simple_path_image) | |
| 620 | have if1: "- (inside (?\<Theta>1 \<union> ?\<Theta>) \<union> frontier (inside (?\<Theta>1 \<union> ?\<Theta>))) = - ?\<Theta>1 \<inter> - ?\<Theta> \<inter> - inside (?\<Theta>1 \<union> ?\<Theta>)" | |
| 621 | by (metis (no_types, lifting) Int_commute Jordan_inside_outside c c1 compl_sup path_image_join path_image_reversepath pathfinish_join pathfinish_reversepath pathstart_join pathstart_reversepath sp(2) closure_Un_frontier fr_out(3)) | |
| 622 | then show "connected (- closure (inside (?\<Theta>1 \<union> ?\<Theta>)))" | |
| 623 | by (metis Compl_Un outside_inside co_out1c closure_Un_frontier) | |
| 624 | have if2: "- (inside (?\<Theta>2 \<union> ?\<Theta>) \<union> frontier (inside (?\<Theta>2 \<union> ?\<Theta>))) = - ?\<Theta>2 \<inter> - ?\<Theta> \<inter> - inside (?\<Theta>2 \<union> ?\<Theta>)" | |
| 625 | by (metis (no_types, lifting) Int_commute Jordan_inside_outside c c2 compl_sup path_image_join path_image_reversepath pathfinish_join pathfinish_reversepath pathstart_join pathstart_reversepath sp closure_Un_frontier fr_out(2)) | |
| 626 | then show "connected (- closure (inside (?\<Theta>2 \<union> ?\<Theta>)))" | |
| 627 | by (metis Compl_Un outside_inside co_out2c closure_Un_frontier) | |
| 628 | have "connected(?\<Theta>)" | |
| 629 | by (metis \<open>simple_path c\<close> connected_simple_path_image) | |
| 630 | moreover | |
| 631 | have "closure (inside (?\<Theta>1 \<union> ?\<Theta>)) \<inter> closure (inside (?\<Theta>2 \<union> ?\<Theta>)) = ?\<Theta>" | |
| 632 | (is "?lhs = ?rhs") | |
| 633 | proof | |
| 634 | show "?lhs \<subseteq> ?rhs" | |
| 635 | proof clarify | |
| 636 | fix x | |
| 637 | assume x: "x \<in> closure (inside (?\<Theta>1 \<union> ?\<Theta>))" "x \<in> closure (inside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 638 | then have "x \<notin> inside (?\<Theta>1 \<union> ?\<Theta>)" | |
| 639 | by (meson closure_iff_nhds_not_empty in_sub_out12 inside_Int_outside op_in1c) | |
| 640 | with fr_in x show "x \<in> ?\<Theta>" | |
| 641 | by (metis c1c c1c2 closure_Un_frontier pa1_disj_in2 Int_iff Un_iff insert_disjoint(2) insert_subset subsetI subset_antisym) | |
| 642 | qed | |
| 643 | show "?rhs \<subseteq> ?lhs" | |
| 644 | using if1 if2 closure_Un_frontier by fastforce | |
| 645 | qed | |
| 646 | ultimately | |
| 647 | show "connected (closure (inside (?\<Theta>1 \<union> ?\<Theta>)) \<inter> closure (inside (?\<Theta>2 \<union> ?\<Theta>)))" | |
| 648 | by auto | |
| 649 | qed | |
| 650 | show "connected (outside (?\<Theta>1 \<union> ?\<Theta>) \<inter> outside (?\<Theta>2 \<union> ?\<Theta>))" | |
| 651 | using fr_in conn_U by (simp add: closure_Un_frontier outside_inside Un_commute) | |
| 652 | show "outside (?\<Theta>1 \<union> ?\<Theta>) \<inter> outside (?\<Theta>2 \<union> ?\<Theta>) \<subseteq> - (?\<Theta>1 \<union> ?\<Theta>2)" | |
| 653 | by clarify (metis Diff_Compl Diff_iff Un_iff inf_sup_absorb outside_inside) | |
| 654 | show "outside (?\<Theta>1 \<union> ?\<Theta>2) \<inter> | |
| 655 |             (outside (?\<Theta>1 \<union> ?\<Theta>) \<inter> outside (?\<Theta>2 \<union> ?\<Theta>)) \<noteq> {}"
 | |
| 656 | by (metis Int_assoc out_in inf.orderE out_sub12(1) out_sub12(2) outside_in_components) | |
| 657 | qed | |
| 658 |     show "inside (?\<Theta>1 \<union> ?\<Theta>) \<union> inside (?\<Theta>2 \<union> ?\<Theta>) \<union> (?\<Theta> - {a, b}) = inside (?\<Theta>1 \<union> ?\<Theta>2)"
 | |
| 659 | (is "?lhs = ?rhs") | |
| 660 | proof | |
| 661 | show "?lhs \<subseteq> ?rhs" | |
| 662 | apply (simp add: in_sub_in1 in_sub_in2) | |
| 663 | using c1c c2c inside_outside pi_disjoint by fastforce | |
| 664 | have "inside (?\<Theta>1 \<union> ?\<Theta>2) \<subseteq> inside (?\<Theta>1 \<union> ?\<Theta>) \<union> inside (?\<Theta>2 \<union> ?\<Theta>) \<union> (?\<Theta>)" | |
| 665 | using Compl_anti_mono [OF *] by (force simp: inside_outside) | |
| 666 |       moreover have "inside (?\<Theta>1 \<union> ?\<Theta>2) \<subseteq> -{a,b}"
 | |
| 667 | using c1 union_with_outside by fastforce | |
| 668 | ultimately show "?rhs \<subseteq> ?lhs" by auto | |
| 669 | qed | |
| 670 | qed | |
| 671 | qed | |
| 672 | ||
| 673 | end |