src/HOL/Analysis/Homotopy.thy
changeset 73932 fd21b4a93043
parent 72372 1a333166b6b8
child 76874 d6b02d54dbf8
equal deleted inserted replaced
73866:66bff50bc5f1 73932:fd21b4a93043
   549   then have "continuous_on {0..1} (p \<circ> f)"
   549   then have "continuous_on {0..1} (p \<circ> f)"
   550     using contf continuous_on_compose continuous_on_subset f01 by blast
   550     using contf continuous_on_compose continuous_on_subset f01 by blast
   551   then have "path q"
   551   then have "path q"
   552     by (simp add: path_def) (metis q continuous_on_cong)
   552     by (simp add: path_def) (metis q continuous_on_cong)
   553   have piqs: "path_image q \<subseteq> s"
   553   have piqs: "path_image q \<subseteq> s"
   554     by (metis (no_types, hide_lams) pips f01 image_subset_iff path_image_def q)
   554     by (metis (no_types, opaque_lifting) pips f01 image_subset_iff path_image_def q)
   555   have fb0: "\<And>a b. \<lbrakk>0 \<le> a; a \<le> 1; 0 \<le> b; b \<le> 1\<rbrakk> \<Longrightarrow> 0 \<le> (1 - a) * f b + a * b"
   555   have fb0: "\<And>a b. \<lbrakk>0 \<le> a; a \<le> 1; 0 \<le> b; b \<le> 1\<rbrakk> \<Longrightarrow> 0 \<le> (1 - a) * f b + a * b"
   556     using f01 by force
   556     using f01 by force
   557   have fb1: "\<lbrakk>0 \<le> a; a \<le> 1; 0 \<le> b; b \<le> 1\<rbrakk> \<Longrightarrow> (1 - a) * f b + a * b \<le> 1" for a b
   557   have fb1: "\<lbrakk>0 \<le> a; a \<le> 1; 0 \<le> b; b \<le> 1\<rbrakk> \<Longrightarrow> (1 - a) * f b + a * b \<le> 1" for a b
   558     using f01 [THEN subsetD, of "f b"] by (simp add: convex_bound_le)
   558     using f01 [THEN subsetD, of "f b"] by (simp add: convex_bound_le)
   559   have "homotopic_paths s q p"
   559   have "homotopic_paths s q p"
  1844   have 1: "openin (top_of_set S) ?A"
  1844   have 1: "openin (top_of_set S) ?A"
  1845     by (subst openin_subopen, blast)
  1845     by (subst openin_subopen, blast)
  1846   have 2: "openin (top_of_set S) ?B"
  1846   have 2: "openin (top_of_set S) ?B"
  1847     by (subst openin_subopen, blast)
  1847     by (subst openin_subopen, blast)
  1848   have \<section>: "?A \<inter> ?B = {}"
  1848   have \<section>: "?A \<inter> ?B = {}"
  1849     by (clarsimp simp: set_eq_iff) (metis (no_types, hide_lams) Int_iff opD openin_Int)
  1849     by (clarsimp simp: set_eq_iff) (metis (no_types, opaque_lifting) Int_iff opD openin_Int)
  1850   have *: "S \<subseteq> ?A \<union> ?B"
  1850   have *: "S \<subseteq> ?A \<union> ?B"
  1851     by clarsimp (meson opI)
  1851     by clarsimp (meson opI)
  1852   have "?A = {} \<or> ?B = {}"
  1852   have "?A = {} \<or> ?B = {}"
  1853     using \<open>connected S\<close> [unfolded connected_openin, simplified, rule_format, OF 1 \<section> * 2] 
  1853     using \<open>connected S\<close> [unfolded connected_openin, simplified, rule_format, OF 1 \<section> * 2] 
  1854     by blast
  1854     by blast
  1914   shows "locally (\<lambda>U. f constant_on U) S \<longleftrightarrow> f constant_on S" (is "?lhs = ?rhs")
  1914   shows "locally (\<lambda>U. f constant_on U) S \<longleftrightarrow> f constant_on S" (is "?lhs = ?rhs")
  1915 proof
  1915 proof
  1916   assume ?lhs
  1916   assume ?lhs
  1917   then have "\<And>a. a \<in> S \<Longrightarrow> \<exists>T. openin (top_of_set S) T \<and> a \<in> T \<and> (\<forall>x\<in>T. f x = f a)"
  1917   then have "\<And>a. a \<in> S \<Longrightarrow> \<exists>T. openin (top_of_set S) T \<and> a \<in> T \<and> (\<forall>x\<in>T. f x = f a)"
  1918     unfolding locally_def
  1918     unfolding locally_def
  1919     by (metis (mono_tags, hide_lams) constant_on_def constant_on_subset openin_subtopology_self)
  1919     by (metis (mono_tags, opaque_lifting) constant_on_def constant_on_subset openin_subtopology_self)
  1920   then show ?rhs
  1920   then show ?rhs
  1921     using assms
  1921     using assms
  1922     by (simp add: locally_constant_imp_constant)
  1922     by (simp add: locally_constant_imp_constant)
  1923 next
  1923 next
  1924   assume ?rhs then show ?lhs
  1924   assume ?rhs then show ?lhs
  4517       then have conv: "convex (ball x r \<inter> affine hull S)"
  4517       then have conv: "convex (ball x r \<inter> affine hull S)"
  4518         by (simp add: affine_imp_convex convex_Int)
  4518         by (simp add: affine_imp_convex convex_Int)
  4519       have "\<not> aff_dim (affine hull S) \<le> 1"
  4519       have "\<not> aff_dim (affine hull S) \<le> 1"
  4520         using \<open>\<not> collinear S\<close> collinear_aff_dim by auto
  4520         using \<open>\<not> collinear S\<close> collinear_aff_dim by auto
  4521       then have "\<not> aff_dim (ball x r \<inter> affine hull S) \<le> 1"
  4521       then have "\<not> aff_dim (ball x r \<inter> affine hull S) \<le> 1"
  4522         by (metis (no_types, hide_lams) aff_dim_convex_Int_open IntI open_ball \<open>0 < r\<close> aff_dim_affine_hull affine_affine_hull affine_imp_convex centre_in_ball empty_iff hull_subset inf_commute subsetCE that)
  4522         by (metis (no_types, opaque_lifting) aff_dim_convex_Int_open IntI open_ball \<open>0 < r\<close> aff_dim_affine_hull affine_affine_hull affine_imp_convex centre_in_ball empty_iff hull_subset inf_commute subsetCE that)
  4523       then have "\<not> collinear (ball x r \<inter> affine hull S)"
  4523       then have "\<not> collinear (ball x r \<inter> affine hull S)"
  4524         by (simp add: collinear_aff_dim)
  4524         by (simp add: collinear_aff_dim)
  4525       then have *: "path_connected ((ball x r \<inter> affine hull S) - T)"
  4525       then have *: "path_connected ((ball x r \<inter> affine hull S) - T)"
  4526         by (rule path_connected_convex_diff_countable [OF conv _ \<open>countable T\<close>])
  4526         by (rule path_connected_convex_diff_countable [OF conv _ \<open>countable T\<close>])
  4527       have ST: "ball x r \<inter> affine hull S - T \<subseteq> S - T"
  4527       have ST: "ball x r \<inter> affine hull S - T \<subseteq> S - T"
  5252   where "linear h" "linear j"
  5252   where "linear h" "linear j"
  5253     and noh: "\<And>x. norm(h x) = norm x" and noj: "\<And>y. norm(j y) = norm y"
  5253     and noh: "\<And>x. norm(h x) = norm x" and noj: "\<And>y. norm(j y) = norm y"
  5254     and hj:  "\<And>x. j(h x) = x" "\<And>y. h(j y) = y"
  5254     and hj:  "\<And>x. j(h x) = x" "\<And>y. h(j y) = y"
  5255     and ranh: "surj h"
  5255     and ranh: "surj h"
  5256     using isomorphisms_UNIV_UNIV
  5256     using isomorphisms_UNIV_UNIV
  5257     by (metis (mono_tags, hide_lams) DIM_real UNIV_eq_I range_eqI)
  5257     by (metis (mono_tags, opaque_lifting) DIM_real UNIV_eq_I range_eqI)
  5258   obtain f g where hom: "homeomorphism (h ` T) (h ` T) f g"
  5258   obtain f g where hom: "homeomorphism (h ` T) (h ` T) f g"
  5259                and f: "\<And>x. x \<in> h ` K \<Longrightarrow> f x \<in> h ` U"
  5259                and f: "\<And>x. x \<in> h ` K \<Longrightarrow> f x \<in> h ` U"
  5260                and sub: "{x. \<not> (f x = x \<and> g x = x)} \<subseteq> h ` S"
  5260                and sub: "{x. \<not> (f x = x \<and> g x = x)} \<subseteq> h ` S"
  5261                and bou: "bounded {x. \<not> (f x = x \<and> g x = x)}"
  5261                and bou: "bounded {x. \<not> (f x = x \<and> g x = x)}"
  5262     apply (rule homeomorphism_grouping_point_4 [of "h ` U" "h ` S" "h ` K" "h ` T"])
  5262     apply (rule homeomorphism_grouping_point_4 [of "h ` U" "h ` S" "h ` K" "h ` T"])
  5273     proof
  5273     proof
  5274       show "continuous_on T (j \<circ> f \<circ> h)" "continuous_on T (j \<circ> g \<circ> h)"
  5274       show "continuous_on T (j \<circ> f \<circ> h)" "continuous_on T (j \<circ> g \<circ> h)"
  5275         using hom homeomorphism_def
  5275         using hom homeomorphism_def
  5276         by (blast intro: continuous_on_compose cont_hj)+
  5276         by (blast intro: continuous_on_compose cont_hj)+
  5277       show "(j \<circ> f \<circ> h) ` T \<subseteq> T" "(j \<circ> g \<circ> h) ` T \<subseteq> T"
  5277       show "(j \<circ> f \<circ> h) ` T \<subseteq> T" "(j \<circ> g \<circ> h) ` T \<subseteq> T"
  5278         by auto (metis (mono_tags, hide_lams) hj(1) hom homeomorphism_def imageE imageI)+
  5278         by auto (metis (mono_tags, opaque_lifting) hj(1) hom homeomorphism_def imageE imageI)+
  5279       show "\<And>x. x \<in> T \<Longrightarrow> (j \<circ> g \<circ> h) ((j \<circ> f \<circ> h) x) = x"
  5279       show "\<And>x. x \<in> T \<Longrightarrow> (j \<circ> g \<circ> h) ((j \<circ> f \<circ> h) x) = x"
  5280         using hj hom homeomorphism_apply1 by fastforce
  5280         using hj hom homeomorphism_apply1 by fastforce
  5281       show "\<And>y. y \<in> T \<Longrightarrow> (j \<circ> f \<circ> h) ((j \<circ> g \<circ> h) y) = y"
  5281       show "\<And>y. y \<in> T \<Longrightarrow> (j \<circ> f \<circ> h) ((j \<circ> g \<circ> h) y) = y"
  5282         using hj hom homeomorphism_apply2 by fastforce
  5282         using hj hom homeomorphism_apply2 by fastforce
  5283     qed
  5283     qed