diff -r b67bab2b132c -r 4900351361b0 src/HOL/Analysis/Abstract_Topology.thy --- a/src/HOL/Analysis/Abstract_Topology.thy Tue Apr 16 19:50:30 2019 +0000 +++ b/src/HOL/Analysis/Abstract_Topology.thy Wed Apr 17 17:48:28 2019 +0100 @@ -382,6 +382,10 @@ lemma closedin_topspace_empty: "topspace T = {} \ (closedin T S \ S = {})" by (simp add: closedin_def) +lemma open_in_topspace_empty: + "topspace X = {} \ openin X S \ S = {}" + by (simp add: openin_closedin_eq) + lemma openin_imp_subset: "openin (subtopology U S) T \ T \ S" by (metis Int_iff openin_subtopology subsetI) @@ -1756,6 +1760,26 @@ "open_map X1 X2 f \ f ` (topspace X1) \ topspace X2" unfolding open_map_def by (simp add: openin_subset) +lemma open_map_on_empty: + "topspace X = {} \ open_map X Y f" + by (metis empty_iff imageE in_mono open_map_def openin_subopen openin_subset) + +lemma closed_map_on_empty: + "topspace X = {} \ closed_map X Y f" + by (simp add: closed_map_def closedin_topspace_empty) + +lemma closed_map_const: + "closed_map X Y (\x. c) \ topspace X = {} \ closedin Y {c}" +proof (cases "topspace X = {}") + case True + then show ?thesis + by (simp add: closed_map_on_empty) +next + case False + then show ?thesis + by (auto simp: closed_map_def image_constant_conv) +qed + lemma open_map_imp_subset: "\open_map X1 X2 f; S \ topspace X1\ \ f ` S \ topspace X2" by (meson order_trans open_map_imp_subset_topspace subset_image_iff) @@ -3220,6 +3244,10 @@ unfolding compact_space_alt using openin_subset by fastforce +lemma compactinD: + "\compactin X S; \U. U \ \ \ openin X U; S \ \\\ \ \\. finite \ \ \ \ \ \ S \ \\" + by (auto simp: compactin_def) + lemma compactin_euclidean_iff [simp]: "compactin euclidean S \ compact S" by (simp add: compact_eq_Heine_Borel compactin_def) meson @@ -3229,7 +3257,7 @@ have eq: "(\U \ \. \Y. openin X Y \ U = Y \ S) \ \ \ (\Y. Y \ S) ` {y. openin X y}" for \ by auto show ?thesis - by (auto simp: compactin_def topspace_subtopology openin_subtopology eq imp_conjL all_subset_image exists_finite_subset_image) + by (auto simp: compactin_def topspace_subtopology openin_subtopology eq imp_conjL all_subset_image ex_finite_subset_image) qed lemma compactin_subspace: "compactin X S \ S \ topspace X \ compact_space (subtopology X S)" @@ -3411,7 +3439,7 @@ by (auto simp: \_def) moreover assume [unfolded compact_space_alt, rule_format, of \]: "compact_space X" ultimately obtain \ where \: "finite \" "\ \ \" "topspace X \ topspace X - \\" - by (auto simp: exists_finite_subset_image \_def) + by (auto simp: ex_finite_subset_image \_def) moreover have "\ \ {}" using \ \topspace X \ {}\ by blast ultimately show "False" @@ -3645,7 +3673,7 @@ "embedding_map X (subtopology Y S) f \ embedding_map X Y f \ f ` (topspace X) \ S" apply (auto simp: embedding_map_def subtopology_subtopology Int_absorb1) apply (metis (no_types) homeomorphic_imp_surjective_map subtopology_subtopology subtopology_topspace topspace_subtopology) - apply (simp add: continuous_map_def homeomorphic_eq_everything_map topspace_subtopology) + apply (simp add: continuous_map_def homeomorphic_eq_everything_map) done lemma injective_open_imp_embedding_map: @@ -3653,7 +3681,7 @@ unfolding embedding_map_def apply (rule bijective_open_imp_homeomorphic_map) using continuous_map_in_subtopology apply blast - apply (auto simp: continuous_map_in_subtopology open_map_into_subtopology topspace_subtopology continuous_map) + apply (auto simp: continuous_map_in_subtopology open_map_into_subtopology continuous_map) done lemma injective_closed_imp_embedding_map: @@ -3661,7 +3689,7 @@ unfolding embedding_map_def apply (rule bijective_closed_imp_homeomorphic_map) apply (simp_all add: continuous_map_into_subtopology closed_map_into_subtopology) - apply (simp add: continuous_map inf.absorb_iff2 topspace_subtopology) + apply (simp add: continuous_map inf.absorb_iff2) done lemma embedding_map_imp_homeomorphic_space: @@ -3669,6 +3697,11 @@ unfolding embedding_map_def using homeomorphic_space by blast +lemma embedding_imp_closed_map: + "\embedding_map X Y f; closedin Y (f ` topspace X)\ \ closed_map X Y f" + unfolding closed_map_def + by (auto simp: closedin_closed_subtopology embedding_map_def homeomorphic_map_closedness_eq) + subsection\Retraction and section maps\ @@ -4341,5 +4374,235 @@ ultimately show "g x \ topspace (pullback_topology A f T2)" unfolding topspace_pullback_topology by blast qed +subsection\Proper maps (not a priori assumed continuous) \ + +definition proper_map + where + "proper_map X Y f \ + closed_map X Y f \ (\y \ topspace Y. compactin X {x \ topspace X. f x = y})" + +lemma proper_imp_closed_map: + "proper_map X Y f \ closed_map X Y f" + by (simp add: proper_map_def) + +lemma proper_map_imp_subset_topspace: + "proper_map X Y f \ f ` (topspace X) \ topspace Y" + by (simp add: closed_map_imp_subset_topspace proper_map_def) + +lemma closed_injective_imp_proper_map: + assumes f: "closed_map X Y f" and inj: "inj_on f (topspace X)" + shows "proper_map X Y f" + unfolding proper_map_def +proof (clarsimp simp: f) + show "compactin X {x \ topspace X. f x = y}" + if "y \ topspace Y" for y + proof - + have "{x \ topspace X. f x = y} = {} \ (\a \ topspace X. {x \ topspace X. f x = y} = {a})" + using inj_on_eq_iff [OF inj] by auto + then show ?thesis + using that by (metis (no_types, lifting) compactin_empty compactin_sing) + qed +qed + +lemma injective_imp_proper_eq_closed_map: + "inj_on f (topspace X) \ (proper_map X Y f \ closed_map X Y f)" + using closed_injective_imp_proper_map proper_imp_closed_map by blast + +lemma homeomorphic_imp_proper_map: + "homeomorphic_map X Y f \ proper_map X Y f" + by (simp add: closed_injective_imp_proper_map homeomorphic_eq_everything_map) + +lemma compactin_proper_map_preimage: + assumes f: "proper_map X Y f" and "compactin Y K" + shows "compactin X {x. x \ topspace X \ f x \ K}" +proof - + have "f ` (topspace X) \ topspace Y" + by (simp add: f proper_map_imp_subset_topspace) + have *: "\y. y \ topspace Y \ compactin X {x \ topspace X. f x = y}" + using f by (auto simp: proper_map_def) + show ?thesis + unfolding compactin_def + proof clarsimp + show "\\. finite \ \ \ \ \ \ {x \ topspace X. f x \ K} \ \\" + if \: "\U\\. openin X U" and sub: "{x \ topspace X. f x \ K} \ \\" + for \ + proof - + have "\y \ K. \\. finite \ \ \ \ \ \ {x \ topspace X. f x = y} \ \\" + proof + fix y + assume "y \ K" + then have "compactin X {x \ topspace X. f x = y}" + by (metis "*" \compactin Y K\ compactin_subspace subsetD) + with \y \ K\ show "\\. finite \ \ \ \ \ \ {x \ topspace X. f x = y} \ \\" + unfolding compactin_def using \ sub by fastforce + qed + then obtain \ where \: "\y. y \ K \ finite (\ y) \ \ y \ \ \ {x \ topspace X. f x = y} \ \(\ y)" + by (metis (full_types)) + define F where "F \ \y. topspace Y - f ` (topspace X - \(\ y))" + have "\\. finite \ \ \ \ F ` K \ K \ \\" + proof (rule compactinD [OF \compactin Y K\]) + have "\x. x \ K \ closedin Y (f ` (topspace X - \(\ x)))" + using f unfolding proper_map_def closed_map_def + by (meson \ \ openin_Union openin_closedin_eq subsetD) + then show "openin Y U" if "U \ F ` K" for U + using that by (auto simp: F_def) + show "K \ \(F ` K)" + using \ \compactin Y K\ unfolding F_def compactin_def by fastforce + qed + then obtain J where "finite J" "J \ K" and J: "K \ \(F ` J)" + by (auto simp: ex_finite_subset_image) + show ?thesis + unfolding F_def + proof (intro exI conjI) + show "finite (\(\ ` J))" + using \ \J \ K\ \finite J\ by blast + show "\(\ ` J) \ \" + using \ \J \ K\ by blast + show "{x \ topspace X. f x \ K} \ \(\(\ ` J))" + using J \J \ K\ unfolding F_def by auto + qed + qed + qed +qed + + +lemma compact_space_proper_map_preimage: + assumes f: "proper_map X Y f" and fim: "f ` (topspace X) = topspace Y" and "compact_space Y" + shows "compact_space X" +proof - + have eq: "topspace X = {x \ topspace X. f x \ topspace Y}" + using fim by blast + moreover have "compactin Y (topspace Y)" + using \compact_space Y\ compact_space_def by auto + ultimately show ?thesis + unfolding compact_space_def + using eq f compactin_proper_map_preimage by fastforce +qed + +lemma proper_map_alt: + "proper_map X Y f \ + closed_map X Y f \ (\K. compactin Y K \ compactin X {x. x \ topspace X \ f x \ K})" + proof (intro iffI conjI allI impI) + show "compactin X {x \ topspace X. f x \ K}" + if "proper_map X Y f" and "compactin Y K" for K + using that by (simp add: compactin_proper_map_preimage) + show "proper_map X Y f" + if f: "closed_map X Y f \ (\K. compactin Y K \ compactin X {x \ topspace X. f x \ K})" + proof - + have "compactin X {x \ topspace X. f x = y}" if "y \ topspace Y" for y + proof - + have "compactin X {x \ topspace X. f x \ {y}}" + using f compactin_sing that by fastforce + then show ?thesis + by auto + qed + with f show ?thesis + by (auto simp: proper_map_def) + qed +qed (simp add: proper_imp_closed_map) + +lemma proper_map_on_empty: + "topspace X = {} \ proper_map X Y f" + by (auto simp: proper_map_def closed_map_on_empty) + +lemma proper_map_id [simp]: + "proper_map X X id" +proof (clarsimp simp: proper_map_alt closed_map_id) + fix K + assume K: "compactin X K" + then have "{a \ topspace X. a \ K} = K" + by (simp add: compactin_subspace subset_antisym subset_iff) + then show "compactin X {a \ topspace X. a \ K}" + using K by auto +qed + +lemma proper_map_compose: + assumes "proper_map X Y f" "proper_map Y Z g" + shows "proper_map X Z (g \ f)" +proof - + have "closed_map X Y f" and f: "\K. compactin Y K \ compactin X {x \ topspace X. f x \ K}" + and "closed_map Y Z g" and g: "\K. compactin Z K \ compactin Y {x \ topspace Y. g x \ K}" + using assms by (auto simp: proper_map_alt) + show ?thesis + unfolding proper_map_alt + proof (intro conjI allI impI) + show "closed_map X Z (g \ f)" + using \closed_map X Y f\ \closed_map Y Z g\ closed_map_compose by blast + have "{x \ topspace X. g (f x) \ K} = {x \ topspace X. f x \ {b \ topspace Y. g b \ K}}" for K + using \closed_map X Y f\ closed_map_imp_subset_topspace by blast + then show "compactin X {x \ topspace X. (g \ f) x \ K}" + if "compactin Z K" for K + using f [OF g [OF that]] by auto + qed +qed + +lemma proper_map_const: + "proper_map X Y (\x. c) \ compact_space X \ (topspace X = {} \ closedin Y {c})" +proof (cases "topspace X = {}") + case True + then show ?thesis + by (simp add: compact_space_topspace_empty proper_map_on_empty) +next + case False + have *: "compactin X {x \ topspace X. c = y}" if "compact_space X" for y + proof (cases "c = y") + case True + then show ?thesis + using compact_space_def \compact_space X\ by auto + qed auto + then show ?thesis + using closed_compactin closedin_subset + by (force simp: False proper_map_def closed_map_const compact_space_def) +qed + +lemma proper_map_inclusion: + "s \ topspace X + \ proper_map (subtopology X s) X id \ closedin X s \ (\k. compactin X k \ compactin X (s \ k))" + by (auto simp: proper_map_alt closed_map_inclusion_eq inf.absorb_iff2 Collect_conj_eq compactin_subtopology intro: closed_Int_compactin) + + +subsection\Perfect maps (proper, continuous and surjective)\ + +definition perfect_map + where "perfect_map X Y f \ continuous_map X Y f \ proper_map X Y f \ f ` (topspace X) = topspace Y" + +lemma homeomorphic_imp_perfect_map: + "homeomorphic_map X Y f \ perfect_map X Y f" + by (simp add: homeomorphic_eq_everything_map homeomorphic_imp_proper_map perfect_map_def) + +lemma perfect_imp_quotient_map: + "perfect_map X Y f \ quotient_map X Y f" + by (simp add: continuous_closed_imp_quotient_map perfect_map_def proper_map_def) + +lemma homeomorphic_eq_injective_perfect_map: + "homeomorphic_map X Y f \ perfect_map X Y f \ inj_on f (topspace X)" + using homeomorphic_imp_perfect_map homeomorphic_map_def perfect_imp_quotient_map by blast + +lemma perfect_injective_eq_homeomorphic_map: + "perfect_map X Y f \ inj_on f (topspace X) \ homeomorphic_map X Y f" + by (simp add: homeomorphic_eq_injective_perfect_map) + +lemma perfect_map_id [simp]: "perfect_map X X id" + by (simp add: homeomorphic_imp_perfect_map) + +lemma perfect_map_compose: + "\perfect_map X Y f; perfect_map Y Z g\ \ perfect_map X Z (g \ f)" + by (meson continuous_map_compose perfect_imp_quotient_map perfect_map_def proper_map_compose quotient_map_compose_eq quotient_map_def) + +lemma perfect_imp_continuous_map: + "perfect_map X Y f \ continuous_map X Y f" + using perfect_map_def by blast + +lemma perfect_imp_closed_map: + "perfect_map X Y f \ closed_map X Y f" + by (simp add: perfect_map_def proper_map_def) + +lemma perfect_imp_proper_map: + "perfect_map X Y f \ proper_map X Y f" + by (simp add: perfect_map_def) + +lemma perfect_imp_surjective_map: + "perfect_map X Y f \ f ` (topspace X) = topspace Y" + by (simp add: perfect_map_def) end