src/HOL/Analysis/Homeomorphism.thy
changeset 64773 223b2ebdda79
parent 64394 141e1ed8d5a0
child 64789 6440577e34ee
equal deleted inserted replaced
64770:1ddc262514b8 64773:223b2ebdda79
  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