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