src/HOL/Analysis/Homotopy.thy
changeset 70136 f03a01a18c6e
parent 70033 6cbc7634135c
child 70196 b7ef9090feed
equal deleted inserted replaced
70135:ad6d4a14adb5 70136:f03a01a18c6e
     6 
     6 
     7 theory Homotopy
     7 theory Homotopy
     8   imports Path_Connected Continuum_Not_Denumerable Product_Topology
     8   imports Path_Connected Continuum_Not_Denumerable Product_Topology
     9 begin
     9 begin
    10 
    10 
    11 definition%important homotopic_with
    11 definition\<^marker>\<open>tag important\<close> homotopic_with
    12 where
    12 where
    13  "homotopic_with P X Y f g \<equiv>
    13  "homotopic_with P X Y f g \<equiv>
    14    (\<exists>h. continuous_map (prod_topology (subtopology euclideanreal {0..1}) X) Y h \<and>
    14    (\<exists>h. continuous_map (prod_topology (subtopology euclideanreal {0..1}) X) Y h \<and>
    15        (\<forall>x. h(0, x) = f x) \<and>
    15        (\<forall>x. h(0, x) = f x) \<and>
    16        (\<forall>x. h(1, x) = g x) \<and>
    16        (\<forall>x. h(1, x) = g x) \<and>
    48   shows "continuous_map Y Z (h \<circ> Pair t)"
    48   shows "continuous_map Y Z (h \<circ> Pair t)"
    49   apply (intro continuous_map_compose [OF _ h] continuous_map_id [unfolded id_def] continuous_intros)
    49   apply (intro continuous_map_compose [OF _ h] continuous_map_id [unfolded id_def] continuous_intros)
    50   apply (simp add: t)
    50   apply (simp add: t)
    51   done
    51   done
    52 
    52 
    53 subsection%unimportant\<open>Trivial properties\<close>
    53 subsection\<^marker>\<open>tag unimportant\<close>\<open>Trivial properties\<close>
    54 
    54 
    55 text \<open>We often want to just localize the ending function equality or whatever.\<close>
    55 text \<open>We often want to just localize the ending function equality or whatever.\<close>
    56 text%important \<open>%whitespace\<close>
    56 text\<^marker>\<open>tag important\<close> \<open>%whitespace\<close>
    57 proposition homotopic_with:
    57 proposition homotopic_with:
    58   assumes "\<And>h k. (\<And>x. x \<in> topspace X \<Longrightarrow> h x = k x) \<Longrightarrow> (P h \<longleftrightarrow> P k)"
    58   assumes "\<And>h k. (\<And>x. x \<in> topspace X \<Longrightarrow> h x = k x) \<Longrightarrow> (P h \<longleftrightarrow> P k)"
    59   shows "homotopic_with P X Y p q \<longleftrightarrow>
    59   shows "homotopic_with P X Y p q \<longleftrightarrow>
    60            (\<exists>h. continuous_map (prod_topology (subtopology euclideanreal {0..1}) X) Y h \<and>
    60            (\<exists>h. continuous_map (prod_topology (subtopology euclideanreal {0..1}) X) Y h \<and>
    61               (\<forall>x \<in> topspace X. h(0,x) = p x) \<and>
    61               (\<forall>x \<in> topspace X. h(0,x) = p x) \<and>
   514 
   514 
   515 
   515 
   516 subsection\<open>Homotopy of paths, maintaining the same endpoints\<close>
   516 subsection\<open>Homotopy of paths, maintaining the same endpoints\<close>
   517 
   517 
   518 
   518 
   519 definition%important homotopic_paths :: "['a set, real \<Rightarrow> 'a, real \<Rightarrow> 'a::topological_space] \<Rightarrow> bool"
   519 definition\<^marker>\<open>tag important\<close> homotopic_paths :: "['a set, real \<Rightarrow> 'a, real \<Rightarrow> 'a::topological_space] \<Rightarrow> bool"
   520   where
   520   where
   521      "homotopic_paths s p q \<equiv>
   521      "homotopic_paths s p q \<equiv>
   522        homotopic_with_canon (\<lambda>r. pathstart r = pathstart p \<and> pathfinish r = pathfinish p) {0..1} s p q"
   522        homotopic_with_canon (\<lambda>r. pathstart r = pathstart p \<and> pathfinish r = pathfinish p) {0..1} s p q"
   523 
   523 
   524 lemma homotopic_paths:
   524 lemma homotopic_paths:
   671   by (simp add: homotopic_with_compose_continuous_map_left pathfinish_compose pathstart_compose)
   671   by (simp add: homotopic_with_compose_continuous_map_left pathfinish_compose pathstart_compose)
   672 
   672 
   673 
   673 
   674 subsection\<open>Group properties for homotopy of paths\<close>
   674 subsection\<open>Group properties for homotopy of paths\<close>
   675 
   675 
   676 text%important\<open>So taking equivalence classes under homotopy would give the fundamental group\<close>
   676 text\<^marker>\<open>tag important\<close>\<open>So taking equivalence classes under homotopy would give the fundamental group\<close>
   677 
   677 
   678 proposition homotopic_paths_rid:
   678 proposition homotopic_paths_rid:
   679     "\<lbrakk>path p; path_image p \<subseteq> s\<rbrakk> \<Longrightarrow> homotopic_paths s (p +++ linepath (pathfinish p) (pathfinish p)) p"
   679     "\<lbrakk>path p; path_image p \<subseteq> s\<rbrakk> \<Longrightarrow> homotopic_paths s (p +++ linepath (pathfinish p) (pathfinish p)) p"
   680   apply (subst homotopic_paths_sym)
   680   apply (subst homotopic_paths_sym)
   681   apply (rule homotopic_paths_reparametrize [where f = "\<lambda>t. if  t \<le> 1 / 2 then 2 *\<^sub>R t else 1"])
   681   apply (rule homotopic_paths_reparametrize [where f = "\<lambda>t. if  t \<le> 1 / 2 then 2 *\<^sub>R t else 1"])
   734   using homotopic_paths_rinv [of "reversepath p" s] assms by simp
   734   using homotopic_paths_rinv [of "reversepath p" s] assms by simp
   735 
   735 
   736 
   736 
   737 subsection\<open>Homotopy of loops without requiring preservation of endpoints\<close>
   737 subsection\<open>Homotopy of loops without requiring preservation of endpoints\<close>
   738 
   738 
   739 definition%important homotopic_loops :: "'a::topological_space set \<Rightarrow> (real \<Rightarrow> 'a) \<Rightarrow> (real \<Rightarrow> 'a) \<Rightarrow> bool"  where
   739 definition\<^marker>\<open>tag important\<close> homotopic_loops :: "'a::topological_space set \<Rightarrow> (real \<Rightarrow> 'a) \<Rightarrow> (real \<Rightarrow> 'a) \<Rightarrow> bool"  where
   740  "homotopic_loops s p q \<equiv>
   740  "homotopic_loops s p q \<equiv>
   741      homotopic_with_canon (\<lambda>r. pathfinish r = pathstart r) {0..1} s p q"
   741      homotopic_with_canon (\<lambda>r. pathfinish r = pathstart r) {0..1} s p q"
   742 
   742 
   743 lemma homotopic_loops:
   743 lemma homotopic_loops:
   744    "homotopic_loops s p q \<longleftrightarrow>
   744    "homotopic_loops s p q \<longleftrightarrow>
   969       using \<open>path q\<close> homotopic_loops_imp_path loops path_join_path_ends by fastforce
   969       using \<open>path q\<close> homotopic_loops_imp_path loops path_join_path_ends by fastforce
   970   qed
   970   qed
   971 qed
   971 qed
   972 
   972 
   973 
   973 
   974 subsection%unimportant\<open>Homotopy of "nearby" function, paths and loops\<close>
   974 subsection\<^marker>\<open>tag unimportant\<close>\<open>Homotopy of "nearby" function, paths and loops\<close>
   975 
   975 
   976 lemma homotopic_with_linear:
   976 lemma homotopic_with_linear:
   977   fixes f g :: "_ \<Rightarrow> 'b::real_normed_vector"
   977   fixes f g :: "_ \<Rightarrow> 'b::real_normed_vector"
   978   assumes contf: "continuous_on s f"
   978   assumes contf: "continuous_on s f"
   979       and contg:"continuous_on s g"
   979       and contg:"continuous_on s g"
  1171 by (auto simp: path_connected_def path_component_def homotopic_points_eq_path_component)
  1171 by (auto simp: path_connected_def path_component_def homotopic_points_eq_path_component)
  1172 
  1172 
  1173 
  1173 
  1174 subsection\<open>Simply connected sets\<close>
  1174 subsection\<open>Simply connected sets\<close>
  1175 
  1175 
  1176 text%important\<open>defined as "all loops are homotopic (as loops)\<close>
  1176 text\<^marker>\<open>tag important\<close>\<open>defined as "all loops are homotopic (as loops)\<close>
  1177 
  1177 
  1178 definition%important simply_connected where
  1178 definition\<^marker>\<open>tag important\<close> simply_connected where
  1179   "simply_connected S \<equiv>
  1179   "simply_connected S \<equiv>
  1180         \<forall>p q. path p \<and> pathfinish p = pathstart p \<and> path_image p \<subseteq> S \<and>
  1180         \<forall>p q. path p \<and> pathfinish p = pathstart p \<and> path_image p \<subseteq> S \<and>
  1181               path q \<and> pathfinish q = pathstart q \<and> path_image q \<subseteq> S
  1181               path q \<and> pathfinish q = pathstart q \<and> path_image q \<subseteq> S
  1182               \<longrightarrow> homotopic_loops S p q"
  1182               \<longrightarrow> homotopic_loops S p q"
  1183 
  1183 
  1355 qed
  1355 qed
  1356 
  1356 
  1357 
  1357 
  1358 subsection\<open>Contractible sets\<close>
  1358 subsection\<open>Contractible sets\<close>
  1359 
  1359 
  1360 definition%important contractible where
  1360 definition\<^marker>\<open>tag important\<close> contractible where
  1361  "contractible S \<equiv> \<exists>a. homotopic_with_canon (\<lambda>x. True) S S id (\<lambda>x. a)"
  1361  "contractible S \<equiv> \<exists>a. homotopic_with_canon (\<lambda>x. True) S S id (\<lambda>x. a)"
  1362 
  1362 
  1363 proposition contractible_imp_simply_connected:
  1363 proposition contractible_imp_simply_connected:
  1364   fixes S :: "_::real_normed_vector set"
  1364   fixes S :: "_::real_normed_vector set"
  1365   assumes "contractible S" shows "simply_connected S"
  1365   assumes "contractible S" shows "simply_connected S"
  1596 qed
  1596 qed
  1597 
  1597 
  1598 
  1598 
  1599 subsection\<open>Local versions of topological properties in general\<close>
  1599 subsection\<open>Local versions of topological properties in general\<close>
  1600 
  1600 
  1601 definition%important locally :: "('a::topological_space set \<Rightarrow> bool) \<Rightarrow> 'a set \<Rightarrow> bool"
  1601 definition\<^marker>\<open>tag important\<close> locally :: "('a::topological_space set \<Rightarrow> bool) \<Rightarrow> 'a set \<Rightarrow> bool"
  1602 where
  1602 where
  1603  "locally P S \<equiv>
  1603  "locally P S \<equiv>
  1604         \<forall>w x. openin (top_of_set S) w \<and> x \<in> w
  1604         \<forall>w x. openin (top_of_set S) w \<and> x \<in> w
  1605               \<longrightarrow> (\<exists>u v. openin (top_of_set S) u \<and> P v \<and>
  1605               \<longrightarrow> (\<exists>u v. openin (top_of_set S) u \<and> P v \<and>
  1606                         x \<in> u \<and> u \<subseteq> v \<and> v \<subseteq> w)"
  1606                         x \<in> u \<and> u \<subseteq> v \<and> v \<subseteq> w)"
  2973   qed
  2973   qed
  2974   ultimately show "openin (top_of_set (f ` S)) (path_component_set U y)"
  2974   ultimately show "openin (top_of_set (f ` S)) (path_component_set U y)"
  2975     by metis
  2975     by metis
  2976 qed
  2976 qed
  2977 
  2977 
  2978 subsection%unimportant\<open>Components, continuity, openin, closedin\<close>
  2978 subsection\<^marker>\<open>tag unimportant\<close>\<open>Components, continuity, openin, closedin\<close>
  2979 
  2979 
  2980 lemma continuous_on_components_gen:
  2980 lemma continuous_on_components_gen:
  2981  fixes f :: "'a::topological_space \<Rightarrow> 'b::topological_space"
  2981  fixes f :: "'a::topological_space \<Rightarrow> 'b::topological_space"
  2982   assumes "\<And>c. c \<in> components S \<Longrightarrow>
  2982   assumes "\<And>c. c \<in> components S \<Longrightarrow>
  2983               openin (top_of_set S) c \<and> continuous_on c f"
  2983               openin (top_of_set S) c \<and> continuous_on c f"
  3306 qed
  3306 qed
  3307 
  3307 
  3308 
  3308 
  3309 subsection\<open>Retracts, in a general sense, preserve (co)homotopic triviality)\<close>
  3309 subsection\<open>Retracts, in a general sense, preserve (co)homotopic triviality)\<close>
  3310 
  3310 
  3311 locale%important Retracts =
  3311 locale\<^marker>\<open>tag important\<close> Retracts =
  3312   fixes s h t k
  3312   fixes s h t k
  3313   assumes conth: "continuous_on s h"
  3313   assumes conth: "continuous_on s h"
  3314       and imh: "h ` s = t"
  3314       and imh: "h ` s = t"
  3315       and contk: "continuous_on t k"
  3315       and contk: "continuous_on t k"
  3316       and imk: "k ` t \<subseteq> s"
  3316       and imk: "k ` t \<subseteq> s"
  3472 
  3472 
  3473 subsection\<open>Homotopy equivalence\<close>
  3473 subsection\<open>Homotopy equivalence\<close>
  3474 
  3474 
  3475 subsection\<open>Homotopy equivalence of topological spaces.\<close>
  3475 subsection\<open>Homotopy equivalence of topological spaces.\<close>
  3476 
  3476 
  3477 definition%important homotopy_equivalent_space
  3477 definition\<^marker>\<open>tag important\<close> homotopy_equivalent_space
  3478              (infix "homotopy'_equivalent'_space" 50)
  3478              (infix "homotopy'_equivalent'_space" 50)
  3479   where "X homotopy_equivalent_space Y \<equiv>
  3479   where "X homotopy_equivalent_space Y \<equiv>
  3480         (\<exists>f g. continuous_map X Y f \<and>
  3480         (\<exists>f g. continuous_map X Y f \<and>
  3481               continuous_map Y X g \<and>
  3481               continuous_map Y X g \<and>
  3482               homotopic_with (\<lambda>x. True) X X (g \<circ> f) id \<and>
  3482               homotopic_with (\<lambda>x. True) X X (g \<circ> f) id \<and>
  3895   then show ?thesis
  3895   then show ?thesis
  3896     by simp
  3896     by simp
  3897 qed
  3897 qed
  3898 
  3898 
  3899 
  3899 
  3900 abbreviation%important homotopy_eqv :: "'a::topological_space set \<Rightarrow> 'b::topological_space set \<Rightarrow> bool"
  3900 abbreviation\<^marker>\<open>tag important\<close> homotopy_eqv :: "'a::topological_space set \<Rightarrow> 'b::topological_space set \<Rightarrow> bool"
  3901              (infix "homotopy'_eqv" 50)
  3901              (infix "homotopy'_eqv" 50)
  3902   where "S homotopy_eqv T \<equiv> top_of_set S homotopy_equivalent_space top_of_set T"
  3902   where "S homotopy_eqv T \<equiv> top_of_set S homotopy_equivalent_space top_of_set T"
  3903 
  3903 
  3904 
  3904 
  3905 
  3905 
  4142   fixes S :: "'a::real_normed_vector set" and T :: "'b::real_normed_vector set"
  4142   fixes S :: "'a::real_normed_vector set" and T :: "'b::real_normed_vector set"
  4143   shows "\<lbrakk>contractible S; S homeomorphic T\<rbrakk> \<Longrightarrow> contractible T"
  4143   shows "\<lbrakk>contractible S; S homeomorphic T\<rbrakk> \<Longrightarrow> contractible T"
  4144   by (metis homeomorphic_contractible_eq)
  4144   by (metis homeomorphic_contractible_eq)
  4145 
  4145 
  4146 
  4146 
  4147 subsection%unimportant\<open>Misc other results\<close>
  4147 subsection\<^marker>\<open>tag unimportant\<close>\<open>Misc other results\<close>
  4148 
  4148 
  4149 lemma bounded_connected_Compl_real:
  4149 lemma bounded_connected_Compl_real:
  4150   fixes S :: "real set"
  4150   fixes S :: "real set"
  4151   assumes "bounded S" and conn: "connected(- S)"
  4151   assumes "bounded S" and conn: "connected(- S)"
  4152     shows "S = {}"
  4152     shows "S = {}"
  4192   then show ?thesis
  4192   then show ?thesis
  4193     by blast
  4193     by blast
  4194 qed
  4194 qed
  4195 
  4195 
  4196 
  4196 
  4197 subsection%unimportant\<open>Some Uncountable Sets\<close>
  4197 subsection\<^marker>\<open>tag unimportant\<close>\<open>Some Uncountable Sets\<close>
  4198 
  4198 
  4199 lemma uncountable_closed_segment:
  4199 lemma uncountable_closed_segment:
  4200   fixes a :: "'a::real_normed_vector"
  4200   fixes a :: "'a::real_normed_vector"
  4201   assumes "a \<noteq> b" shows "uncountable (closed_segment a b)"
  4201   assumes "a \<noteq> b" shows "uncountable (closed_segment a b)"
  4202 unfolding path_image_linepath [symmetric] path_image_def
  4202 unfolding path_image_linepath [symmetric] path_image_def
  4331   assumes "arc g"
  4331   assumes "arc g"
  4332   shows "uncountable (path_image g)"
  4332   shows "uncountable (path_image g)"
  4333   by (simp add: arc_imp_simple_path assms simple_path_image_uncountable)
  4333   by (simp add: arc_imp_simple_path assms simple_path_image_uncountable)
  4334 
  4334 
  4335 
  4335 
  4336 subsection%unimportant\<open> Some simple positive connection theorems\<close>
  4336 subsection\<^marker>\<open>tag unimportant\<close>\<open> Some simple positive connection theorems\<close>
  4337 
  4337 
  4338 proposition path_connected_convex_diff_countable:
  4338 proposition path_connected_convex_diff_countable:
  4339   fixes U :: "'a::euclidean_space set"
  4339   fixes U :: "'a::euclidean_space set"
  4340   assumes "convex U" "\<not> collinear U" "countable S"
  4340   assumes "convex U" "\<not> collinear U" "countable S"
  4341     shows "path_connected(U - S)"
  4341     shows "path_connected(U - S)"
  4596   shows "connected(S - T)"
  4596   shows "connected(S - T)"
  4597 by (simp add: assms path_connected_imp_connected path_connected_open_diff_countable)
  4597 by (simp add: assms path_connected_imp_connected path_connected_open_diff_countable)
  4598 
  4598 
  4599 
  4599 
  4600 
  4600 
  4601 subsection%unimportant \<open>Self-homeomorphisms shuffling points about\<close>
  4601 subsection\<^marker>\<open>tag unimportant\<close> \<open>Self-homeomorphisms shuffling points about\<close>
  4602 
  4602 
  4603 subsubsection%unimportant\<open>The theorem \<open>homeomorphism_moving_points_exists\<close>\<close>
  4603 subsubsection\<^marker>\<open>tag unimportant\<close>\<open>The theorem \<open>homeomorphism_moving_points_exists\<close>\<close>
  4604 
  4604 
  4605 lemma homeomorphism_moving_point_1:
  4605 lemma homeomorphism_moving_point_1:
  4606   fixes a :: "'a::euclidean_space"
  4606   fixes a :: "'a::euclidean_space"
  4607   assumes "affine T" "a \<in> T" and u: "u \<in> ball a r \<inter> T"
  4607   assumes "affine T" "a \<in> T" and u: "u \<in> ball a r \<inter> T"
  4608   obtains f g where "homeomorphism (cball a r \<inter> T) (cball a r \<inter> T) f g"
  4608   obtains f g where "homeomorphism (cball a r \<inter> T) (cball a r \<inter> T) f g"
  4728     using \<open>r > 0\<close>
  4728     using \<open>r > 0\<close>
  4729      apply (simp_all add: f_def dist_norm norm_minus_commute)
  4729      apply (simp_all add: f_def dist_norm norm_minus_commute)
  4730     done
  4730     done
  4731 qed
  4731 qed
  4732 
  4732 
  4733 corollary%unimportant homeomorphism_moving_point_2:
  4733 corollary\<^marker>\<open>tag unimportant\<close> homeomorphism_moving_point_2:
  4734   fixes a :: "'a::euclidean_space"
  4734   fixes a :: "'a::euclidean_space"
  4735   assumes "affine T" "a \<in> T" and u: "u \<in> ball a r \<inter> T" and v: "v \<in> ball a r \<inter> T"
  4735   assumes "affine T" "a \<in> T" and u: "u \<in> ball a r \<inter> T" and v: "v \<in> ball a r \<inter> T"
  4736   obtains f g where "homeomorphism (cball a r \<inter> T) (cball a r \<inter> T) f g"
  4736   obtains f g where "homeomorphism (cball a r \<inter> T) (cball a r \<inter> T) f g"
  4737                     "f u = v" "\<And>x. \<lbrakk>x \<in> sphere a r; x \<in> T\<rbrakk> \<Longrightarrow> f x = x"
  4737                     "f u = v" "\<And>x. \<lbrakk>x \<in> sphere a r; x \<in> T\<rbrakk> \<Longrightarrow> f x = x"
  4738 proof -
  4738 proof -
  4756       using f1 f2 hom1 homeomorphism_apply1 by fastforce
  4756       using f1 f2 hom1 homeomorphism_apply1 by fastforce
  4757   qed
  4757   qed
  4758 qed
  4758 qed
  4759 
  4759 
  4760 
  4760 
  4761 corollary%unimportant homeomorphism_moving_point_3:
  4761 corollary\<^marker>\<open>tag unimportant\<close> homeomorphism_moving_point_3:
  4762   fixes a :: "'a::euclidean_space"
  4762   fixes a :: "'a::euclidean_space"
  4763   assumes "affine T" "a \<in> T" and ST: "ball a r \<inter> T \<subseteq> S" "S \<subseteq> T"
  4763   assumes "affine T" "a \<in> T" and ST: "ball a r \<inter> T \<subseteq> S" "S \<subseteq> T"
  4764       and u: "u \<in> ball a r \<inter> T" and v: "v \<in> ball a r \<inter> T"
  4764       and u: "u \<in> ball a r \<inter> T" and v: "v \<in> ball a r \<inter> T"
  4765   obtains f g where "homeomorphism S S f g"
  4765   obtains f g where "homeomorphism S S f g"
  4766                     "f u = v" "{x. \<not> (f x = x \<and> g x = x)} \<subseteq> ball a r \<inter> T"
  4766                     "f u = v" "{x. \<not> (f x = x \<and> g x = x)} \<subseteq> ball a r \<inter> T"
  4834       by (auto simp: ff_def gg_def)
  4834       by (auto simp: ff_def gg_def)
  4835   qed
  4835   qed
  4836 qed
  4836 qed
  4837 
  4837 
  4838 
  4838 
  4839 proposition%unimportant homeomorphism_moving_point:
  4839 proposition\<^marker>\<open>tag unimportant\<close> homeomorphism_moving_point:
  4840   fixes a :: "'a::euclidean_space"
  4840   fixes a :: "'a::euclidean_space"
  4841   assumes ope: "openin (top_of_set (affine hull S)) S"
  4841   assumes ope: "openin (top_of_set (affine hull S)) S"
  4842       and "S \<subseteq> T"
  4842       and "S \<subseteq> T"
  4843       and TS: "T \<subseteq> affine hull S"
  4843       and TS: "T \<subseteq> affine hull S"
  4844       and S: "connected S" "a \<in> S" "b \<in> S"
  4844       and S: "connected S" "a \<in> S" "b \<in> S"
  4990     then show "bounded {x. \<not> ((h \<circ> f) x = x \<and> (g \<circ> k) x = x)}"
  4990     then show "bounded {x. \<not> ((h \<circ> f) x = x \<and> (g \<circ> k) x = x)}"
  4991       by (rule bounded_subset) auto
  4991       by (rule bounded_subset) auto
  4992   qed
  4992   qed
  4993 qed
  4993 qed
  4994 
  4994 
  4995 proposition%unimportant homeomorphism_moving_points_exists:
  4995 proposition\<^marker>\<open>tag unimportant\<close> homeomorphism_moving_points_exists:
  4996   fixes S :: "'a::euclidean_space set"
  4996   fixes S :: "'a::euclidean_space set"
  4997   assumes 2: "2 \<le> DIM('a)" "open S" "connected S" "S \<subseteq> T" "finite K"
  4997   assumes 2: "2 \<le> DIM('a)" "open S" "connected S" "S \<subseteq> T" "finite K"
  4998       and KS: "\<And>i. i \<in> K \<Longrightarrow> x i \<in> S \<and> y i \<in> S"
  4998       and KS: "\<And>i. i \<in> K \<Longrightarrow> x i \<in> S \<and> y i \<in> S"
  4999       and pw: "pairwise (\<lambda>i j. (x i \<noteq> x j) \<and> (y i \<noteq> y j)) K"
  4999       and pw: "pairwise (\<lambda>i j. (x i \<noteq> x j) \<and> (y i \<noteq> y j)) K"
  5000       and S: "S \<subseteq> T" "T \<subseteq> affine hull S" "connected S"
  5000       and S: "S \<subseteq> T" "T \<subseteq> affine hull S" "connected S"
  5019     by linarith
  5019     by linarith
  5020   then show ?thesis
  5020   then show ?thesis
  5021     using homeomorphism_moving_points_exists_gen [OF \<open>finite K\<close> KS pw _ ope S] that by fastforce
  5021     using homeomorphism_moving_points_exists_gen [OF \<open>finite K\<close> KS pw _ ope S] that by fastforce
  5022 qed
  5022 qed
  5023 
  5023 
  5024 subsubsection%unimportant\<open>The theorem \<open>homeomorphism_grouping_points_exists\<close>\<close>
  5024 subsubsection\<^marker>\<open>tag unimportant\<close>\<open>The theorem \<open>homeomorphism_grouping_points_exists\<close>\<close>
  5025 
  5025 
  5026 lemma homeomorphism_grouping_point_1:
  5026 lemma homeomorphism_grouping_point_1:
  5027   fixes a::real and c::real
  5027   fixes a::real and c::real
  5028   assumes "a < b" "c < d"
  5028   assumes "a < b" "c < d"
  5029   obtains f g where "homeomorphism (cbox a b) (cbox c d) f g" "f a = c" "f b = d"
  5029   obtains f g where "homeomorphism (cbox a b) (cbox c d) f g" "f a = c" "f b = d"
  5256       apply (auto simp: f'_def g'_def)
  5256       apply (auto simp: f'_def g'_def)
  5257       done
  5257       done
  5258   qed
  5258   qed
  5259 qed
  5259 qed
  5260 
  5260 
  5261 proposition%unimportant homeomorphism_grouping_points_exists:
  5261 proposition\<^marker>\<open>tag unimportant\<close> homeomorphism_grouping_points_exists:
  5262   fixes S :: "'a::euclidean_space set"
  5262   fixes S :: "'a::euclidean_space set"
  5263   assumes "open U" "open S" "connected S" "U \<noteq> {}" "finite K" "K \<subseteq> S" "U \<subseteq> S" "S \<subseteq> T"
  5263   assumes "open U" "open S" "connected S" "U \<noteq> {}" "finite K" "K \<subseteq> S" "U \<subseteq> S" "S \<subseteq> T"
  5264   obtains f g where "homeomorphism T T f g" "{x. (\<not> (f x = x \<and> g x = x))} \<subseteq> S"
  5264   obtains f g where "homeomorphism T T f g" "{x. (\<not> (f x = x \<and> g x = x))} \<subseteq> S"
  5265                     "bounded {x. (\<not> (f x = x \<and> g x = x))}" "\<And>x. x \<in> K \<Longrightarrow> f x \<in> U"
  5265                     "bounded {x. (\<not> (f x = x \<and> g x = x))}" "\<And>x. x \<in> K \<Longrightarrow> f x \<in> U"
  5266 proof (cases "2 \<le> DIM('a)")
  5266 proof (cases "2 \<le> DIM('a)")
  5335       using f hj by fastforce
  5335       using f hj by fastforce
  5336   qed
  5336   qed
  5337 qed
  5337 qed
  5338 
  5338 
  5339 
  5339 
  5340 proposition%unimportant homeomorphism_grouping_points_exists_gen:
  5340 proposition\<^marker>\<open>tag unimportant\<close> homeomorphism_grouping_points_exists_gen:
  5341   fixes S :: "'a::euclidean_space set"
  5341   fixes S :: "'a::euclidean_space set"
  5342   assumes opeU: "openin (top_of_set S) U"
  5342   assumes opeU: "openin (top_of_set S) U"
  5343       and opeS: "openin (top_of_set (affine hull S)) S"
  5343       and opeS: "openin (top_of_set (affine hull S)) S"
  5344       and "U \<noteq> {}" "finite K" "K \<subseteq> S" and S: "S \<subseteq> T" "T \<subseteq> affine hull S" "connected S"
  5344       and "U \<noteq> {}" "finite K" "K \<subseteq> S" and S: "S \<subseteq> T" "T \<subseteq> affine hull S" "connected S"
  5345   obtains f g where "homeomorphism T T f g" "{x. (\<not> (f x = x \<and> g x = x))} \<subseteq> S"
  5345   obtains f g where "homeomorphism T T f g" "{x. (\<not> (f x = x \<and> g x = x))} \<subseteq> S"