1110 done |
1110 done |
1111 qed |
1111 qed |
1112 |
1112 |
1113 |
1113 |
1114 lemma homeomorphic_convex_compact_lemma: |
1114 lemma homeomorphic_convex_compact_lemma: |
1115 fixes s :: "'a::euclidean_space set" |
1115 fixes S :: "'a::euclidean_space set" |
1116 assumes "convex s" |
1116 assumes "convex S" |
1117 and "compact s" |
1117 and "compact S" |
1118 and "cball 0 1 \<subseteq> s" |
1118 and "cball 0 1 \<subseteq> S" |
1119 shows "s homeomorphic (cball (0::'a) 1)" |
1119 shows "S homeomorphic (cball (0::'a) 1)" |
1120 proof (rule starlike_compact_projective_special[OF assms(2-3)]) |
1120 proof (rule starlike_compact_projective_special[OF assms(2-3)]) |
1121 fix x u |
1121 fix x u |
1122 assume "x \<in> s" and "0 \<le> u" and "u < (1::real)" |
1122 assume "x \<in> S" and "0 \<le> u" and "u < (1::real)" |
1123 have "open (ball (u *\<^sub>R x) (1 - u))" |
1123 have "open (ball (u *\<^sub>R x) (1 - u))" |
1124 by (rule open_ball) |
1124 by (rule open_ball) |
1125 moreover have "u *\<^sub>R x \<in> ball (u *\<^sub>R x) (1 - u)" |
1125 moreover have "u *\<^sub>R x \<in> ball (u *\<^sub>R x) (1 - u)" |
1126 unfolding centre_in_ball using \<open>u < 1\<close> by simp |
1126 unfolding centre_in_ball using \<open>u < 1\<close> by simp |
1127 moreover have "ball (u *\<^sub>R x) (1 - u) \<subseteq> s" |
1127 moreover have "ball (u *\<^sub>R x) (1 - u) \<subseteq> S" |
1128 proof |
1128 proof |
1129 fix y |
1129 fix y |
1130 assume "y \<in> ball (u *\<^sub>R x) (1 - u)" |
1130 assume "y \<in> ball (u *\<^sub>R x) (1 - u)" |
1131 then have "dist (u *\<^sub>R x) y < 1 - u" |
1131 then have "dist (u *\<^sub>R x) y < 1 - u" |
1132 unfolding mem_ball . |
1132 unfolding mem_ball . |
1133 with \<open>u < 1\<close> have "inverse (1 - u) *\<^sub>R (y - u *\<^sub>R x) \<in> cball 0 1" |
1133 with \<open>u < 1\<close> have "inverse (1 - u) *\<^sub>R (y - u *\<^sub>R x) \<in> cball 0 1" |
1134 by (simp add: dist_norm inverse_eq_divide norm_minus_commute) |
1134 by (simp add: dist_norm inverse_eq_divide norm_minus_commute) |
1135 with assms(3) have "inverse (1 - u) *\<^sub>R (y - u *\<^sub>R x) \<in> s" .. |
1135 with assms(3) have "inverse (1 - u) *\<^sub>R (y - u *\<^sub>R x) \<in> S" .. |
1136 with assms(1) have "(1 - u) *\<^sub>R ((y - u *\<^sub>R x) /\<^sub>R (1 - u)) + u *\<^sub>R x \<in> s" |
1136 with assms(1) have "(1 - u) *\<^sub>R ((y - u *\<^sub>R x) /\<^sub>R (1 - u)) + u *\<^sub>R x \<in> S" |
1137 using \<open>x \<in> s\<close> \<open>0 \<le> u\<close> \<open>u < 1\<close> [THEN less_imp_le] by (rule convexD_alt) |
1137 using \<open>x \<in> S\<close> \<open>0 \<le> u\<close> \<open>u < 1\<close> [THEN less_imp_le] by (rule convexD_alt) |
1138 then show "y \<in> s" using \<open>u < 1\<close> |
1138 then show "y \<in> S" using \<open>u < 1\<close> |
1139 by simp |
1139 by simp |
1140 qed |
1140 qed |
1141 ultimately have "u *\<^sub>R x \<in> interior s" .. |
1141 ultimately have "u *\<^sub>R x \<in> interior S" .. |
1142 then show "u *\<^sub>R x \<in> s - frontier s" |
1142 then show "u *\<^sub>R x \<in> S - frontier S" |
1143 using frontier_def and interior_subset by auto |
1143 using frontier_def and interior_subset by auto |
1144 qed |
1144 qed |
1145 |
1145 |
1146 proposition homeomorphic_convex_compact_cball: |
1146 proposition homeomorphic_convex_compact_cball: |
1147 fixes e :: real |
1147 fixes e :: real |
1148 and s :: "'a::euclidean_space set" |
1148 and S :: "'a::euclidean_space set" |
1149 assumes "convex s" |
1149 assumes "convex S" |
1150 and "compact s" |
1150 and "compact S" |
1151 and "interior s \<noteq> {}" |
1151 and "interior S \<noteq> {}" |
1152 and "e > 0" |
1152 and "e > 0" |
1153 shows "s homeomorphic (cball (b::'a) e)" |
1153 shows "S homeomorphic (cball (b::'a) e)" |
1154 proof - |
1154 proof - |
1155 obtain a where "a \<in> interior s" |
1155 obtain a where "a \<in> interior S" |
1156 using assms(3) by auto |
1156 using assms(3) by auto |
1157 then obtain d where "d > 0" and d: "cball a d \<subseteq> s" |
1157 then obtain d where "d > 0" and d: "cball a d \<subseteq> S" |
1158 unfolding mem_interior_cball by auto |
1158 unfolding mem_interior_cball by auto |
1159 let ?d = "inverse d" and ?n = "0::'a" |
1159 let ?d = "inverse d" and ?n = "0::'a" |
1160 have "cball ?n 1 \<subseteq> (\<lambda>x. inverse d *\<^sub>R (x - a)) ` s" |
1160 have "cball ?n 1 \<subseteq> (\<lambda>x. inverse d *\<^sub>R (x - a)) ` S" |
1161 apply rule |
1161 apply rule |
1162 apply (rule_tac x="d *\<^sub>R x + a" in image_eqI) |
1162 apply (rule_tac x="d *\<^sub>R x + a" in image_eqI) |
1163 defer |
1163 defer |
1164 apply (rule d[unfolded subset_eq, rule_format]) |
1164 apply (rule d[unfolded subset_eq, rule_format]) |
1165 using \<open>d > 0\<close> |
1165 using \<open>d > 0\<close> |
1166 unfolding mem_cball dist_norm |
1166 unfolding mem_cball dist_norm |
1167 apply (auto simp add: mult_right_le_one_le) |
1167 apply (auto simp add: mult_right_le_one_le) |
1168 done |
1168 done |
1169 then have "(\<lambda>x. inverse d *\<^sub>R (x - a)) ` s homeomorphic cball ?n 1" |
1169 then have "(\<lambda>x. inverse d *\<^sub>R (x - a)) ` S homeomorphic cball ?n 1" |
1170 using homeomorphic_convex_compact_lemma[of "(\<lambda>x. ?d *\<^sub>R -a + ?d *\<^sub>R x) ` s", |
1170 using homeomorphic_convex_compact_lemma[of "(\<lambda>x. ?d *\<^sub>R -a + ?d *\<^sub>R x) ` S", |
1171 OF convex_affinity compact_affinity] |
1171 OF convex_affinity compact_affinity] |
1172 using assms(1,2) |
1172 using assms(1,2) |
1173 by (auto simp add: scaleR_right_diff_distrib) |
1173 by (auto simp add: scaleR_right_diff_distrib) |
1174 then show ?thesis |
1174 then show ?thesis |
1175 apply (rule_tac homeomorphic_trans[OF _ homeomorphic_balls(2)[of 1 _ ?n]]) |
1175 apply (rule_tac homeomorphic_trans[OF _ homeomorphic_balls(2)[of 1 _ ?n]]) |
1176 apply (rule homeomorphic_trans[OF homeomorphic_affinity[of "?d" s "?d *\<^sub>R -a"]]) |
1176 apply (rule homeomorphic_trans[OF homeomorphic_affinity[of "?d" S "?d *\<^sub>R -a"]]) |
1177 using \<open>d>0\<close> \<open>e>0\<close> |
1177 using \<open>d>0\<close> \<open>e>0\<close> |
1178 apply (auto simp add: scaleR_right_diff_distrib) |
1178 apply (auto simp add: scaleR_right_diff_distrib) |
1179 done |
1179 done |
1180 qed |
1180 qed |
1181 |
1181 |
1182 corollary homeomorphic_convex_compact: |
1182 corollary homeomorphic_convex_compact: |
1183 fixes s :: "'a::euclidean_space set" |
1183 fixes S :: "'a::euclidean_space set" |
1184 and t :: "'a set" |
1184 and T :: "'a set" |
1185 assumes "convex s" "compact s" "interior s \<noteq> {}" |
1185 assumes "convex S" "compact S" "interior S \<noteq> {}" |
1186 and "convex t" "compact t" "interior t \<noteq> {}" |
1186 and "convex T" "compact T" "interior T \<noteq> {}" |
1187 shows "s homeomorphic t" |
1187 shows "S homeomorphic T" |
1188 using assms |
1188 using assms |
1189 by (meson zero_less_one homeomorphic_trans homeomorphic_convex_compact_cball homeomorphic_sym) |
1189 by (meson zero_less_one homeomorphic_trans homeomorphic_convex_compact_cball homeomorphic_sym) |
1190 |
1190 |
1191 subsection\<open>Covering spaces and lifting results for them\<close> |
1191 subsection\<open>Covering spaces and lifting results for them\<close> |
1192 |
1192 |
1193 definition covering_space |
1193 definition covering_space |
1194 :: "'a::topological_space set \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'b::topological_space set \<Rightarrow> bool" |
1194 :: "'a::topological_space set \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'b::topological_space set \<Rightarrow> bool" |
1195 where |
1195 where |
1196 "covering_space c p s \<equiv> |
1196 "covering_space c p S \<equiv> |
1197 continuous_on c p \<and> p ` c = s \<and> |
1197 continuous_on c p \<and> p ` c = S \<and> |
1198 (\<forall>x \<in> s. \<exists>t. x \<in> t \<and> openin (subtopology euclidean s) t \<and> |
1198 (\<forall>x \<in> S. \<exists>T. x \<in> T \<and> openin (subtopology euclidean S) T \<and> |
1199 (\<exists>v. \<Union>v = {x. x \<in> c \<and> p x \<in> t} \<and> |
1199 (\<exists>v. \<Union>v = {x. x \<in> c \<and> p x \<in> T} \<and> |
1200 (\<forall>u \<in> v. openin (subtopology euclidean c) u) \<and> |
1200 (\<forall>u \<in> v. openin (subtopology euclidean c) u) \<and> |
1201 pairwise disjnt v \<and> |
1201 pairwise disjnt v \<and> |
1202 (\<forall>u \<in> v. \<exists>q. homeomorphism u t p q)))" |
1202 (\<forall>u \<in> v. \<exists>q. homeomorphism u T p q)))" |
1203 |
1203 |
1204 lemma covering_space_imp_continuous: "covering_space c p s \<Longrightarrow> continuous_on c p" |
1204 lemma covering_space_imp_continuous: "covering_space c p S \<Longrightarrow> continuous_on c p" |
1205 by (simp add: covering_space_def) |
1205 by (simp add: covering_space_def) |
1206 |
1206 |
1207 lemma covering_space_imp_surjective: "covering_space c p s \<Longrightarrow> p ` c = s" |
1207 lemma covering_space_imp_surjective: "covering_space c p S \<Longrightarrow> p ` c = S" |
1208 by (simp add: covering_space_def) |
1208 by (simp add: covering_space_def) |
1209 |
1209 |
1210 lemma homeomorphism_imp_covering_space: "homeomorphism s t f g \<Longrightarrow> covering_space s f t" |
1210 lemma homeomorphism_imp_covering_space: "homeomorphism S T f g \<Longrightarrow> covering_space S f T" |
1211 apply (simp add: homeomorphism_def covering_space_def, clarify) |
1211 apply (simp add: homeomorphism_def covering_space_def, clarify) |
1212 apply (rule_tac x=t in exI, simp) |
1212 apply (rule_tac x=T in exI, simp) |
1213 apply (rule_tac x="{s}" in exI, auto) |
1213 apply (rule_tac x="{S}" in exI, auto) |
1214 done |
1214 done |
1215 |
1215 |
1216 lemma covering_space_local_homeomorphism: |
1216 lemma covering_space_local_homeomorphism: |
1217 assumes "covering_space c p s" "x \<in> c" |
1217 assumes "covering_space c p S" "x \<in> c" |
1218 obtains t u q where "x \<in> t" "openin (subtopology euclidean c) t" |
1218 obtains T u q where "x \<in> T" "openin (subtopology euclidean c) T" |
1219 "p x \<in> u" "openin (subtopology euclidean s) u" |
1219 "p x \<in> u" "openin (subtopology euclidean S) u" |
1220 "homeomorphism t u p q" |
1220 "homeomorphism T u p q" |
1221 using assms |
1221 using assms |
1222 apply (simp add: covering_space_def, clarify) |
1222 apply (simp add: covering_space_def, clarify) |
1223 apply (drule_tac x="p x" in bspec, force) |
1223 apply (drule_tac x="p x" in bspec, force) |
1224 by (metis (no_types, lifting) Union_iff mem_Collect_eq) |
1224 by (metis (no_types, lifting) Union_iff mem_Collect_eq) |
1225 |
1225 |
1226 |
1226 |
1227 lemma covering_space_local_homeomorphism_alt: |
1227 lemma covering_space_local_homeomorphism_alt: |
1228 assumes p: "covering_space c p s" and "y \<in> s" |
1228 assumes p: "covering_space c p S" and "y \<in> S" |
1229 obtains x t u q where "p x = y" |
1229 obtains x T u q where "p x = y" |
1230 "x \<in> t" "openin (subtopology euclidean c) t" |
1230 "x \<in> T" "openin (subtopology euclidean c) T" |
1231 "y \<in> u" "openin (subtopology euclidean s) u" |
1231 "y \<in> u" "openin (subtopology euclidean S) u" |
1232 "homeomorphism t u p q" |
1232 "homeomorphism T u p q" |
1233 proof - |
1233 proof - |
1234 obtain x where "p x = y" "x \<in> c" |
1234 obtain x where "p x = y" "x \<in> c" |
1235 using assms covering_space_imp_surjective by blast |
1235 using assms covering_space_imp_surjective by blast |
1236 show ?thesis |
1236 show ?thesis |
1237 apply (rule covering_space_local_homeomorphism [OF p \<open>x \<in> c\<close>]) |
1237 apply (rule covering_space_local_homeomorphism [OF p \<open>x \<in> c\<close>]) |
1238 using that \<open>p x = y\<close> by blast |
1238 using that \<open>p x = y\<close> by blast |
1239 qed |
1239 qed |
1240 |
1240 |
1241 proposition covering_space_open_map: |
1241 proposition covering_space_open_map: |
1242 fixes s :: "'a :: metric_space set" and t :: "'b :: metric_space set" |
1242 fixes S :: "'a :: metric_space set" and T :: "'b :: metric_space set" |
1243 assumes p: "covering_space c p s" and t: "openin (subtopology euclidean c) t" |
1243 assumes p: "covering_space c p S" and T: "openin (subtopology euclidean c) T" |
1244 shows "openin (subtopology euclidean s) (p ` t)" |
1244 shows "openin (subtopology euclidean S) (p ` T)" |
1245 proof - |
1245 proof - |
1246 have pce: "p ` c = s" |
1246 have pce: "p ` c = S" |
1247 and covs: |
1247 and covs: |
1248 "\<And>x. x \<in> s \<Longrightarrow> |
1248 "\<And>x. x \<in> S \<Longrightarrow> |
1249 \<exists>X VS. x \<in> X \<and> openin (subtopology euclidean s) X \<and> |
1249 \<exists>X VS. x \<in> X \<and> openin (subtopology euclidean S) X \<and> |
1250 \<Union>VS = {x. x \<in> c \<and> p x \<in> X} \<and> |
1250 \<Union>VS = {x. x \<in> c \<and> p x \<in> X} \<and> |
1251 (\<forall>u \<in> VS. openin (subtopology euclidean c) u) \<and> |
1251 (\<forall>u \<in> VS. openin (subtopology euclidean c) u) \<and> |
1252 pairwise disjnt VS \<and> |
1252 pairwise disjnt VS \<and> |
1253 (\<forall>u \<in> VS. \<exists>q. homeomorphism u X p q)" |
1253 (\<forall>u \<in> VS. \<exists>q. homeomorphism u X p q)" |
1254 using p by (auto simp: covering_space_def) |
1254 using p by (auto simp: covering_space_def) |
1255 have "t \<subseteq> c" by (metis openin_euclidean_subtopology_iff t) |
1255 have "T \<subseteq> c" by (metis openin_euclidean_subtopology_iff T) |
1256 have "\<exists>T. openin (subtopology euclidean s) T \<and> y \<in> T \<and> T \<subseteq> p ` t" |
1256 have "\<exists>X. openin (subtopology euclidean S) X \<and> y \<in> X \<and> X \<subseteq> p ` T" |
1257 if "y \<in> p ` t" for y |
1257 if "y \<in> p ` T" for y |
1258 proof - |
1258 proof - |
1259 have "y \<in> s" using \<open>t \<subseteq> c\<close> pce that by blast |
1259 have "y \<in> S" using \<open>T \<subseteq> c\<close> pce that by blast |
1260 obtain U VS where "y \<in> U" and U: "openin (subtopology euclidean s) U" |
1260 obtain U VS where "y \<in> U" and U: "openin (subtopology euclidean S) U" |
1261 and VS: "\<Union>VS = {x. x \<in> c \<and> p x \<in> U}" |
1261 and VS: "\<Union>VS = {x. x \<in> c \<and> p x \<in> U}" |
1262 and openVS: "\<forall>V \<in> VS. openin (subtopology euclidean c) V" |
1262 and openVS: "\<forall>V \<in> VS. openin (subtopology euclidean c) V" |
1263 and homVS: "\<And>V. V \<in> VS \<Longrightarrow> \<exists>q. homeomorphism V U p q" |
1263 and homVS: "\<And>V. V \<in> VS \<Longrightarrow> \<exists>q. homeomorphism V U p q" |
1264 using covs [OF \<open>y \<in> s\<close>] by auto |
1264 using covs [OF \<open>y \<in> S\<close>] by auto |
1265 obtain x where "x \<in> c" "p x \<in> U" "x \<in> t" "p x = y" |
1265 obtain x where "x \<in> c" "p x \<in> U" "x \<in> T" "p x = y" |
1266 apply simp |
1266 apply simp |
1267 using t [unfolded openin_euclidean_subtopology_iff] \<open>y \<in> U\<close> \<open>y \<in> p ` t\<close> by blast |
1267 using T [unfolded openin_euclidean_subtopology_iff] \<open>y \<in> U\<close> \<open>y \<in> p ` T\<close> by blast |
1268 with VS obtain V where "x \<in> V" "V \<in> VS" by auto |
1268 with VS obtain V where "x \<in> V" "V \<in> VS" by auto |
1269 then obtain q where q: "homeomorphism V U p q" using homVS by blast |
1269 then obtain q where q: "homeomorphism V U p q" using homVS by blast |
1270 then have ptV: "p ` (t \<inter> V) = U \<inter> {z. q z \<in> (t \<inter> V)}" |
1270 then have ptV: "p ` (T \<inter> V) = U \<inter> {z. q z \<in> (T \<inter> V)}" |
1271 using VS \<open>V \<in> VS\<close> by (auto simp: homeomorphism_def) |
1271 using VS \<open>V \<in> VS\<close> by (auto simp: homeomorphism_def) |
1272 have ocv: "openin (subtopology euclidean c) V" |
1272 have ocv: "openin (subtopology euclidean c) V" |
1273 by (simp add: \<open>V \<in> VS\<close> openVS) |
1273 by (simp add: \<open>V \<in> VS\<close> openVS) |
1274 have "openin (subtopology euclidean U) {z \<in> U. q z \<in> t \<inter> V}" |
1274 have "openin (subtopology euclidean U) {z \<in> U. q z \<in> T \<inter> V}" |
1275 apply (rule continuous_on_open [THEN iffD1, rule_format]) |
1275 apply (rule continuous_on_open [THEN iffD1, rule_format]) |
1276 using homeomorphism_def q apply blast |
1276 using homeomorphism_def q apply blast |
1277 using openin_subtopology_Int_subset [of c] q t unfolding homeomorphism_def |
1277 using openin_subtopology_Int_subset [of c] q T unfolding homeomorphism_def |
1278 by (metis inf.absorb_iff2 Int_commute ocv openin_euclidean_subtopology_iff) |
1278 by (metis inf.absorb_iff2 Int_commute ocv openin_euclidean_subtopology_iff) |
1279 then have os: "openin (subtopology euclidean s) (U \<inter> {z. q z \<in> t \<inter> V})" |
1279 then have os: "openin (subtopology euclidean S) (U \<inter> {z. q z \<in> T \<inter> V})" |
1280 using openin_trans [of U] by (simp add: Collect_conj_eq U) |
1280 using openin_trans [of U] by (simp add: Collect_conj_eq U) |
1281 show ?thesis |
1281 show ?thesis |
1282 apply (rule_tac x = "p ` (t \<inter> V)" in exI) |
1282 apply (rule_tac x = "p ` (T \<inter> V)" in exI) |
1283 apply (rule conjI) |
1283 apply (rule conjI) |
1284 apply (simp only: ptV os) |
1284 apply (simp only: ptV os) |
1285 using \<open>p x = y\<close> \<open>x \<in> V\<close> \<open>x \<in> t\<close> apply blast |
1285 using \<open>p x = y\<close> \<open>x \<in> V\<close> \<open>x \<in> T\<close> apply blast |
1286 done |
1286 done |
1287 qed |
1287 qed |
1288 with openin_subopen show ?thesis by blast |
1288 with openin_subopen show ?thesis by blast |
1289 qed |
1289 qed |
1290 |
1290 |
1291 lemma covering_space_lift_unique_gen: |
1291 lemma covering_space_lift_unique_gen: |
1292 fixes f :: "'a::topological_space \<Rightarrow> 'b::topological_space" |
1292 fixes f :: "'a::topological_space \<Rightarrow> 'b::topological_space" |
1293 fixes g1 :: "'a \<Rightarrow> 'c::real_normed_vector" |
1293 fixes g1 :: "'a \<Rightarrow> 'c::real_normed_vector" |
1294 assumes cov: "covering_space c p s" |
1294 assumes cov: "covering_space c p S" |
1295 and eq: "g1 a = g2 a" |
1295 and eq: "g1 a = g2 a" |
1296 and f: "continuous_on t f" "f ` t \<subseteq> s" |
1296 and f: "continuous_on T f" "f ` T \<subseteq> S" |
1297 and g1: "continuous_on t g1" "g1 ` t \<subseteq> c" |
1297 and g1: "continuous_on T g1" "g1 ` T \<subseteq> c" |
1298 and fg1: "\<And>x. x \<in> t \<Longrightarrow> f x = p(g1 x)" |
1298 and fg1: "\<And>x. x \<in> T \<Longrightarrow> f x = p(g1 x)" |
1299 and g2: "continuous_on t g2" "g2 ` t \<subseteq> c" |
1299 and g2: "continuous_on T g2" "g2 ` T \<subseteq> c" |
1300 and fg2: "\<And>x. x \<in> t \<Longrightarrow> f x = p(g2 x)" |
1300 and fg2: "\<And>x. x \<in> T \<Longrightarrow> f x = p(g2 x)" |
1301 and u_compt: "u \<in> components t" and "a \<in> u" "x \<in> u" |
1301 and u_compt: "U \<in> components T" and "a \<in> U" "x \<in> U" |
1302 shows "g1 x = g2 x" |
1302 shows "g1 x = g2 x" |
1303 proof - |
1303 proof - |
1304 have "u \<subseteq> t" by (rule in_components_subset [OF u_compt]) |
1304 have "U \<subseteq> T" by (rule in_components_subset [OF u_compt]) |
1305 def G12 \<equiv> "{x \<in> u. g1 x - g2 x = 0}" |
1305 def G12 \<equiv> "{x \<in> U. g1 x - g2 x = 0}" |
1306 have "connected u" by (rule in_components_connected [OF u_compt]) |
1306 have "connected U" by (rule in_components_connected [OF u_compt]) |
1307 have contu: "continuous_on u g1" "continuous_on u g2" |
1307 have contu: "continuous_on U g1" "continuous_on U g2" |
1308 using \<open>u \<subseteq> t\<close> continuous_on_subset g1 g2 by blast+ |
1308 using \<open>U \<subseteq> T\<close> continuous_on_subset g1 g2 by blast+ |
1309 have o12: "openin (subtopology euclidean u) G12" |
1309 have o12: "openin (subtopology euclidean U) G12" |
1310 unfolding G12_def |
1310 unfolding G12_def |
1311 proof (subst openin_subopen, clarify) |
1311 proof (subst openin_subopen, clarify) |
1312 fix z |
1312 fix z |
1313 assume z: "z \<in> u" "g1 z - g2 z = 0" |
1313 assume z: "z \<in> U" "g1 z - g2 z = 0" |
1314 obtain v w q where "g1 z \<in> v" and ocv: "openin (subtopology euclidean c) v" |
1314 obtain v w q where "g1 z \<in> v" and ocv: "openin (subtopology euclidean c) v" |
1315 and "p (g1 z) \<in> w" and osw: "openin (subtopology euclidean s) w" |
1315 and "p (g1 z) \<in> w" and osw: "openin (subtopology euclidean S) w" |
1316 and hom: "homeomorphism v w p q" |
1316 and hom: "homeomorphism v w p q" |
1317 apply (rule_tac x = "g1 z" in covering_space_local_homeomorphism [OF cov]) |
1317 apply (rule_tac x = "g1 z" in covering_space_local_homeomorphism [OF cov]) |
1318 using \<open>u \<subseteq> t\<close> \<open>z \<in> u\<close> g1(2) apply blast+ |
1318 using \<open>U \<subseteq> T\<close> \<open>z \<in> U\<close> g1(2) apply blast+ |
1319 done |
1319 done |
1320 have "g2 z \<in> v" using \<open>g1 z \<in> v\<close> z by auto |
1320 have "g2 z \<in> v" using \<open>g1 z \<in> v\<close> z by auto |
1321 have gg: "{x \<in> u. g x \<in> v} = {x \<in> u. g x \<in> (v \<inter> g ` u)}" for g |
1321 have gg: "{x \<in> U. g x \<in> v} = {x \<in> U. g x \<in> (v \<inter> g ` U)}" for g |
1322 by auto |
1322 by auto |
1323 have "openin (subtopology euclidean (g1 ` u)) (v \<inter> g1 ` u)" |
1323 have "openin (subtopology euclidean (g1 ` U)) (v \<inter> g1 ` U)" |
1324 using ocv \<open>u \<subseteq> t\<close> g1 by (fastforce simp add: openin_open) |
1324 using ocv \<open>U \<subseteq> T\<close> g1 by (fastforce simp add: openin_open) |
1325 then have 1: "openin (subtopology euclidean u) {x \<in> u. g1 x \<in> v}" |
1325 then have 1: "openin (subtopology euclidean U) {x \<in> U. g1 x \<in> v}" |
1326 unfolding gg by (blast intro: contu continuous_on_open [THEN iffD1, rule_format]) |
1326 unfolding gg by (blast intro: contu continuous_on_open [THEN iffD1, rule_format]) |
1327 have "openin (subtopology euclidean (g2 ` u)) (v \<inter> g2 ` u)" |
1327 have "openin (subtopology euclidean (g2 ` U)) (v \<inter> g2 ` U)" |
1328 using ocv \<open>u \<subseteq> t\<close> g2 by (fastforce simp add: openin_open) |
1328 using ocv \<open>U \<subseteq> T\<close> g2 by (fastforce simp add: openin_open) |
1329 then have 2: "openin (subtopology euclidean u) {x \<in> u. g2 x \<in> v}" |
1329 then have 2: "openin (subtopology euclidean U) {x \<in> U. g2 x \<in> v}" |
1330 unfolding gg by (blast intro: contu continuous_on_open [THEN iffD1, rule_format]) |
1330 unfolding gg by (blast intro: contu continuous_on_open [THEN iffD1, rule_format]) |
1331 show "\<exists>T. openin (subtopology euclidean u) T \<and> |
1331 show "\<exists>T. openin (subtopology euclidean U) T \<and> |
1332 z \<in> T \<and> T \<subseteq> {z \<in> u. g1 z - g2 z = 0}" |
1332 z \<in> T \<and> T \<subseteq> {z \<in> U. g1 z - g2 z = 0}" |
1333 using z |
1333 using z |
1334 apply (rule_tac x = "{x. x \<in> u \<and> g1 x \<in> v} \<inter> {x. x \<in> u \<and> g2 x \<in> v}" in exI) |
1334 apply (rule_tac x = "{x. x \<in> U \<and> g1 x \<in> v} \<inter> {x. x \<in> U \<and> g2 x \<in> v}" in exI) |
1335 apply (intro conjI) |
1335 apply (intro conjI) |
1336 apply (rule openin_Int [OF 1 2]) |
1336 apply (rule openin_Int [OF 1 2]) |
1337 using \<open>g1 z \<in> v\<close> \<open>g2 z \<in> v\<close> apply (force simp:, clarify) |
1337 using \<open>g1 z \<in> v\<close> \<open>g2 z \<in> v\<close> apply (force simp:, clarify) |
1338 apply (metis \<open>u \<subseteq> t\<close> subsetD eq_iff_diff_eq_0 fg1 fg2 hom homeomorphism_def) |
1338 apply (metis \<open>U \<subseteq> T\<close> subsetD eq_iff_diff_eq_0 fg1 fg2 hom homeomorphism_def) |
1339 done |
1339 done |
1340 qed |
1340 qed |
1341 have c12: "closedin (subtopology euclidean u) G12" |
1341 have c12: "closedin (subtopology euclidean U) G12" |
1342 unfolding G12_def |
1342 unfolding G12_def |
1343 by (intro continuous_intros continuous_closedin_preimage_constant contu) |
1343 by (intro continuous_intros continuous_closedin_preimage_constant contu) |
1344 have "G12 = {} \<or> G12 = u" |
1344 have "G12 = {} \<or> G12 = U" |
1345 by (intro connected_clopen [THEN iffD1, rule_format] \<open>connected u\<close> conjI o12 c12) |
1345 by (intro connected_clopen [THEN iffD1, rule_format] \<open>connected U\<close> conjI o12 c12) |
1346 with eq \<open>a \<in> u\<close> have "\<And>x. x \<in> u \<Longrightarrow> g1 x - g2 x = 0" by (auto simp: G12_def) |
1346 with eq \<open>a \<in> U\<close> have "\<And>x. x \<in> U \<Longrightarrow> g1 x - g2 x = 0" by (auto simp: G12_def) |
1347 then show ?thesis |
1347 then show ?thesis |
1348 using \<open>x \<in> u\<close> by force |
1348 using \<open>x \<in> U\<close> by force |
1349 qed |
1349 qed |
1350 |
1350 |
1351 proposition covering_space_lift_unique: |
1351 proposition covering_space_lift_unique: |
1352 fixes f :: "'a::topological_space \<Rightarrow> 'b::topological_space" |
1352 fixes f :: "'a::topological_space \<Rightarrow> 'b::topological_space" |
1353 fixes g1 :: "'a \<Rightarrow> 'c::real_normed_vector" |
1353 fixes g1 :: "'a \<Rightarrow> 'c::real_normed_vector" |
1354 assumes "covering_space c p s" |
1354 assumes "covering_space c p S" |
1355 "g1 a = g2 a" |
1355 "g1 a = g2 a" |
1356 "continuous_on t f" "f ` t \<subseteq> s" |
1356 "continuous_on T f" "f ` T \<subseteq> S" |
1357 "continuous_on t g1" "g1 ` t \<subseteq> c" "\<And>x. x \<in> t \<Longrightarrow> f x = p(g1 x)" |
1357 "continuous_on T g1" "g1 ` T \<subseteq> c" "\<And>x. x \<in> T \<Longrightarrow> f x = p(g1 x)" |
1358 "continuous_on t g2" "g2 ` t \<subseteq> c" "\<And>x. x \<in> t \<Longrightarrow> f x = p(g2 x)" |
1358 "continuous_on T g2" "g2 ` T \<subseteq> c" "\<And>x. x \<in> T \<Longrightarrow> f x = p(g2 x)" |
1359 "connected t" "a \<in> t" "x \<in> t" |
1359 "connected T" "a \<in> T" "x \<in> T" |
1360 shows "g1 x = g2 x" |
1360 shows "g1 x = g2 x" |
1361 using covering_space_lift_unique_gen [of c p s] in_components_self assms ex_in_conv by blast |
1361 using covering_space_lift_unique_gen [of c p S] in_components_self assms ex_in_conv by blast |
1362 |
1362 |
1363 end |
1363 end |