# HG changeset patch # User paulson # Date 1553258089 0 # Node ID 35ba13ac6e5c5c47074291a4350db162a909b257 # Parent ab8aad4aa76e11e15da6b17a10de5e0cfa93eefc New abstract topological material diff -r ab8aad4aa76e -r 35ba13ac6e5c src/HOL/Analysis/Abstract_Topology.thy --- a/src/HOL/Analysis/Abstract_Topology.thy Thu Mar 21 19:46:26 2019 +0100 +++ b/src/HOL/Analysis/Abstract_Topology.thy Fri Mar 22 12:34:49 2019 +0000 @@ -2761,6 +2761,11 @@ definition connectedin :: "'a topology \ 'a set \ bool" where "connectedin X S \ S \ topspace X \ connected_space (subtopology X S)" +lemma connected_spaceD: + "\connected_space X; + openin X U; openin X V; topspace X \ U \ V; U \ V = {}; U \ {}; V \ {}\ \ False" + by (auto simp: connected_space_def) + lemma connectedin_subset_topspace: "connectedin X S \ S \ topspace X" by (simp add: connectedin_def) diff -r ab8aad4aa76e -r 35ba13ac6e5c src/HOL/Analysis/Analysis.thy --- a/src/HOL/Analysis/Analysis.thy Thu Mar 21 19:46:26 2019 +0100 +++ b/src/HOL/Analysis/Analysis.thy Fri Mar 22 12:34:49 2019 +0000 @@ -6,6 +6,7 @@ (* Topology *) Connected Abstract_Limits + Locally (* Functional Analysis *) Elementary_Normed_Spaces Norm_Arith diff -r ab8aad4aa76e -r 35ba13ac6e5c src/HOL/Analysis/Brouwer_Fixpoint.thy --- a/src/HOL/Analysis/Brouwer_Fixpoint.thy Thu Mar 21 19:46:26 2019 +0100 +++ b/src/HOL/Analysis/Brouwer_Fixpoint.thy Fri Mar 22 12:34:49 2019 +0000 @@ -84,7 +84,7 @@ done qed -lemma retraction_imp_quotient_map: +lemma retraction_openin_vimage_iff: "openin (top_of_set S) (S \ r -` U) \ openin (top_of_set T) U" if retraction: "retraction S T r" and "U \ T" using retraction apply (rule retractionE) @@ -110,13 +110,13 @@ assumes "locally connected T" "S retract_of T" shows "locally connected S" using assms - by (auto simp: idempotent_imp_retraction intro!: retraction_imp_quotient_map elim!: locally_connected_quotient_image retract_ofE) + by (auto simp: idempotent_imp_retraction intro!: retraction_openin_vimage_iff elim!: locally_connected_quotient_image retract_ofE) lemma retract_of_locally_path_connected: assumes "locally path_connected T" "S retract_of T" shows "locally path_connected S" using assms - by (auto simp: idempotent_imp_retraction intro!: retraction_imp_quotient_map elim!: locally_path_connected_quotient_image retract_ofE) + by (auto simp: idempotent_imp_retraction intro!: retraction_openin_vimage_iff elim!: locally_path_connected_quotient_image retract_ofE) text \A few simple lemmas about deformation retracts\ diff -r ab8aad4aa76e -r 35ba13ac6e5c src/HOL/Analysis/Function_Topology.thy --- a/src/HOL/Analysis/Function_Topology.thy Thu Mar 21 19:46:26 2019 +0100 +++ b/src/HOL/Analysis/Function_Topology.thy Fri Mar 22 12:34:49 2019 +0000 @@ -3,7 +3,7 @@ *) theory Function_Topology -imports Topology_Euclidean_Space +imports Topology_Euclidean_Space Abstract_Limits begin @@ -1480,6 +1480,8 @@ "k \ I \ continuous_map (product_topology X I) (X k) (\x. x k)" using continuous_map_componentwise [of "product_topology X I" X I id] by simp +declare continuous_map_from_subtopology [OF continuous_map_product_projection, continuous_intros] + proposition open_map_product_projection: assumes "i \ I" shows "open_map (product_topology Y I) (Y i) (\f. f i)" @@ -1752,4 +1754,245 @@ apply (auto simp: image_iff inj_on_def) done +subsection\Relationship with connected spaces, paths, etc.\ + +proposition connected_space_product_topology: + "connected_space(product_topology X I) \ + (\\<^sub>E i\I. topspace (X i)) = {} \ (\i \ I. connected_space(X i))" + (is "?lhs \ ?eq \ ?rhs") +proof (cases ?eq) + case False + moreover have "?lhs = ?rhs" + proof + assume ?lhs + moreover + have "connectedin(X i) (topspace(X i))" + if "i \ I" and ci: "connectedin(product_topology X I) (topspace(product_topology X I))" for i + proof - + have cm: "continuous_map (product_topology X I) (X i) (\f. f i)" + by (simp add: \i \ I\ continuous_map_product_projection) + show ?thesis + using connectedin_continuous_map_image [OF cm ci] \i \ I\ + by (simp add: False image_projection_PiE) + qed + ultimately show ?rhs + by (meson connectedin_topspace) + next + assume cs [rule_format]: ?rhs + have False + if disj: "U \ V = {}" and subUV: "(\\<^sub>E i\I. topspace (X i)) \ U \ V" + and U: "openin (product_topology X I) U" + and V: "openin (product_topology X I) V" + and "U \ {}" "V \ {}" + for U V + proof - + obtain f where "f \ U" + using \U \ {}\ by blast + then have f: "f \ (\\<^sub>E i\I. topspace (X i))" + using U openin_subset by fastforce + have "U \ topspace(product_topology X I)" "V \ topspace(product_topology X I)" + using U V openin_subset by blast+ + moreover have "(\\<^sub>E i\I. topspace (X i)) \ U" + proof - + obtain C where "(finite intersection_of (\F. \i U. F = {x. x i \ U} \ i \ I \ openin (X i) U) relative_to + (\\<^sub>E i\I. topspace (X i))) C" "C \ U" "f \ C" + using U \f \ U\ unfolding openin_product_topology union_of_def by auto + then obtain \ where "finite \" + and t: "\C. C \ \ \ \i u. (i \ I \ openin (X i) u) \ C = {x. x i \ u}" + and subU: "topspace (product_topology X I) \ \\ \ U" + and ftop: "f \ topspace (product_topology X I)" + and fint: "f \ \ \" + by (fastforce simp: relative_to_def intersection_of_def subset_iff) + let ?L = "\C\\. {i. (\x. x i) ` C \ topspace (X i)}" + obtain L where "finite L" + and L: "\i U. \i \ I; openin (X i) U; U \ topspace(X i); {x. x i \ U} \ \\ \ i \ L" + proof + show "finite ?L" + proof (rule finite_Union) + fix M + assume "M \ (\C. {i. (\x. x i) ` C \ topspace (X i)}) ` \" + then obtain C where "C \ \" and C: "M = {i. (\x. x i) ` C \ topspace (X i)}" + by blast + then obtain j V where "j \ I" and ope: "openin (X j) V" and Ceq: "C = {x. x j \ V}" + using t by meson + then have "f j \ V" + using \C \ \\ fint by force + then have "(\x. x k) ` {x. x j \ V} = UNIV" if "k \ j" for k + using that + apply (clarsimp simp add: set_eq_iff) + apply (rule_tac x="\m. if m = k then x else f m" in image_eqI, auto) + done + then have "{i. (\x. x i) ` C \ topspace (X i)} \ {j}" + using Ceq by auto + then show "finite M" + using C finite_subset by fastforce + qed (use \finite \\ in blast) + next + fix i U + assume "i \ I" and ope: "openin (X i) U" and psub: "U \ topspace (X i)" and int: "{x. x i \ U} \ \" + then show "i \ ?L" + by (rule_tac a="{x. x i \ U}" in UN_I) (force+) + qed + show ?thesis + proof + fix h + assume h: "h \ (\\<^sub>E i\I. topspace (X i))" + define g where "g \ \i. if i \ L then f i else h i" + have gin: "g \ (\\<^sub>E i\I. topspace (X i))" + unfolding g_def using f h by auto + moreover have "g \ X" if "X \ \" for X + using fint openin_subset t [OF that] L g_def h that by fastforce + ultimately have "g \ U" + using subU by auto + have "h \ U" if "finite M" "h \ PiE I (topspace \ X)" "{i \ I. h i \ g i} \ M" for M h + using that + proof (induction arbitrary: h) + case empty + then show ?case + using PiE_ext \g \ U\ gin by force + next + case (insert i M) + define f where "f \ \j. if j = i then g i else h j" + have fin: "f \ PiE I (topspace \ X)" + unfolding f_def using gin insert.prems(1) by auto + have subM: "{j \ I. f j \ g j} \ M" + unfolding f_def using insert.prems(2) by auto + have "f \ U" + using insert.IH [OF fin subM] . + show ?case + proof (cases "h \ V") + case True + show ?thesis + proof (cases "i \ I") + case True + let ?U = "{x \ topspace(X i). (\j. if j = i then x else h j) \ U}" + let ?V = "{x \ topspace(X i). (\j. if j = i then x else h j) \ V}" + have False + proof (rule connected_spaceD [OF cs [OF \i \ I\]]) + have "\k. k \ I \ continuous_map (X i) (X k) (\x. if k = i then x else h k)" + using continuous_map_eq_topcontinuous_at insert.prems(1) topcontinuous_at_def by fastforce + then have cm: "continuous_map (X i) (product_topology X I) (\x j. if j = i then x else h j)" + using \i \ I\ insert.prems(1) + by (auto simp: continuous_map_componentwise extensional_def) + show "openin (X i) ?U" + by (rule openin_continuous_map_preimage [OF cm U]) + show "openin (X i) ?V" + by (rule openin_continuous_map_preimage [OF cm V]) + show "topspace (X i) \ ?U \ ?V" + proof clarsimp + fix x + assume "x \ topspace (X i)" and "(\j. if j = i then x else h j) \ V" + with True subUV \h \ Pi\<^sub>E I (topspace \ X)\ + show "(\j. if j = i then x else h j) \ U" + by (drule_tac c="(\j. if j = i then x else h j)" in subsetD) auto + qed + show "?U \ ?V = {}" + using disj by blast + show "?U \ {}" + using \U \ {}\ f_def + proof - + have "(\j. if j = i then g i else h j) \ U" + using \f \ U\ f_def by blast + moreover have "f i \ topspace (X i)" + by (metis PiE_iff True comp_apply fin) + ultimately have "\b. b \ topspace (X i) \ (\a. if a = i then b else h a) \ U" + using f_def by auto + then show ?thesis + by blast + qed + have "(\j. if j = i then h i else h j) = h" + by force + moreover have "h i \ topspace (X i)" + using True insert.prems(1) by auto + ultimately show "?V \ {}" + using \h \ V\ by force + qed + then show ?thesis .. + next + case False + show ?thesis + proof (cases "h = f") + case True + show ?thesis + by (rule insert.IH [OF insert.prems(1)]) (simp add: True subM) + next + case False + then show ?thesis + using gin insert.prems(1) \i \ I\ unfolding f_def by fastforce + qed + qed + next + case False + then show ?thesis + using subUV insert.prems(1) by auto + qed + qed + then show "h \ U" + unfolding g_def using PiE_iff \finite L\ h by fastforce + qed + qed + ultimately show ?thesis + using disj inf_absorb2 \V \ {}\ by fastforce + qed + then show ?lhs + unfolding connected_space_def + by auto + qed + ultimately show ?thesis + by simp +qed (simp add: connected_space_topspace_empty) + + +lemma connectedin_PiE: + "connectedin (product_topology X I) (PiE I S) \ + PiE I S = {} \ (\i \ I. connectedin (X i) (S i))" + by (fastforce simp add: connectedin_def subtopology_PiE connected_space_product_topology subset_PiE PiE_eq_empty_iff + topspace_subtopology_subset) + +lemma path_connected_space_product_topology: + "path_connected_space(product_topology X I) \ + topspace(product_topology X I) = {} \ (\i \ I. path_connected_space(X i))" + (is "?lhs \ ?eq \ ?rhs") +proof (cases ?eq) + case False + moreover have "?lhs = ?rhs" + proof + assume L: ?lhs + show ?rhs + proof (clarsimp simp flip: path_connectedin_topspace) + fix i :: "'a" + assume "i \ I" + have cm: "continuous_map (product_topology X I) (X i) (\f. f i)" + by (simp add: \i \ I\ continuous_map_product_projection) + show "path_connectedin (X i) (topspace (X i))" + using path_connectedin_continuous_map_image [OF cm L [unfolded path_connectedin_topspace [symmetric]]] + by (metis \i \ I\ False retraction_imp_surjective_map retraction_map_product_projection) + qed + next + assume R [rule_format]: ?rhs + show ?lhs + unfolding path_connected_space_def topspace_product_topology + proof clarify + fix x y + assume x: "x \ (\\<^sub>E i\I. topspace (X i))" and y: "y \ (\\<^sub>E i\I. topspace (X i))" + have "\i. \g. i \ I \ pathin (X i) g \ g 0 = x i \ g 1 = y i" + using PiE_mem R path_connected_space_def x y by force + then obtain g where g: "\i. i \ I \ pathin (X i) (g i) \ g i 0 = x i \ g i 1 = y i" + by metis + with x y show "\g. pathin (product_topology X I) g \ g 0 = x \ g 1 = y" + apply (rule_tac x="\a. \i \ I. g i a" in exI) + apply (force simp: pathin_def continuous_map_componentwise) + done + qed + qed + ultimately show ?thesis + by simp +qed (simp add: path_connected_space_topspace_empty) + +lemma path_connectedin_PiE: + "path_connectedin (product_topology X I) (PiE I S) \ + PiE I S = {} \ (\i \ I. path_connectedin (X i) (S i))" + by (fastforce simp add: path_connectedin_def subtopology_PiE path_connected_space_product_topology subset_PiE PiE_eq_empty_iff topspace_subtopology_subset) + + end diff -r ab8aad4aa76e -r 35ba13ac6e5c src/HOL/Analysis/Locally.thy --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/HOL/Analysis/Locally.thy Fri Mar 22 12:34:49 2019 +0000 @@ -0,0 +1,449 @@ +section \Neigbourhood bases and Locally path-connected spaces\ + +theory Locally + imports + Path_Connected Function_Topology +begin + +subsection\Neigbourhood bases (useful for "local" properties of various kinds)\ + +definition neighbourhood_base_at where + "neighbourhood_base_at x P X \ + \W. openin X W \ x \ W + \ (\U V. openin X U \ P V \ x \ U \ U \ V \ V \ W)" + +definition neighbourhood_base_of where + "neighbourhood_base_of P X \ + \x \ topspace X. neighbourhood_base_at x P X" + +lemma neighbourhood_base_of: + "neighbourhood_base_of P X \ + (\W x. openin X W \ x \ W + \ (\U V. openin X U \ P V \ x \ U \ U \ V \ V \ W))" + unfolding neighbourhood_base_at_def neighbourhood_base_of_def + using openin_subset by blast + +lemma neighbourhood_base_at_mono: + "\neighbourhood_base_at x P X; \S. \P S; x \ S\ \ Q S\ \ neighbourhood_base_at x Q X" + unfolding neighbourhood_base_at_def + by (meson subset_eq) + +lemma neighbourhood_base_of_mono: + "\neighbourhood_base_of P X; \S. P S \ Q S\ \ neighbourhood_base_of Q X" + unfolding neighbourhood_base_of_def + using neighbourhood_base_at_mono by force + +lemma open_neighbourhood_base_at: + "(\S. \P S; x \ S\ \ openin X S) + \ neighbourhood_base_at x P X \ (\W. openin X W \ x \ W \ (\U. P U \ x \ U \ U \ W))" + unfolding neighbourhood_base_at_def + by (meson subsetD) + +lemma open_neighbourhood_base_of: + "(\S. P S \ openin X S) + \ neighbourhood_base_of P X \ (\W x. openin X W \ x \ W \ (\U. P U \ x \ U \ U \ W))" + apply (simp add: neighbourhood_base_of, safe, blast) + by meson + +lemma neighbourhood_base_of_open_subset: + "\neighbourhood_base_of P X; openin X S\ + \ neighbourhood_base_of P (subtopology X S)" + apply (clarsimp simp add: neighbourhood_base_of openin_subtopology_alt image_def) + apply (rename_tac x V) + apply (drule_tac x="S \ V" in spec) + apply (simp add: Int_ac) + by (metis IntI le_infI1 openin_Int) + +lemma neighbourhood_base_of_topology_base: + "openin X = arbitrary union_of (\W. W \ \) + \ neighbourhood_base_of P X \ + (\W x. W \ \ \ x \ W \ (\U V. openin X U \ P V \ x \ U \ U \ V \ V \ W))" + apply (auto simp: openin_topology_base_unique neighbourhood_base_of) + by (meson subset_trans) + +lemma neighbourhood_base_at_unlocalized: + assumes "\S T. \P S; openin X T; x \ T; T \ S\ \ P T" + shows "neighbourhood_base_at x P X + \ (x \ topspace X \ (\U V. openin X U \ P V \ x \ U \ U \ V \ V \ topspace X))" + (is "?lhs = ?rhs") +proof + assume R: ?rhs show ?lhs + unfolding neighbourhood_base_at_def + proof clarify + fix W + assume "openin X W" "x \ W" + then have "x \ topspace X" + using openin_subset by blast + with R obtain U V where "openin X U" "P V" "x \ U" "U \ V" "V \ topspace X" + by blast + then show "\U V. openin X U \ P V \ x \ U \ U \ V \ V \ W" + by (metis IntI \openin X W\ \x \ W\ assms inf_le1 inf_le2 openin_Int) + qed +qed (simp add: neighbourhood_base_at_def) + +lemma neighbourhood_base_at_with_subset: + "\openin X U; x \ U\ + \ (neighbourhood_base_at x P X \ neighbourhood_base_at x (\T. T \ U \ P T) X)" + apply (simp add: neighbourhood_base_at_def) + apply (metis IntI Int_subset_iff openin_Int) + done + +lemma neighbourhood_base_of_with_subset: + "neighbourhood_base_of P X \ neighbourhood_base_of (\t. t \ topspace X \ P t) X" + using neighbourhood_base_at_with_subset + by (fastforce simp add: neighbourhood_base_of_def) + +subsection\Locally path-connected spaces\ + +definition weakly_locally_path_connected_at + where "weakly_locally_path_connected_at x X \ neighbourhood_base_at x (path_connectedin X) X" + +definition locally_path_connected_at + where "locally_path_connected_at x X \ + neighbourhood_base_at x (\U. openin X U \ path_connectedin X U) X" + +definition locally_path_connected_space + where "locally_path_connected_space X \ neighbourhood_base_of (path_connectedin X) X" + +lemma locally_path_connected_space_alt: + "locally_path_connected_space X \ neighbourhood_base_of (\U. openin X U \ path_connectedin X U) X" + (is "?P = ?Q") + and locally_path_connected_space_eq_open_path_component_of: + "locally_path_connected_space X \ + (\U x. openin X U \ x \ U \ openin X (Collect (path_component_of (subtopology X U) x)))" + (is "?P = ?R") +proof - + have ?P if ?Q + using locally_path_connected_space_def neighbourhood_base_of_mono that by auto + moreover have ?R if P: ?P + proof - + show ?thesis + proof clarify + fix U y + assume "openin X U" "y \ U" + have "\T. openin X T \ x \ T \ T \ Collect (path_component_of (subtopology X U) y)" + if "path_component_of (subtopology X U) y x" for x + + proof - + have "x \ U" + using path_component_of_equiv that topspace_subtopology by fastforce + then have "\Ua. openin X Ua \ (\V. path_connectedin X V \ x \ Ua \ Ua \ V \ V \ U)" + using P + by (simp add: \openin X U\ locally_path_connected_space_def neighbourhood_base_of) + then show ?thesis + by (metis dual_order.trans path_component_of_equiv path_component_of_maximal path_connectedin_subtopology subset_iff that) + qed + then show "openin X (Collect (path_component_of (subtopology X U) y))" + using openin_subopen by force + qed + qed + moreover have ?Q if ?R + using that + apply (simp add: open_neighbourhood_base_of) + by (metis mem_Collect_eq openin_subset path_component_of_refl path_connectedin_path_component_of path_connectedin_subtopology that topspace_subtopology_subset) + ultimately show "?P = ?Q" "?P = ?R" + by blast+ +qed + +lemma locally_path_connected_space: + "locally_path_connected_space X + \ (\V x. openin X V \ x \ V \ (\U. openin X U \ path_connectedin X U \ x \ U \ U \ V))" + by (simp add: locally_path_connected_space_alt open_neighbourhood_base_of) + +lemma locally_path_connected_space_open_path_components: + "locally_path_connected_space X \ + (\U c. openin X U \ c \ path_components_of(subtopology X U) \ openin X c)" + apply (auto simp: locally_path_connected_space_eq_open_path_component_of path_components_of_def topspace_subtopology) + by (metis imageI inf.absorb_iff2 openin_closedin_eq) + +lemma openin_path_component_of_locally_path_connected_space: + "locally_path_connected_space X \ openin X (Collect (path_component_of X x))" + apply (auto simp: locally_path_connected_space_eq_open_path_component_of) + by (metis openin_empty openin_topspace path_component_of_eq_empty subtopology_topspace) + +lemma openin_path_components_of_locally_path_connected_space: + "\locally_path_connected_space X; c \ path_components_of X\ \ openin X c" + apply (auto simp: locally_path_connected_space_eq_open_path_component_of) + by (metis (no_types, lifting) imageE openin_topspace path_components_of_def subtopology_topspace) + +lemma closedin_path_components_of_locally_path_connected_space: + "\locally_path_connected_space X; c \ path_components_of X\ \ closedin X c" + by (simp add: closedin_def complement_path_components_of_Union openin_path_components_of_locally_path_connected_space openin_clauses(3) path_components_of_subset) + +lemma closedin_path_component_of_locally_path_connected_space: + assumes "locally_path_connected_space X" + shows "closedin X (Collect (path_component_of X x))" +proof (cases "x \ topspace X") + case True + then show ?thesis + by (simp add: assms closedin_path_components_of_locally_path_connected_space path_component_in_path_components_of) +next + case False + then show ?thesis + by (metis closedin_empty path_component_of_eq_empty) +qed + +lemma weakly_locally_path_connected_at: + "weakly_locally_path_connected_at x X \ + (\V. openin X V \ x \ V + \ (\U. openin X U \ x \ U \ U \ V \ + (\y \ U. \C. path_connectedin X C \ C \ V \ x \ C \ y \ C)))" + (is "?lhs = ?rhs") +proof + assume ?lhs then show ?rhs + apply (simp add: weakly_locally_path_connected_at_def neighbourhood_base_at_def) + by (meson order_trans subsetD) +next + have *: "\V. path_connectedin X V \ U \ V \ V \ W" + if "(\y\U. \C. path_connectedin X C \ C \ W \ x \ C \ y \ C)" + for W U + proof (intro exI conjI) + let ?V = "(Collect (path_component_of (subtopology X W) x))" + show "path_connectedin X (Collect (path_component_of (subtopology X W) x))" + by (meson path_connectedin_path_component_of path_connectedin_subtopology) + show "U \ ?V" + by (auto simp: path_component_of path_connectedin_subtopology that) + show "?V \ W" + by (meson path_connectedin_path_component_of path_connectedin_subtopology) + qed + assume ?rhs + then show ?lhs + unfolding weakly_locally_path_connected_at_def neighbourhood_base_at_def by (metis "*") +qed + +lemma locally_path_connected_space_im_kleinen: + "locally_path_connected_space X \ + (\V x. openin X V \ x \ V + \ (\U. openin X U \ + x \ U \ U \ V \ + (\y \ U. \c. path_connectedin X c \ + c \ V \ x \ c \ y \ c)))" + apply (simp add: locally_path_connected_space_def neighbourhood_base_of_def) + apply (simp add: weakly_locally_path_connected_at flip: weakly_locally_path_connected_at_def) + using openin_subset apply force + done + +lemma locally_path_connected_space_open_subset: + "\locally_path_connected_space X; openin X s\ + \ locally_path_connected_space (subtopology X s)" + apply (simp add: locally_path_connected_space_def neighbourhood_base_of openin_open_subtopology path_connectedin_subtopology) + by (meson order_trans) + +lemma locally_path_connected_space_quotient_map_image: + assumes f: "quotient_map X Y f" and X: "locally_path_connected_space X" + shows "locally_path_connected_space Y" + unfolding locally_path_connected_space_open_path_components +proof clarify + fix V C + assume V: "openin Y V" and c: "C \ path_components_of (subtopology Y V)" + then have sub: "C \ topspace Y" + using path_connectedin_path_components_of path_connectedin_subset_topspace path_connectedin_subtopology by blast + have "openin X {x \ topspace X. f x \ C}" + proof (subst openin_subopen, clarify) + fix x + assume x: "x \ topspace X" and "f x \ C" + let ?T = "Collect (path_component_of (subtopology X {z \ topspace X. f z \ V}) x)" + show "\T. openin X T \ x \ T \ T \ {x \ topspace X. f x \ C}" + proof (intro exI conjI) + have "\U. openin X U \ ?T \ path_components_of (subtopology X U)" + proof (intro exI conjI) + show "openin X ({z \ topspace X. f z \ V})" + using V f openin_subset quotient_map_def by fastforce + show "Collect (path_component_of (subtopology X {z \ topspace X. f z \ V}) x) + \ path_components_of (subtopology X {z \ topspace X. f z \ V})" + by (metis (no_types, lifting) Int_iff \f x \ C\ c mem_Collect_eq path_component_in_path_components_of path_components_of_subset topspace_subtopology topspace_subtopology_subset x) + qed + with X show "openin X ?T" + using locally_path_connected_space_open_path_components by blast + show x: "x \ ?T" + using V \f x \ C\ c openin_subset path_component_of_equiv path_components_of_subset topspace_subtopology topspace_subtopology_subset x + by fastforce + have "f ` ?T \ C" + proof (rule path_components_of_maximal) + show "C \ path_components_of (subtopology Y V)" + by (simp add: c) + show "path_connectedin (subtopology Y V) (f ` ?T)" + proof - + have "quotient_map (subtopology X {a \ topspace X. f a \ V}) (subtopology Y V) f" + by (simp add: V f quotient_map_restriction) + then show ?thesis + by (meson path_connectedin_continuous_map_image path_connectedin_path_component_of quotient_imp_continuous_map) + qed + show "\ disjnt C (f ` ?T)" + by (metis (no_types, lifting) \f x \ C\ x disjnt_iff image_eqI) + qed + then show "?T \ {x \ topspace X. f x \ C}" + by (force simp: path_component_of_equiv topspace_subtopology) + qed + qed + then show "openin Y C" + using f sub by (simp add: quotient_map_def) +qed + +lemma homeomorphic_locally_path_connected_space: + assumes "X homeomorphic_space Y" + shows "locally_path_connected_space X \ locally_path_connected_space Y" +proof - + obtain f g where "homeomorphic_maps X Y f g" + using assms homeomorphic_space_def by fastforce + then show ?thesis + by (metis (no_types) homeomorphic_map_def homeomorphic_maps_map locally_path_connected_space_quotient_map_image) +qed + +lemma locally_path_connected_space_retraction_map_image: + "\retraction_map X Y r; locally_path_connected_space X\ + \ locally_path_connected_space Y" + using Abstract_Topology.retraction_imp_quotient_map locally_path_connected_space_quotient_map_image by blast + +lemma locally_path_connected_space_euclideanreal: "locally_path_connected_space euclideanreal" + unfolding locally_path_connected_space_def neighbourhood_base_of + proof clarsimp + fix W and x :: "real" + assume "open W" "x \ W" + then obtain e where "e > 0" and e: "\x'. \x' - x\ < e \ x' \ W" + by (auto simp: open_real) + then show "\U. open U \ (\V. path_connected V \ x \ U \ U \ V \ V \ W)" + by (force intro!: convex_imp_path_connected exI [where x = "{x-e<.. topspace X") + case True + then show ?thesis + using connectedin_connected_component_of [of X x] + apply (clarsimp simp add: connectedin_def connected_space_clopen_in topspace_subtopology_subset cong: conj_cong) + apply (drule_tac x="path_component_of_set X x" in spec) + by (metis assms closedin_closed_subtopology closedin_connected_component_of closedin_path_component_of_locally_path_connected_space inf.absorb_iff2 inf.orderE openin_path_component_of_locally_path_connected_space openin_subtopology path_component_of_eq_empty path_component_subset_connected_component_of) +next + case False + then show ?thesis + using connected_component_of_eq_empty path_component_of_eq_empty by fastforce +qed + +lemma path_components_eq_connected_components_of: + "locally_path_connected_space X \ (path_components_of X = connected_components_of X)" + by (simp add: path_components_of_def connected_components_of_def image_def path_component_eq_connected_component_of) + +lemma path_connected_eq_connected_space: + "locally_path_connected_space X + \ path_connected_space X \ connected_space X" + by (metis connected_components_of_subset_sing path_components_eq_connected_components_of path_components_of_subset_singleton) + +lemma locally_path_connected_space_product_topology: + "locally_path_connected_space(product_topology X I) \ + topspace(product_topology X I) = {} \ + finite {i. i \ I \ ~path_connected_space(X i)} \ + (\i \ I. locally_path_connected_space(X i))" + (is "?lhs \ ?empty \ ?rhs") +proof (cases ?empty) + case True + then show ?thesis + by (simp add: locally_path_connected_space_def neighbourhood_base_of openin_closedin_eq) +next + case False + then obtain z where z: "z \ (\\<^sub>E i\I. topspace (X i))" + by auto + have ?rhs if L: ?lhs + proof - + obtain U C where U: "openin (product_topology X I) U" + and V: "path_connectedin (product_topology X I) C" + and "z \ U" "U \ C" and Csub: "C \ (\\<^sub>E i\I. topspace (X i))" + using L apply (clarsimp simp add: locally_path_connected_space_def neighbourhood_base_of) + by (metis openin_topspace topspace_product_topology z) + then obtain V where finV: "finite {i \ I. V i \ topspace (X i)}" + and XV: "\i. i\I \ openin (X i) (V i)" and "z \ Pi\<^sub>E I V" and subU: "Pi\<^sub>E I V \ U" + by (force simp: openin_product_topology_alt) + show ?thesis + proof (intro conjI ballI) + have "path_connected_space (X i)" if "i \ I" "V i = topspace (X i)" for i + proof - + have pc: "path_connectedin (X i) ((\x. x i) ` C)" + apply (rule path_connectedin_continuous_map_image [OF _ V]) + by (simp add: continuous_map_product_projection \i \ I\) + moreover have "((\x. x i) ` C) = topspace (X i)" + proof + show "(\x. x i) ` C \ topspace (X i)" + by (simp add: pc path_connectedin_subset_topspace) + have "V i \ (\x. x i) ` (\\<^sub>E i\I. V i)" + by (metis \z \ Pi\<^sub>E I V\ empty_iff image_projection_PiE order_refl that(1)) + also have "\ \ (\x. x i) ` U" + using subU by blast + finally show "topspace (X i) \ (\x. x i) ` C" + using \U \ C\ that by blast + qed + ultimately show ?thesis + by (simp add: path_connectedin_topspace) + qed + then have "{i \ I. \ path_connected_space (X i)} \ {i \ I. V i \ topspace (X i)}" + by blast + with finV show "finite {i \ I. \ path_connected_space (X i)}" + using finite_subset by blast + next + show "locally_path_connected_space (X i)" if "i \ I" for i + apply (rule locally_path_connected_space_quotient_map_image [OF _ L, where f = "\x. x i"]) + by (metis False Abstract_Topology.retraction_imp_quotient_map retraction_map_product_projection that) + qed + qed + moreover have ?lhs if R: ?rhs + proof (clarsimp simp add: locally_path_connected_space_def neighbourhood_base_of) + fix F z + assume "openin (product_topology X I) F" and "z \ F" + then obtain W where finW: "finite {i \ I. W i \ topspace (X i)}" + and opeW: "\i. i \ I \ openin (X i) (W i)" and "z \ Pi\<^sub>E I W" "Pi\<^sub>E I W \ F" + by (auto simp: openin_product_topology_alt) + have "\i \ I. \U C. openin (X i) U \ path_connectedin (X i) C \ z i \ U \ U \ C \ C \ W i \ + (W i = topspace (X i) \ + path_connected_space (X i) \ U = topspace (X i) \ C = topspace (X i))" + (is "\i \ I. ?\ i") + proof + fix i assume "i \ I" + have "locally_path_connected_space (X i)" + by (simp add: R \i \ I\) + moreover have "openin (X i) (W i) " "z i \ W i" + using \z \ Pi\<^sub>E I W\ opeW \i \ I\ by auto + ultimately obtain U C where UC: "openin (X i) U" "path_connectedin (X i) C" "z i \ U" "U \ C" "C \ W i" + using \i \ I\ by (force simp: locally_path_connected_space_def neighbourhood_base_of) + show "?\ i" + proof (cases "W i = topspace (X i) \ path_connected_space(X i)") + case True + then show ?thesis + using \z i \ W i\ path_connectedin_topspace by blast + next + case False + then show ?thesis + by (meson UC) + qed + qed + then obtain U C where + *: "\i. i \ I \ openin (X i) (U i) \ path_connectedin (X i) (C i) \ z i \ (U i) \ (U i) \ (C i) \ (C i) \ W i \ + (W i = topspace (X i) \ path_connected_space (X i) + \ (U i) = topspace (X i) \ (C i) = topspace (X i))" + by metis + let ?A = "{i \ I. \ path_connected_space (X i)} \ {i \ I. W i \ topspace (X i)}" + have "{i \ I. U i \ topspace (X i)} \ ?A" + by (clarsimp simp add: "*") + moreover have "finite ?A" + by (simp add: that finW) + ultimately have "finite {i \ I. U i \ topspace (X i)}" + using finite_subset by auto + then have "openin (product_topology X I) (Pi\<^sub>E I U)" + using * by (simp add: openin_PiE_gen) + then show "\U. openin (product_topology X I) U \ + (\V. path_connectedin (product_topology X I) V \ z \ U \ U \ V \ V \ F)" + apply (rule_tac x="PiE I U" in exI, simp) + apply (rule_tac x="PiE I C" in exI) + using \z \ Pi\<^sub>E I W\ \Pi\<^sub>E I W \ F\ * + apply (simp add: path_connectedin_PiE subset_PiE PiE_iff PiE_mono dual_order.trans) + done + qed + ultimately show ?thesis + using False by blast +qed + +end diff -r ab8aad4aa76e -r 35ba13ac6e5c src/HOL/Analysis/Product_Topology.thy --- a/src/HOL/Analysis/Product_Topology.thy Thu Mar 21 19:46:26 2019 +0100 +++ b/src/HOL/Analysis/Product_Topology.thy Fri Mar 22 12:34:49 2019 +0000 @@ -1,7 +1,7 @@ section\The binary product topology\ theory Product_Topology -imports Function_Topology +imports Function_Topology Abstract_Limits begin section \Product Topology\ @@ -519,5 +519,49 @@ then show ?thesis by metis qed +lemma limitin_pairwise: + "limitin (prod_topology X Y) f l F \ limitin X (fst \ f) (fst l) F \ limitin Y (snd \ f) (snd l) F" + (is "?lhs = ?rhs") +proof + assume ?lhs + then obtain a b where ev: "\U. \(a,b) \ U; openin (prod_topology X Y) U\ \ \\<^sub>F x in F. f x \ U" + and a: "a \ topspace X" and b: "b \ topspace Y" and l: "l = (a,b)" + by (auto simp: limitin_def) + moreover have "\\<^sub>F x in F. fst (f x) \ U" if "openin X U" "a \ U" for U + proof - + have "\\<^sub>F c in F. f c \ U \ topspace Y" + using b that ev [of "U \ topspace Y"] by (auto simp: openin_prod_topology_alt) + then show ?thesis + by (rule eventually_mono) (metis (mono_tags, lifting) SigmaE2 prod.collapse) + qed + moreover have "\\<^sub>F x in F. snd (f x) \ U" if "openin Y U" "b \ U" for U + proof - + have "\\<^sub>F c in F. f c \ topspace X \ U" + using a that ev [of "topspace X \ U"] by (auto simp: openin_prod_topology_alt) + then show ?thesis + by (rule eventually_mono) (metis (mono_tags, lifting) SigmaE2 prod.collapse) + qed + ultimately show ?rhs + by (simp add: limitin_def) +next + have "limitin (prod_topology X Y) f (a,b) F" + if "limitin X (fst \ f) a F" "limitin Y (snd \ f) b F" for a b + using that + proof (clarsimp simp: limitin_def) + fix Z :: "('a \ 'b) set" + assume a: "a \ topspace X" "\U. openin X U \ a \ U \ (\\<^sub>F x in F. fst (f x) \ U)" + and b: "b \ topspace Y" "\U. openin Y U \ b \ U \ (\\<^sub>F x in F. snd (f x) \ U)" + and Z: "openin (prod_topology X Y) Z" "(a, b) \ Z" + then obtain U V where "openin X U" "openin Y V" "a \ U" "b \ V" "U \ V \ Z" + using Z by (force simp: openin_prod_topology_alt) + then have "\\<^sub>F x in F. fst (f x) \ U" "\\<^sub>F x in F. snd (f x) \ V" + by (simp_all add: a b) + then show "\\<^sub>F x in F. f x \ Z" + by (rule eventually_elim2) (use \U \ V \ Z\ subsetD in auto) + qed + then show "?rhs \ ?lhs" + by (metis prod.collapse) +qed + end