# HG changeset patch # User paulson # Date 1679049770 0 # Node ID 05329cd9db4bc852bc3b5cf20e77e1221c1463d4 # Parent a76f49a034488bb12cfadcfc0da4551ad10481ba# Parent 71f001027a13516216178c73388147647d3e27f3 merged diff -r a76f49a03448 -r 05329cd9db4b src/HOL/Analysis/Homotopy.thy --- a/src/HOL/Analysis/Homotopy.thy Thu Mar 16 17:12:06 2023 +0100 +++ b/src/HOL/Analysis/Homotopy.thy Fri Mar 17 10:42:50 2023 +0000 @@ -62,11 +62,8 @@ unfolding homotopic_with_def apply (rule iffI, blast, clarify) apply (rule_tac x="\(u,v). if v \ topspace X then h(u,v) else if u = 0 then p v else q v" in exI) - apply auto - using continuous_map_eq apply fastforce - apply (drule_tac x=t in bspec, force) - apply (subst assms; simp) - done + apply simp + by (smt (verit, best) SigmaE assms case_prod_conv continuous_map_eq topspace_prod_topology) lemma homotopic_with_mono: assumes hom: "homotopic_with P X Y f g" @@ -121,11 +118,11 @@ lemma homotopic_with_imp_subset1: "homotopic_with_canon P X Y f g \ f ` X \ Y" - by (simp add: homotopic_with_def image_subset_iff) (metis atLeastAtMost_iff order_refl zero_le_one) + by (meson continuous_map_subtopology_eu homotopic_with_imp_continuous_maps) lemma homotopic_with_imp_subset2: "homotopic_with_canon P X Y f g \ g ` X \ Y" - by (simp add: homotopic_with_def image_subset_iff) (metis atLeastAtMost_iff order_refl zero_le_one) + by (meson continuous_map_subtopology_eu homotopic_with_imp_continuous_maps) lemma homotopic_with_subset_left: "\homotopic_with_canon P X Y f g; Z \ X\ \ homotopic_with_canon P Z Y f g" @@ -140,7 +137,7 @@ text \(on continuous functions mapping X into Y that satisfy P, though this only affects reflexivity)\ lemma homotopic_with_refl [simp]: "homotopic_with P X Y f f \ continuous_map X Y f \ P f" - by (auto simp: homotopic_with_imp_continuous_maps intro: homotopic_with_equal dest: homotopic_with_imp_property) + by (metis homotopic_with_equal homotopic_with_imp_continuous_maps homotopic_with_imp_property) lemma homotopic_with_symD: assumes "homotopic_with P X Y f g" @@ -262,44 +259,26 @@ corollary homotopic_compose: assumes "homotopic_with (\x. True) X Y f f'" "homotopic_with (\x. True) Y Z g g'" shows "homotopic_with (\x. True) X Z (g \ f) (g' \ f')" -proof (rule homotopic_with_trans [where g = "g \ f'"]) - show "homotopic_with (\x. True) X Z (g \ f) (g \ f')" - using assms by (simp add: homotopic_with_compose_continuous_map_left homotopic_with_imp_continuous_maps) - show "homotopic_with (\x. True) X Z (g \ f') (g' \ f')" - using assms by (simp add: homotopic_with_compose_continuous_map_right homotopic_with_imp_continuous_maps) -qed + by (metis assms homotopic_with_compose_continuous_map_left homotopic_with_compose_continuous_map_right homotopic_with_imp_continuous_maps homotopic_with_trans) proposition homotopic_with_compose_continuous_right: "\homotopic_with_canon (\f. p (f \ h)) X Y f g; continuous_on W h; h ` W \ X\ \ homotopic_with_canon p W Y (f \ h) (g \ h)" - apply (clarsimp simp add: homotopic_with_def) - subgoal for k - apply (rule_tac x="k \ (\y. (fst y, h (snd y)))" in exI) - by (intro conjI continuous_intros continuous_on_compose2 [where f=snd and g=h]; fastforce simp: o_def elim: continuous_on_subset) - done + by (simp add: homotopic_with_compose_continuous_map_right) proposition homotopic_with_compose_continuous_left: "\homotopic_with_canon (\f. p (h \ f)) X Y f g; continuous_on Y h; h ` Y \ Z\ \ homotopic_with_canon p X Z (h \ f) (h \ g)" - apply (clarsimp simp add: homotopic_with_def) - subgoal for k - apply (rule_tac x="h \ k" in exI) - by (intro conjI continuous_intros continuous_on_compose [where f=snd and g=h, unfolded o_def]; fastforce simp: o_def elim: continuous_on_subset) - done + by (simp add: homotopic_with_compose_continuous_map_left) lemma homotopic_from_subtopology: - "homotopic_with P X X' f g \ homotopic_with P (subtopology X s) X' f g" - unfolding homotopic_with_def - by (force simp add: continuous_map_from_subtopology prod_topology_subtopology(2) elim!: ex_forward) + "homotopic_with P X X' f g \ homotopic_with P (subtopology X S) X' f g" + by (metis continuous_map_id_subt homotopic_with_compose_continuous_map_right o_id) lemma homotopic_on_emptyI: assumes "topspace X = {}" "P f" "P g" shows "homotopic_with P X X' f g" - unfolding homotopic_with_def -proof (intro exI conjI ballI) - show "P (\x. (\(t,x). if t = 0 then f x else g x) (t, x))" if "t \ {0..1}" for t::real - by (cases "t = 0", auto simp: assms) -qed (auto simp: continuous_map_atin assms) + by (metis assms continuous_map_on_empty empty_iff homotopic_with_equal) lemma homotopic_on_empty: "topspace X = {} \ (homotopic_with P X X' f g \ P f \ P g)" @@ -342,15 +321,7 @@ and g': "\x. x \ topspace X \ g' x = g x" and P: "(\h k. (\x. x \ topspace X \ h x = k x) \ P h \ P k)" shows "homotopic_with P X Y f' g'" - using h unfolding homotopic_with_def - apply clarify - subgoal for h - apply (rule_tac x="\(u,v). if v \ topspace X then h(u,v) else if u = 0 then f' v else g' v" in exI) - apply (simp add: f' g', safe) - apply (fastforce intro: continuous_map_eq) - apply (subst P; fastforce) - done - done + by (smt (verit, ccfv_SIG) assms homotopic_with) lemma homotopic_with_prod_topology: assumes "homotopic_with p X1 Y1 f f'" and "homotopic_with q X2 Y2 g g'" @@ -461,10 +432,8 @@ assume "continuous_on S f" "f ` S \ T" "continuous_on S g" "g ` S \ T" obtain c d where c: "homotopic_with_canon (\x. True) S T f (\x. c)" and d: "homotopic_with_canon (\x. True) S T g (\x. d)" using False \continuous_on S f\ \f ` S \ T\ RHS \continuous_on S g\ \g ` S \ T\ by blast - then have "c \ T" "d \ T" - using False homotopic_with_imp_continuous_maps by fastforce+ with T have "path_component T c d" - using path_connected_component by blast + by (metis False ex_in_conv homotopic_with_imp_subset2 image_subset_iff path_connected_component) then have "homotopic_with_canon (\x. True) S T (\x. c) (\x. d)" by (simp add: homotopic_constant_maps) with c d show "homotopic_with_canon (\x. True) S T f g" @@ -479,13 +448,13 @@ definition\<^marker>\tag important\ homotopic_paths :: "['a set, real \ 'a, real \ 'a::topological_space] \ bool" where - "homotopic_paths s p q \ - homotopic_with_canon (\r. pathstart r = pathstart p \ pathfinish r = pathfinish p) {0..1} s p q" + "homotopic_paths S p q \ + homotopic_with_canon (\r. pathstart r = pathstart p \ pathfinish r = pathfinish p) {0..1} S p q" lemma homotopic_paths: - "homotopic_paths s p q \ + "homotopic_paths S p q \ (\h. continuous_on ({0..1} \ {0..1}) h \ - h ` ({0..1} \ {0..1}) \ s \ + h ` ({0..1} \ {0..1}) \ S \ (\x \ {0..1}. h(0,x) = p x) \ (\x \ {0..1}. h(1,x) = q x) \ (\t \ {0..1::real}. pathstart(h \ Pair t) = pathstart p \ @@ -493,56 +462,48 @@ by (auto simp: homotopic_paths_def homotopic_with pathstart_def pathfinish_def) proposition homotopic_paths_imp_pathstart: - "homotopic_paths s p q \ pathstart p = pathstart q" + "homotopic_paths S p q \ pathstart p = pathstart q" by (metis (mono_tags, lifting) homotopic_paths_def homotopic_with_imp_property) proposition homotopic_paths_imp_pathfinish: - "homotopic_paths s p q \ pathfinish p = pathfinish q" + "homotopic_paths S p q \ pathfinish p = pathfinish q" by (metis (mono_tags, lifting) homotopic_paths_def homotopic_with_imp_property) lemma homotopic_paths_imp_path: - "homotopic_paths s p q \ path p \ path q" + "homotopic_paths S p q \ path p \ path q" using homotopic_paths_def homotopic_with_imp_continuous_maps path_def continuous_map_subtopology_eu by blast lemma homotopic_paths_imp_subset: - "homotopic_paths s p q \ path_image p \ s \ path_image q \ s" + "homotopic_paths S p q \ path_image p \ S \ path_image q \ S" by (metis (mono_tags) continuous_map_subtopology_eu homotopic_paths_def homotopic_with_imp_continuous_maps path_image_def) -proposition homotopic_paths_refl [simp]: "homotopic_paths s p p \ path p \ path_image p \ s" +proposition homotopic_paths_refl [simp]: "homotopic_paths S p p \ path p \ path_image p \ S" by (simp add: homotopic_paths_def path_def path_image_def) -proposition homotopic_paths_sym: "homotopic_paths s p q \ homotopic_paths s q p" +proposition homotopic_paths_sym: "homotopic_paths S p q \ homotopic_paths S q p" by (metis (mono_tags) homotopic_paths_def homotopic_paths_imp_pathfinish homotopic_paths_imp_pathstart homotopic_with_symD) -proposition homotopic_paths_sym_eq: "homotopic_paths s p q \ homotopic_paths s q p" +proposition homotopic_paths_sym_eq: "homotopic_paths S p q \ homotopic_paths S q p" by (metis homotopic_paths_sym) proposition homotopic_paths_trans [trans]: - assumes "homotopic_paths s p q" "homotopic_paths s q r" - shows "homotopic_paths s p r" -proof - - have "pathstart q = pathstart p" "pathfinish q = pathfinish p" - using assms by (simp_all add: homotopic_paths_imp_pathstart homotopic_paths_imp_pathfinish) - then have "homotopic_with_canon (\f. pathstart f = pathstart p \ pathfinish f = pathfinish p) {0..1} s q r" - using \homotopic_paths s q r\ homotopic_paths_def by force - then show ?thesis - using assms homotopic_paths_def homotopic_with_trans by blast -qed + assumes "homotopic_paths S p q" "homotopic_paths S q r" + shows "homotopic_paths S p r" + using assms homotopic_paths_imp_pathfinish homotopic_paths_imp_pathstart unfolding homotopic_paths_def + by (smt (verit, ccfv_SIG) homotopic_with_mono homotopic_with_trans) proposition homotopic_paths_eq: - "\path p; path_image p \ s; \t. t \ {0..1} \ p t = q t\ \ homotopic_paths s p q" - unfolding homotopic_paths_def - by (rule homotopic_with_eq) - (auto simp: path_def pathstart_def pathfinish_def path_image_def elim: continuous_on_eq) + "\path p; path_image p \ S; \t. t \ {0..1} \ p t = q t\ \ homotopic_paths S p q" + by (smt (verit, best) homotopic_paths homotopic_paths_refl) proposition homotopic_paths_reparametrize: assumes "path p" - and pips: "path_image p \ s" + and pips: "path_image p \ S" and contf: "continuous_on {0..1} f" and f01:"f ` {0..1} \ {0..1}" and [simp]: "f(0) = 0" "f(1) = 1" and q: "\t. t \ {0..1} \ q(t) = p(f t)" - shows "homotopic_paths s p q" + shows "homotopic_paths S p q" proof - have contp: "continuous_on {0..1} p" by (metis \path p\ path_def) @@ -550,18 +511,18 @@ using contf continuous_on_compose continuous_on_subset f01 by blast then have "path q" by (simp add: path_def) (metis q continuous_on_cong) - have piqs: "path_image q \ s" + have piqs: "path_image q \ S" by (metis (no_types, opaque_lifting) pips f01 image_subset_iff path_image_def q) have fb0: "\a b. \0 \ a; a \ 1; 0 \ b; b \ 1\ \ 0 \ (1 - a) * f b + a * b" using f01 by force have fb1: "\0 \ a; a \ 1; 0 \ b; b \ 1\ \ (1 - a) * f b + a * b \ 1" for a b using f01 [THEN subsetD, of "f b"] by (simp add: convex_bound_le) - have "homotopic_paths s q p" + have "homotopic_paths S q p" proof (rule homotopic_paths_trans) - show "homotopic_paths s q (p \ f)" + show "homotopic_paths S q (p \ f)" using q by (force intro: homotopic_paths_eq [OF \path q\ piqs]) next - show "homotopic_paths s (p \ f) p" + show "homotopic_paths S (p \ f) p" using pips [unfolded path_image_def] apply (simp add: homotopic_paths_def homotopic_with_def) apply (rule_tac x="p \ (\y. (1 - (fst y)) *\<^sub>R ((f \ snd) y) + (fst y) *\<^sub>R snd y)" in exI) @@ -572,7 +533,7 @@ by (simp add: homotopic_paths_sym) qed -lemma homotopic_paths_subset: "\homotopic_paths s p q; s \ t\ \ homotopic_paths t p q" +lemma homotopic_paths_subset: "\homotopic_paths S p q; S \ t\ \ homotopic_paths t p q" unfolding homotopic_paths by fast @@ -601,8 +562,8 @@ text\ Congruence properties of homotopy w.r.t. path-combining operations.\ lemma homotopic_paths_reversepath_D: - assumes "homotopic_paths s p q" - shows "homotopic_paths s (reversepath p) (reversepath q)" + assumes "homotopic_paths S p q" + shows "homotopic_paths S (reversepath p) (reversepath q)" using assms apply (simp add: homotopic_paths_def homotopic_with_def, clarify) apply (rule_tac x="h \ (\x. (fst x, 1 - snd x))" in exI) @@ -611,12 +572,12 @@ done proposition homotopic_paths_reversepath: - "homotopic_paths s (reversepath p) (reversepath q) \ homotopic_paths s p q" + "homotopic_paths S (reversepath p) (reversepath q) \ homotopic_paths S p q" using homotopic_paths_reversepath_D by force proposition homotopic_paths_join: - "\homotopic_paths s p p'; homotopic_paths s q q'; pathfinish p = pathstart q\ \ homotopic_paths s (p +++ q) (p' +++ q')" + "\homotopic_paths S p p'; homotopic_paths S q q'; pathfinish p = pathstart q\ \ homotopic_paths S (p +++ q) (p' +++ q')" apply (clarsimp simp add: homotopic_paths_def homotopic_with_def) apply (rename_tac k1 k2) apply (rule_tac x="(\y. ((k1 \ Pair (fst y)) +++ (k2 \ Pair (fst y))) (snd y))" in exI) @@ -624,7 +585,7 @@ done proposition homotopic_paths_continuous_image: - "\homotopic_paths s f g; continuous_on s h; h ` s \ t\ \ homotopic_paths t (h \ f) (h \ g)" + "\homotopic_paths S f g; continuous_on S h; h ` S \ t\ \ homotopic_paths t (h \ f) (h \ g)" unfolding homotopic_paths_def by (simp add: homotopic_with_compose_continuous_map_left pathfinish_compose pathstart_compose) @@ -634,8 +595,8 @@ text\<^marker>\tag important\\So taking equivalence classes under homotopy would give the fundamental group\ proposition homotopic_paths_rid: - assumes "path p" "path_image p \ s" - shows "homotopic_paths s (p +++ linepath (pathfinish p) (pathfinish p)) p" + assumes "path p" "path_image p \ S" + shows "homotopic_paths S (p +++ linepath (pathfinish p) (pathfinish p)) p" proof - have \
: "continuous_on {0..1} (\t::real. if t \ 1/2 then 2 *\<^sub>R t else 1)" unfolding split_01 @@ -647,15 +608,15 @@ qed proposition homotopic_paths_lid: - "\path p; path_image p \ s\ \ homotopic_paths s (linepath (pathstart p) (pathstart p) +++ p) p" - using homotopic_paths_rid [of "reversepath p" s] + "\path p; path_image p \ S\ \ homotopic_paths S (linepath (pathstart p) (pathstart p) +++ p) p" + using homotopic_paths_rid [of "reversepath p" S] by (metis homotopic_paths_reversepath path_image_reversepath path_reversepath pathfinish_linepath pathfinish_reversepath reversepath_joinpaths reversepath_linepath) proposition homotopic_paths_assoc: - "\path p; path_image p \ s; path q; path_image q \ s; path r; path_image r \ s; pathfinish p = pathstart q; + "\path p; path_image p \ S; path q; path_image q \ S; path r; path_image r \ S; pathfinish p = pathstart q; pathfinish q = pathstart r\ - \ homotopic_paths s (p +++ (q +++ r)) ((p +++ q) +++ r)" + \ homotopic_paths S (p +++ (q +++ r)) ((p +++ q) +++ r)" apply (subst homotopic_paths_sym) apply (rule homotopic_paths_reparametrize [where f = "\t. if t \ 1/2 then inverse 2 *\<^sub>R t @@ -666,8 +627,8 @@ done proposition homotopic_paths_rinv: - assumes "path p" "path_image p \ s" - shows "homotopic_paths s (p +++ reversepath p) (linepath (pathstart p) (pathstart p))" + assumes "path p" "path_image p \ S" + shows "homotopic_paths S (p +++ reversepath p) (linepath (pathstart p) (pathstart p))" proof - have p: "continuous_on {0..1} p" using assms by (auto simp: path_def) @@ -690,67 +651,67 @@ qed proposition homotopic_paths_linv: - assumes "path p" "path_image p \ s" - shows "homotopic_paths s (reversepath p +++ p) (linepath (pathfinish p) (pathfinish p))" - using homotopic_paths_rinv [of "reversepath p" s] assms by simp + assumes "path p" "path_image p \ S" + shows "homotopic_paths S (reversepath p +++ p) (linepath (pathfinish p) (pathfinish p))" + using homotopic_paths_rinv [of "reversepath p" S] assms by simp subsection\Homotopy of loops without requiring preservation of endpoints\ definition\<^marker>\tag important\ homotopic_loops :: "'a::topological_space set \ (real \ 'a) \ (real \ 'a) \ bool" where - "homotopic_loops s p q \ - homotopic_with_canon (\r. pathfinish r = pathstart r) {0..1} s p q" + "homotopic_loops S p q \ + homotopic_with_canon (\r. pathfinish r = pathstart r) {0..1} S p q" lemma homotopic_loops: - "homotopic_loops s p q \ + "homotopic_loops S p q \ (\h. continuous_on ({0..1::real} \ {0..1}) h \ - image h ({0..1} \ {0..1}) \ s \ + image h ({0..1} \ {0..1}) \ S \ (\x \ {0..1}. h(0,x) = p x) \ (\x \ {0..1}. h(1,x) = q x) \ (\t \ {0..1}. pathfinish(h \ Pair t) = pathstart(h \ Pair t)))" by (simp add: homotopic_loops_def pathstart_def pathfinish_def homotopic_with) proposition homotopic_loops_imp_loop: - "homotopic_loops s p q \ pathfinish p = pathstart p \ pathfinish q = pathstart q" + "homotopic_loops S p q \ pathfinish p = pathstart p \ pathfinish q = pathstart q" using homotopic_with_imp_property homotopic_loops_def by blast proposition homotopic_loops_imp_path: - "homotopic_loops s p q \ path p \ path q" + "homotopic_loops S p q \ path p \ path q" unfolding homotopic_loops_def path_def using homotopic_with_imp_continuous_maps continuous_map_subtopology_eu by blast proposition homotopic_loops_imp_subset: - "homotopic_loops s p q \ path_image p \ s \ path_image q \ s" + "homotopic_loops S p q \ path_image p \ S \ path_image q \ S" unfolding homotopic_loops_def path_image_def by (meson continuous_map_subtopology_eu homotopic_with_imp_continuous_maps) proposition homotopic_loops_refl: - "homotopic_loops s p p \ - path p \ path_image p \ s \ pathfinish p = pathstart p" + "homotopic_loops S p p \ + path p \ path_image p \ S \ pathfinish p = pathstart p" by (simp add: homotopic_loops_def path_image_def path_def) -proposition homotopic_loops_sym: "homotopic_loops s p q \ homotopic_loops s q p" +proposition homotopic_loops_sym: "homotopic_loops S p q \ homotopic_loops S q p" by (simp add: homotopic_loops_def homotopic_with_sym) -proposition homotopic_loops_sym_eq: "homotopic_loops s p q \ homotopic_loops s q p" +proposition homotopic_loops_sym_eq: "homotopic_loops S p q \ homotopic_loops S q p" by (metis homotopic_loops_sym) proposition homotopic_loops_trans: - "\homotopic_loops s p q; homotopic_loops s q r\ \ homotopic_loops s p r" + "\homotopic_loops S p q; homotopic_loops S q r\ \ homotopic_loops S p r" unfolding homotopic_loops_def by (blast intro: homotopic_with_trans) proposition homotopic_loops_subset: - "\homotopic_loops s p q; s \ t\ \ homotopic_loops t p q" + "\homotopic_loops S p q; S \ t\ \ homotopic_loops t p q" by (fastforce simp add: homotopic_loops) proposition homotopic_loops_eq: - "\path p; path_image p \ s; pathfinish p = pathstart p; \t. t \ {0..1} \ p(t) = q(t)\ - \ homotopic_loops s p q" + "\path p; path_image p \ S; pathfinish p = pathstart p; \t. t \ {0..1} \ p(t) = q(t)\ + \ homotopic_loops S p q" unfolding homotopic_loops_def path_image_def path_def pathstart_def pathfinish_def by (auto intro: homotopic_with_eq [OF homotopic_with_refl [where f = p, THEN iffD2]]) proposition homotopic_loops_continuous_image: - "\homotopic_loops s f g; continuous_on s h; h ` s \ t\ \ homotopic_loops t (h \ f) (h \ g)" + "\homotopic_loops S f g; continuous_on S h; h ` S \ t\ \ homotopic_loops t (h \ f) (h \ g)" unfolding homotopic_loops_def by (simp add: homotopic_with_compose_continuous_map_left pathfinish_def pathstart_def) @@ -758,21 +719,21 @@ subsection\Relations between the two variants of homotopy\ proposition homotopic_paths_imp_homotopic_loops: - "\homotopic_paths s p q; pathfinish p = pathstart p; pathfinish q = pathstart p\ \ homotopic_loops s p q" + "\homotopic_paths S p q; pathfinish p = pathstart p; pathfinish q = pathstart p\ \ homotopic_loops S p q" by (auto simp: homotopic_with_def homotopic_paths_def homotopic_loops_def) proposition homotopic_loops_imp_homotopic_paths_null: - assumes "homotopic_loops s p (linepath a a)" - shows "homotopic_paths s p (linepath (pathstart p) (pathstart p))" + assumes "homotopic_loops S p (linepath a a)" + shows "homotopic_paths S p (linepath (pathstart p) (pathstart p))" proof - have "path p" by (metis assms homotopic_loops_imp_path) have ploop: "pathfinish p = pathstart p" by (metis assms homotopic_loops_imp_loop) - have pip: "path_image p \ s" by (metis assms homotopic_loops_imp_subset) + have pip: "path_image p \ S" by (metis assms homotopic_loops_imp_subset) let ?A = "{0..1::real} \ {0..1::real}" obtain h where conth: "continuous_on ?A h" - and hs: "h ` ?A \ s" - and [simp]: "\x. x \ {0..1} \ h(0,x) = p x" - and [simp]: "\x. x \ {0..1} \ h(1,x) = a" + and hs: "h ` ?A \ S" + and h0[simp]: "\x. x \ {0..1} \ h(0,x) = p x" + and h1[simp]: "\x. x \ {0..1} \ h(1,x) = a" and ends: "\t. t \ {0..1} \ pathfinish (h \ Pair t) = pathstart (h \ Pair t)" using assms by (auto simp: homotopic_loops homotopic_with) have conth0: "path (\u. h (u, 0))" @@ -781,7 +742,7 @@ show "continuous_on ((\x. (x, 0)) ` {0..1}) h" by (force intro: continuous_on_subset [OF conth]) qed (force intro: continuous_intros) - have pih0: "path_image (\u. h (u, 0)) \ s" + have pih0: "path_image (\u. h (u, 0)) \ S" using hs by (force simp: path_image_def) have c1: "continuous_on ?A (\x. h (fst x * snd x, 0))" proof (rule continuous_on_compose [of _ _ h, unfolded o_def]) @@ -801,21 +762,20 @@ with \c \ 1\ show ?thesis by fastforce qed have *: "\p x. \path p \ path(reversepath p); - path_image p \ s \ path_image(reversepath p) \ s; + path_image p \ S \ path_image(reversepath p) \ S; pathfinish p = pathstart(linepath a a +++ reversepath p) \ pathstart(reversepath p) = a \ pathstart p = x\ - \ homotopic_paths s (p +++ linepath a a +++ reversepath p) (linepath x x)" + \ homotopic_paths S (p +++ linepath a a +++ reversepath p) (linepath x x)" by (metis homotopic_paths_lid homotopic_paths_join homotopic_paths_trans homotopic_paths_sym homotopic_paths_rinv) - have 1: "homotopic_paths s p (p +++ linepath (pathfinish p) (pathfinish p))" + have 1: "homotopic_paths S p (p +++ linepath (pathfinish p) (pathfinish p))" using \path p\ homotopic_paths_rid homotopic_paths_sym pip by blast - moreover have "homotopic_paths s (p +++ linepath (pathfinish p) (pathfinish p)) + moreover have "homotopic_paths S (p +++ linepath (pathfinish p) (pathfinish p)) (linepath (pathstart p) (pathstart p) +++ p +++ linepath (pathfinish p) (pathfinish p))" - apply (rule homotopic_paths_sym) - using homotopic_paths_lid [of "p +++ linepath (pathfinish p) (pathfinish p)" s] - by (metis 1 homotopic_paths_imp_path homotopic_paths_imp_pathstart homotopic_paths_imp_subset) + using homotopic_paths_lid [of "p +++ linepath (pathfinish p) (pathfinish p)" S] + by (metis 1 homotopic_paths_imp_path homotopic_paths_imp_subset homotopic_paths_sym pathstart_join) moreover - have "homotopic_paths s (linepath (pathstart p) (pathstart p) +++ p +++ linepath (pathfinish p) (pathfinish p)) + have "homotopic_paths S (linepath (pathstart p) (pathstart p) +++ p +++ linepath (pathfinish p) (pathfinish p)) ((\u. h (u, 0)) +++ linepath a a +++ reversepath (\u. h (u, 0)))" unfolding homotopic_paths_def homotopic_with_def proof (intro exI strip conjI) @@ -823,28 +783,25 @@ +++ subpath (fst y) 0 (\u. h (u, 0))) (snd y)" have "continuous_on ?A ?h" by (intro continuous_on_homotopic_join_lemma; simp add: path_defs joinpaths_def subpath_def conth c1 c2) - moreover have "?h ` ?A \ s" + moreover have "?h ` ?A \ S" unfolding joinpaths_def subpath_def by (force simp: algebra_simps mult_le_one mult_left_le intro: hs [THEN subsetD] adhoc_le) ultimately show "continuous_map (prod_topology (top_of_set {0..1}) (top_of_set {0..1})) - (top_of_set s) ?h" + (top_of_set S) ?h" by (simp add: subpath_reversepath) qed (use ploop in \simp_all add: reversepath_def path_defs joinpaths_def o_def subpath_def conth c1 c2\) - moreover have "homotopic_paths s ((\u. h (u, 0)) +++ linepath a a +++ reversepath (\u. h (u, 0))) + moreover have "homotopic_paths S ((\u. h (u, 0)) +++ linepath a a +++ reversepath (\u. h (u, 0))) (linepath (pathstart p) (pathstart p))" - proof (rule *; simp add: pih0 pathstart_def pathfinish_def conth0) - show "a = (linepath a a +++ reversepath (\u. h (u, 0))) 0 \ reversepath (\u. h (u, 0)) 0 = a" - by (simp_all add: reversepath_def joinpaths_def) - qed + by (rule *; simp add: pih0 pathstart_def pathfinish_def conth0; simp add: reversepath_def joinpaths_def) ultimately show ?thesis by (blast intro: homotopic_paths_trans) qed proposition homotopic_loops_conjugate: - fixes s :: "'a::real_normed_vector set" - assumes "path p" "path q" and pip: "path_image p \ s" and piq: "path_image q \ s" + fixes S :: "'a::real_normed_vector set" + assumes "path p" "path q" and pip: "path_image p \ S" and piq: "path_image q \ S" and pq: "pathfinish p = pathstart q" and qloop: "pathfinish q = pathstart q" - shows "homotopic_loops s (p +++ q +++ reversepath p) q" + shows "homotopic_loops S (p +++ q +++ reversepath p) q" proof - have contp: "continuous_on {0..1} p" using \path p\ [unfolded path_def] by blast have contq: "continuous_on {0..1} q" using \path q\ [unfolded path_def] by blast @@ -860,18 +817,18 @@ by (auto intro: continuous_on_subset [OF contp] simp: algebra_simps add_increasing2 mult_left_le_one_le) qed (force intro: continuous_intros) - have ps1: "\a b. \b * 2 \ 1; 0 \ b; 0 \ a; a \ 1\ \ p ((1 - a) * (2 * b) + a) \ s" + have ps1: "\a b. \b * 2 \ 1; 0 \ b; 0 \ a; a \ 1\ \ p ((1 - a) * (2 * b) + a) \ S" using sum_le_prod1 by (force simp: algebra_simps add_increasing2 mult_left_le intro: pip [unfolded path_image_def, THEN subsetD]) - have ps2: "\a b. \\ 4 * b \ 3; b \ 1; 0 \ a; a \ 1\ \ p ((a - 1) * (4 * b - 3) + 1) \ s" + have ps2: "\a b. \\ 4 * b \ 3; b \ 1; 0 \ a; a \ 1\ \ p ((a - 1) * (4 * b - 3) + 1) \ S" apply (rule pip [unfolded path_image_def, THEN subsetD]) apply (rule image_eqI, blast) apply (simp add: algebra_simps) - by (metis add_mono_thms_linordered_semiring(1) affine_ineq linear mult.commute mult.left_neutral mult_right_mono + by (metis add_mono affine_ineq linear mult.commute mult.left_neutral mult_right_mono add.commute zero_le_numeral) - have qs: "\a b. \4 * b \ 3; \ b * 2 \ 1\ \ q (4 * b - 2) \ s" + have qs: "\a b. \4 * b \ 3; \ b * 2 \ 1\ \ q (4 * b - 2) \ S" using path_image_def piq by fastforce - have "homotopic_loops s (p +++ q +++ reversepath p) + have "homotopic_loops S (p +++ q +++ reversepath p) (linepath (pathstart q) (pathstart q) +++ q +++ linepath (pathstart q) (pathstart q))" unfolding homotopic_loops_def homotopic_with_def proof (intro exI strip conjI) @@ -881,25 +838,20 @@ then have "continuous_on ?A ?h" using pq qloop by (intro continuous_on_homotopic_join_lemma) (auto simp: path_defs joinpaths_def subpath_def c1 c2) - then show "continuous_map (prod_topology (top_of_set {0..1}) (top_of_set {0..1})) (top_of_set s) ?h" + then show "continuous_map (prod_topology (top_of_set {0..1}) (top_of_set {0..1})) (top_of_set S) ?h" by (auto simp: joinpaths_def subpath_def ps1 ps2 qs) show "?h (1,x) = (linepath (pathstart q) (pathstart q) +++ q +++ linepath (pathstart q) (pathstart q)) x" for x using pq by (simp add: pathfinish_def subpath_refl) qed (auto simp: subpath_reversepath) - moreover have "homotopic_loops s (linepath (pathstart q) (pathstart q) +++ q +++ linepath (pathstart q) (pathstart q)) q" + moreover have "homotopic_loops S (linepath (pathstart q) (pathstart q) +++ q +++ linepath (pathstart q) (pathstart q)) q" proof - - have "homotopic_paths s (linepath (pathfinish q) (pathfinish q) +++ q) q" + have "homotopic_paths S (linepath (pathfinish q) (pathfinish q) +++ q) q" using \path q\ homotopic_paths_lid qloop piq by auto - hence 1: "\f. homotopic_paths s f q \ \ homotopic_paths s f (linepath (pathfinish q) (pathfinish q) +++ q)" + hence 1: "\f. homotopic_paths S f q \ \ homotopic_paths S f (linepath (pathfinish q) (pathfinish q) +++ q)" using homotopic_paths_trans by blast - hence "homotopic_paths s (linepath (pathfinish q) (pathfinish q) +++ q +++ linepath (pathfinish q) (pathfinish q)) q" - proof - - have "homotopic_paths s (q +++ linepath (pathfinish q) (pathfinish q)) q" - by (simp add: \path q\ homotopic_paths_rid piq) - thus ?thesis - by (metis (no_types) 1 \path q\ homotopic_paths_join homotopic_paths_rinv homotopic_paths_sym - homotopic_paths_trans qloop pathfinish_linepath piq) - qed + hence "homotopic_paths S (linepath (pathfinish q) (pathfinish q) +++ q +++ linepath (pathfinish q) (pathfinish q)) q" + by (smt (verit, best) \path q\ homotopic_paths_imp_path homotopic_paths_imp_subset homotopic_paths_lid + homotopic_paths_rid homotopic_paths_trans pathstart_join piq qloop) thus ?thesis by (metis (no_types) qloop homotopic_loops_sym homotopic_paths_imp_homotopic_loops homotopic_paths_imp_pathfinish homotopic_paths_sym) qed @@ -918,9 +870,9 @@ show ?thesis proof (cases "pathfinish p = pathfinish q") case True - have pipq: "path_image p \ S" "path_image q \ S" + obtain pipq: "path_image p \ S" "path_image q \ S" by (metis Un_subset_iff paths \path p\ \path q\ homotopic_loops_imp_subset homotopic_paths_imp_path loops - path_image_join path_image_reversepath path_imp_reversepath path_join_eq)+ + path_image_join path_image_reversepath path_imp_reversepath path_join_eq) have "homotopic_paths S p (p +++ (linepath (pathfinish p) (pathfinish p)))" using \path p\ \path_image p \ S\ homotopic_paths_rid homotopic_paths_sym by blast moreover have "homotopic_paths S (p +++ (linepath (pathfinish p) (pathfinish p))) (p +++ (reversepath q +++ q))" @@ -929,10 +881,8 @@ by (simp add: True \path p\ \path q\ homotopic_paths_assoc pipq) moreover have "homotopic_paths S ((p +++ reversepath q) +++ q) (linepath (pathstart p) (pathstart p) +++ q)" by (simp add: \path q\ homotopic_paths_join paths pipq) - moreover then have "homotopic_paths S (linepath (pathstart p) (pathstart p) +++ q) q" - by (metis \path q\ homotopic_paths_imp_path homotopic_paths_lid linepath_trivial path_join_path_ends pathfinish_def pipq(2)) ultimately show ?thesis - using homotopic_paths_trans by metis + by (metis \path q\ homotopic_paths_imp_path homotopic_paths_lid homotopic_paths_trans path_join_path_ends pathfinish_linepath pipq(2)) next case False then show ?thesis @@ -981,19 +931,13 @@ assumes \
: "path g" "path h" "pathstart h = pathstart g" "pathfinish h = pathfinish g" and no: "\t x. \t \ {0..1}; x \ S\ \ norm(h t - g t) < norm(g t - x)" shows "homotopic_paths S g h" -proof (rule homotopic_paths_linear [OF \
]) - show "\t. t \ {0..1} \ closed_segment (g t) (h t) \ S" - by (metis no segment_bound(1) subsetI norm_minus_commute not_le) -qed + using homotopic_paths_linear [OF \
] by (metis linorder_not_le no norm_minus_commute segment_bound1 subsetI) lemma homotopic_loops_nearby_explicit: assumes \
: "path g" "path h" "pathfinish g = pathstart g" "pathfinish h = pathstart h" and no: "\t x. \t \ {0..1}; x \ S\ \ norm(h t - g t) < norm(g t - x)" shows "homotopic_loops S g h" -proof (rule homotopic_loops_linear [OF \
]) - show "\t. t \ {0..1} \ closed_segment (g t) (h t) \ S" - by (metis no segment_bound(1) subsetI norm_minus_commute not_le) -qed + using homotopic_loops_linear [OF \
] by (metis linorder_not_le no norm_minus_commute segment_bound1 subsetI) lemma homotopic_nearby_paths: fixes g h :: "real \ 'a::euclidean_space" @@ -1028,9 +972,9 @@ subsection\ Homotopy and subpaths\ lemma homotopic_join_subpaths1: - assumes "path g" and pag: "path_image g \ s" + assumes "path g" and pag: "path_image g \ S" and u: "u \ {0..1}" and v: "v \ {0..1}" and w: "w \ {0..1}" "u \ v" "v \ w" - shows "homotopic_paths s (subpath u v g +++ subpath v w g) (subpath u w g)" + shows "homotopic_paths S (subpath u v g +++ subpath v w g) (subpath u w g)" proof - have 1: "t * 2 \ 1 \ u + t * (v * 2) \ v + t * (u * 2)" for t using affine_ineq \u \ v\ by fastforce @@ -1068,51 +1012,44 @@ qed lemma homotopic_join_subpaths2: - assumes "homotopic_paths s (subpath u v g +++ subpath v w g) (subpath u w g)" - shows "homotopic_paths s (subpath w v g +++ subpath v u g) (subpath w u g)" -by (metis assms homotopic_paths_reversepath_D pathfinish_subpath pathstart_subpath reversepath_joinpaths reversepath_subpath) + assumes "homotopic_paths S (subpath u v g +++ subpath v w g) (subpath u w g)" + shows "homotopic_paths S (subpath w v g +++ subpath v u g) (subpath w u g)" + by (metis assms homotopic_paths_reversepath_D pathfinish_subpath pathstart_subpath reversepath_joinpaths reversepath_subpath) lemma homotopic_join_subpaths3: - assumes hom: "homotopic_paths s (subpath u v g +++ subpath v w g) (subpath u w g)" - and "path g" and pag: "path_image g \ s" + assumes hom: "homotopic_paths S (subpath u v g +++ subpath v w g) (subpath u w g)" + and "path g" and pag: "path_image g \ S" and u: "u \ {0..1}" and v: "v \ {0..1}" and w: "w \ {0..1}" - shows "homotopic_paths s (subpath v w g +++ subpath w u g) (subpath v u g)" + shows "homotopic_paths S (subpath v w g +++ subpath w u g) (subpath v u g)" proof - - have "homotopic_paths s (subpath u w g +++ subpath w v g) ((subpath u v g +++ subpath v w g) +++ subpath w v g)" - proof (rule homotopic_paths_join) - show "homotopic_paths s (subpath u w g) (subpath u v g +++ subpath v w g)" - using hom homotopic_paths_sym_eq by blast - show "homotopic_paths s (subpath w v g) (subpath w v g)" - by (metis \path g\ homotopic_paths_eq pag path_image_subpath_subset path_subpath subset_trans v w) - qed auto - also have "homotopic_paths s ((subpath u v g +++ subpath v w g) +++ subpath w v g) (subpath u v g +++ subpath v w g +++ subpath w v g)" - by (rule homotopic_paths_sym [OF homotopic_paths_assoc]) - (use assms in \simp_all add: path_image_subpath_subset [THEN order_trans]\) - also have "homotopic_paths s (subpath u v g +++ subpath v w g +++ subpath w v g) + obtain wvg: "path (subpath w v g)" "path_image (subpath w v g) \ S" + and wug: "path (subpath w u g)" "path_image (subpath w u g) \ S" + and vug: "path (subpath v u g)" "path_image (subpath v u g) \ S" + by (meson \path g\ pag path_image_subpath_subset path_subpath subset_trans u v w) + have "homotopic_paths S (subpath u w g +++ subpath w v g) + ((subpath u v g +++ subpath v w g) +++ subpath w v g)" + by (simp add: hom homotopic_paths_join homotopic_paths_sym wvg) + also have "homotopic_paths S ((subpath u v g +++ subpath v w g) +++ subpath w v g) + (subpath u v g +++ subpath v w g +++ subpath w v g)" + using wvg vug \path g\ + by (metis homotopic_paths_assoc homotopic_paths_sym path_image_subpath_commute path_subpath + pathfinish_subpath pathstart_subpath u v w) + also have "homotopic_paths S (subpath u v g +++ subpath v w g +++ subpath w v g) (subpath u v g +++ linepath (pathfinish (subpath u v g)) (pathfinish (subpath u v g)))" - proof (rule homotopic_paths_join; simp) - show "path (subpath u v g) \ path_image (subpath u v g) \ s" - by (metis \path g\ order.trans pag path_image_subpath_subset path_subpath u v) - show "homotopic_paths s (subpath v w g +++ subpath w v g) (linepath (g v) (g v))" - by (metis (no_types, lifting) \path g\ homotopic_paths_linv order_trans pag path_image_subpath_subset path_subpath pathfinish_subpath reversepath_subpath v w) - qed - also have "homotopic_paths s (subpath u v g +++ linepath (pathfinish (subpath u v g)) (pathfinish (subpath u v g))) (subpath u v g)" - proof (rule homotopic_paths_rid) - show "path (subpath u v g)" - using \path g\ path_subpath u v by blast - show "path_image (subpath u v g) \ s" - by (meson \path g\ order.trans pag path_image_subpath_subset u v) - qed - finally have "homotopic_paths s (subpath u w g +++ subpath w v g) (subpath u v g)" . + using wvg vug \path g\ + by (metis homotopic_paths_join homotopic_paths_linv homotopic_paths_refl path_image_subpath_commute + path_subpath pathfinish_subpath pathstart_join pathstart_subpath reversepath_subpath u v) + also have "homotopic_paths S (subpath u v g +++ linepath (pathfinish (subpath u v g)) (pathfinish (subpath u v g))) (subpath u v g)" + using vug \path g\ by (metis homotopic_paths_rid path_image_subpath_commute path_subpath u v) + finally have "homotopic_paths S (subpath u w g +++ subpath w v g) (subpath u v g)" . then show ?thesis using homotopic_join_subpaths2 by blast qed proposition homotopic_join_subpaths: - "\path g; path_image g \ s; u \ {0..1}; v \ {0..1}; w \ {0..1}\ - \ homotopic_paths s (subpath u v g +++ subpath v w g) (subpath u w g)" - using le_cases3 [of u v w] homotopic_join_subpaths1 homotopic_join_subpaths2 homotopic_join_subpaths3 - by metis + "\path g; path_image g \ S; u \ {0..1}; v \ {0..1}; w \ {0..1}\ + \ homotopic_paths S (subpath u v g +++ subpath v w g) (subpath u w g)" + by (smt (verit, del_insts) homotopic_join_subpaths1 homotopic_join_subpaths2 homotopic_join_subpaths3) text\Relating homotopy of trivial loops to path-connectedness.\ @@ -1929,11 +1866,11 @@ subsection\Basic properties of local compactness\ proposition locally_compact: - fixes s :: "'a :: metric_space set" + fixes S :: "'a :: metric_space set" shows - "locally compact s \ - (\x \ s. \u v. x \ u \ u \ v \ v \ s \ - openin (top_of_set s) u \ compact v)" + "locally compact S \ + (\x \ S. \u v. x \ u \ u \ v \ v \ S \ + openin (top_of_set S) u \ compact v)" (is "?lhs = ?rhs") proof assume ?lhs @@ -1942,16 +1879,16 @@ next assume r [rule_format]: ?rhs have *: "\u v. - openin (top_of_set s) u \ - compact v \ x \ u \ u \ v \ v \ s \ T" - if "open T" "x \ s" "x \ T" for x T + openin (top_of_set S) u \ + compact v \ x \ u \ u \ v \ v \ S \ T" + if "open T" "x \ S" "x \ T" for x T proof - - obtain u v where uv: "x \ u" "u \ v" "v \ s" "compact v" "openin (top_of_set s) u" - using r [OF \x \ s\] by auto + obtain u v where uv: "x \ u" "u \ v" "v \ S" "compact v" "openin (top_of_set S) u" + using r [OF \x \ S\] by auto obtain e where "e>0" and e: "cball x e \ T" using open_contains_cball \open T\ \x \ T\ by blast show ?thesis - apply (rule_tac x="(s \ ball x e) \ u" in exI) + apply (rule_tac x="(S \ ball x e) \ u" in exI) apply (rule_tac x="cball x e \ v" in exI) using that \e > 0\ e uv apply auto @@ -3315,39 +3252,39 @@ subsection\Retracts, in a general sense, preserve (co)homotopic triviality)\ locale\<^marker>\tag important\ Retracts = - fixes s h t k - assumes conth: "continuous_on s h" - and imh: "h ` s = t" + fixes S h t k + assumes conth: "continuous_on S h" + and imh: "h ` S = t" and contk: "continuous_on t k" - and imk: "k ` t \ s" + and imk: "k ` t \ S" and idhk: "\y. y \ t \ h(k y) = y" begin lemma homotopically_trivial_retraction_gen: assumes P: "\f. \continuous_on U f; f ` U \ t; Q f\ \ P(k \ f)" - and Q: "\f. \continuous_on U f; f ` U \ s; P f\ \ Q(h \ f)" + and Q: "\f. \continuous_on U f; f ` U \ S; P f\ \ Q(h \ f)" and Qeq: "\h k. (\x. x \ U \ h x = k x) \ Q h = Q k" - and hom: "\f g. \continuous_on U f; f ` U \ s; P f; - continuous_on U g; g ` U \ s; P g\ - \ homotopic_with_canon P U s f g" + and hom: "\f g. \continuous_on U f; f ` U \ S; P f; + continuous_on U g; g ` U \ S; P g\ + \ homotopic_with_canon P U S f g" and contf: "continuous_on U f" and imf: "f ` U \ t" and Qf: "Q f" and contg: "continuous_on U g" and img: "g ` U \ t" and Qg: "Q g" shows "homotopic_with_canon Q U t f g" proof - have "continuous_on U (k \ f)" using contf continuous_on_compose continuous_on_subset contk imf by blast - moreover have "(k \ f) ` U \ s" + moreover have "(k \ f) ` U \ S" using imf imk by fastforce moreover have "P (k \ f)" by (simp add: P Qf contf imf) moreover have "continuous_on U (k \ g)" using contg continuous_on_compose continuous_on_subset contk img by blast - moreover have "(k \ g) ` U \ s" + moreover have "(k \ g) ` U \ S" using img imk by fastforce moreover have "P (k \ g)" by (simp add: P Qg contg img) - ultimately have "homotopic_with_canon P U s (k \ f) (k \ g)" + ultimately have "homotopic_with_canon P U S (k \ f) (k \ g)" by (rule hom) then have "homotopic_with_canon Q U t (h \ (k \ f)) (h \ (k \ g))" apply (rule homotopic_with_compose_continuous_left [OF homotopic_with_mono]) @@ -3363,21 +3300,21 @@ lemma homotopically_trivial_retraction_null_gen: assumes P: "\f. \continuous_on U f; f ` U \ t; Q f\ \ P(k \ f)" - and Q: "\f. \continuous_on U f; f ` U \ s; P f\ \ Q(h \ f)" + and Q: "\f. \continuous_on U f; f ` U \ S; P f\ \ Q(h \ f)" and Qeq: "\h k. (\x. x \ U \ h x = k x) \ Q h = Q k" - and hom: "\f. \continuous_on U f; f ` U \ s; P f\ - \ \c. homotopic_with_canon P U s f (\x. c)" + and hom: "\f. \continuous_on U f; f ` U \ S; P f\ + \ \c. homotopic_with_canon P U S f (\x. c)" and contf: "continuous_on U f" and imf:"f ` U \ t" and Qf: "Q f" obtains c where "homotopic_with_canon Q U t f (\x. c)" proof - have feq: "\x. x \ U \ (h \ (k \ f)) x = f x" using idhk imf by auto have "continuous_on U (k \ f)" using contf continuous_on_compose continuous_on_subset contk imf by blast - moreover have "(k \ f) ` U \ s" + moreover have "(k \ f) ` U \ S" using imf imk by fastforce moreover have "P (k \ f)" by (simp add: P Qf contf imf) - ultimately obtain c where "homotopic_with_canon P U s (k \ f) (\x. c)" + ultimately obtain c where "homotopic_with_canon P U S (k \ f) (\x. c)" by (metis hom) then have "homotopic_with_canon Q U t (h \ (k \ f)) (h \ (\x. c))" apply (rule homotopic_with_compose_continuous_left [OF homotopic_with_mono]) @@ -3395,30 +3332,30 @@ lemma cohomotopically_trivial_retraction_gen: assumes P: "\f. \continuous_on t f; f ` t \ U; Q f\ \ P(f \ h)" - and Q: "\f. \continuous_on s f; f ` s \ U; P f\ \ Q(f \ k)" + and Q: "\f. \continuous_on S f; f ` S \ U; P f\ \ Q(f \ k)" and Qeq: "\h k. (\x. x \ t \ h x = k x) \ Q h = Q k" - and hom: "\f g. \continuous_on s f; f ` s \ U; P f; - continuous_on s g; g ` s \ U; P g\ - \ homotopic_with_canon P s U f g" + and hom: "\f g. \continuous_on S f; f ` S \ U; P f; + continuous_on S g; g ` S \ U; P g\ + \ homotopic_with_canon P S U f g" and contf: "continuous_on t f" and imf: "f ` t \ U" and Qf: "Q f" and contg: "continuous_on t g" and img: "g ` t \ U" and Qg: "Q g" shows "homotopic_with_canon Q t U f g" proof - have feq: "\x. x \ t \ (f \ h \ k) x = f x" using idhk imf by auto have geq: "\x. x \ t \ (g \ h \ k) x = g x" using idhk img by auto - have "continuous_on s (f \ h)" + have "continuous_on S (f \ h)" using contf conth continuous_on_compose imh by blast - moreover have "(f \ h) ` s \ U" + moreover have "(f \ h) ` S \ U" using imf imh by fastforce moreover have "P (f \ h)" by (simp add: P Qf contf imf) - moreover have "continuous_on s (g \ h)" + moreover have "continuous_on S (g \ h)" using contg continuous_on_compose continuous_on_subset conth imh by blast - moreover have "(g \ h) ` s \ U" + moreover have "(g \ h) ` S \ U" using img imh by fastforce moreover have "P (g \ h)" by (simp add: P Qg contg img) - ultimately have "homotopic_with_canon P s U (f \ h) (g \ h)" + ultimately have "homotopic_with_canon P S U (f \ h) (g \ h)" by (rule hom) then have "homotopic_with_canon Q t U (f \ h \ k) (g \ h \ k)" apply (rule homotopic_with_compose_continuous_right [OF homotopic_with_mono]) @@ -3433,25 +3370,25 @@ lemma cohomotopically_trivial_retraction_null_gen: assumes P: "\f. \continuous_on t f; f ` t \ U; Q f\ \ P(f \ h)" - and Q: "\f. \continuous_on s f; f ` s \ U; P f\ \ Q(f \ k)" + and Q: "\f. \continuous_on S f; f ` S \ U; P f\ \ Q(f \ k)" and Qeq: "\h k. (\x. x \ t \ h x = k x) \ Q h = Q k" - and hom: "\f g. \continuous_on s f; f ` s \ U; P f\ - \ \c. homotopic_with_canon P s U f (\x. c)" + and hom: "\f g. \continuous_on S f; f ` S \ U; P f\ + \ \c. homotopic_with_canon P S U f (\x. c)" and contf: "continuous_on t f" and imf: "f ` t \ U" and Qf: "Q f" obtains c where "homotopic_with_canon Q t U f (\x. c)" proof - have feq: "\x. x \ t \ (f \ h \ k) x = f x" using idhk imf by auto - have "continuous_on s (f \ h)" + have "continuous_on S (f \ h)" using contf conth continuous_on_compose imh by blast - moreover have "(f \ h) ` s \ U" + moreover have "(f \ h) ` S \ U" using imf imh by fastforce moreover have "P (f \ h)" by (simp add: P Qf contf imf) - ultimately obtain c where "homotopic_with_canon P s U (f \ h) (\x. c)" + ultimately obtain c where "homotopic_with_canon P S U (f \ h) (\x. c)" by (metis hom) then have \
: "homotopic_with_canon Q t U (f \ h \ k) ((\x. c) \ k)" proof (rule homotopic_with_compose_continuous_right [OF homotopic_with_mono]) - show "\h. \continuous_map (top_of_set s) (top_of_set U) h; P h\ \ Q (h \ k)" + show "\h. \continuous_map (top_of_set S) (top_of_set U) h; P h\ \ Q (h \ k)" using Q by auto qed (auto simp: contk imk) moreover have "homotopic_with_canon Q t U f (\x. c)" @@ -3549,7 +3486,7 @@ qed lemma deformation_retraction_imp_homotopy_equivalent_space: - "\homotopic_with (\x. True) X X (s \ r) id; retraction_maps X Y r s\ + "\homotopic_with (\x. True) X X (S \ r) id; retraction_maps X Y r S\ \ X homotopy_equivalent_space Y" unfolding homotopy_equivalent_space_def retraction_maps_def using homotopic_with_id2 by fastforce