# HG changeset patch # User paulson # Date 1483636213 0 # Node ID 3074080f4f12be96256b24b1181b1672b2d28b3e # Parent 05a2b3b206642f11a61d26c1b6e718cea083848a covering space lift lemmas diff -r 05a2b3b20664 -r 3074080f4f12 src/HOL/Analysis/Homeomorphism.thy --- a/src/HOL/Analysis/Homeomorphism.thy Thu Jan 05 16:37:49 2017 +0000 +++ b/src/HOL/Analysis/Homeomorphism.thy Thu Jan 05 17:10:13 2017 +0000 @@ -1388,7 +1388,6 @@ shows "g1 x = g2 x" using covering_space_lift_unique_gen [of c p S] in_components_self assms ex_in_conv by blast - lemma covering_space_locally: fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" assumes loc: "locally \ C" and cov: "covering_space C p S" @@ -1511,4 +1510,914 @@ shows "locally path_connected S" using assms covering_space_locally_path_connected_eq by blast +proposition covering_space_lift_homotopy: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and h :: "real \ 'c::real_normed_vector \ 'b" + assumes cov: "covering_space C p S" + and conth: "continuous_on ({0..1} \ U) h" + and him: "h ` ({0..1} \ U) \ S" + and heq: "\y. y \ U \ h (0,y) = p(f y)" + and contf: "continuous_on U f" and fim: "f ` U \ C" + obtains k where "continuous_on ({0..1} \ U) k" + "k ` ({0..1} \ U) \ C" + "\y. y \ U \ k(0, y) = f y" + "\z. z \ {0..1} \ U \ h z = p(k z)" +proof - + have "\V k. openin (subtopology euclidean U) V \ y \ V \ + continuous_on ({0..1} \ V) k \ k ` ({0..1} \ V) \ C \ + (\z \ V. k(0, z) = f z) \ (\z \ {0..1} \ V. h z = p(k z))" + if "y \ U" for y + proof - + obtain UU where UU: "\s. s \ S \ s \ (UU s) \ openin (subtopology euclidean S) (UU s) \ + (\\. \\ = {x. x \ C \ p x \ (UU s)} \ + (\U \ \. openin (subtopology euclidean C) U) \ + pairwise disjnt \ \ + (\U \ \. \q. homeomorphism U (UU s) p q))" + using cov unfolding covering_space_def by (metis (mono_tags)) + then have ope: "\s. s \ S \ s \ (UU s) \ openin (subtopology euclidean S) (UU s)" + by blast + have "\k n i. open k \ open n \ + t \ k \ y \ n \ i \ S \ h ` (({0..1} \ k) \ (U \ n)) \ UU i" if "t \ {0..1}" for t + proof - + have hinS: "h (t, y) \ S" + using \y \ U\ him that by blast + then have "(t,y) \ {z \ {0..1} \ U. h z \ UU (h (t, y))}" + using \y \ U\ \t \ {0..1}\ by (auto simp: ope) + moreover have ope_01U: "openin (subtopology euclidean ({0..1} \ U)) {z. z \ ({0..1} \ U) \ h z \ UU(h(t, y))}" + using hinS ope continuous_on_open_gen [OF him] conth by blast + ultimately obtain V W where opeV: "open V" and "t \ {0..1} \ V" "t \ {0..1} \ V" + and opeW: "open W" and "y \ U" "y \ W" + and VW: "({0..1} \ V) \ (U \ W) \ {z. z \ ({0..1} \ U) \ h z \ UU(h(t, y))}" + by (rule Times_in_interior_subtopology) (auto simp: openin_open) + then show ?thesis + using hinS by blast + qed + then obtain K NN X where + K: "\t. t \ {0..1} \ open (K t)" + and NN: "\t. t \ {0..1} \ open (NN t)" + and inUS: "\t. t \ {0..1} \ t \ K t \ y \ NN t \ X t \ S" + and him: "\t. t \ {0..1} \ h ` (({0..1} \ K t) \ (U \ NN t)) \ UU (X t)" + by (metis (mono_tags)) + obtain \ where "\ \ ((\i. K i \ NN i)) ` {0..1}" "finite \" "{0::real..1} \ {y} \ \\" + proof (rule compactE) + show "compact ({0::real..1} \ {y})" + by (simp add: compact_Times) + show "{0..1} \ {y} \ (\i\{0..1}. K i \ NN i)" + using K inUS by auto + show "\B. B \ (\i. K i \ NN i) ` {0..1} \ open B" + using K NN by (auto simp: open_Times) + qed blast + then obtain tk where "tk \ {0..1}" "finite tk" + and tk: "{0::real..1} \ {y} \ (\i \ tk. K i \ NN i)" + by (metis (no_types, lifting) finite_subset_image) + then have "tk \ {}" + by auto + define n where "n = INTER tk NN" + have "y \ n" "open n" + using inUS NN \tk \ {0..1}\ \finite tk\ + by (auto simp: n_def open_INT subset_iff) + obtain \ where "0 < \" and \: "\T. \T \ {0..1}; diameter T < \\ \ \B\K ` tk. T \ B" + proof (rule Lebesgue_number_lemma [of "{0..1}" "K ` tk"]) + show "K ` tk \ {}" + using \tk \ {}\ by auto + show "{0..1} \ UNION tk K" + using tk by auto + show "\B. B \ K ` tk \ open B" + using \tk \ {0..1}\ K by auto + qed auto + obtain N::nat where N: "N > 1 / \" + using reals_Archimedean2 by blast + then have "N > 0" + using \0 < \\ order.asym by force + have *: "\V k. openin (subtopology euclidean U) V \ y \ V \ + continuous_on ({0..of_nat n / N} \ V) k \ + k ` ({0..of_nat n / N} \ V) \ C \ + (\z\V. k (0, z) = f z) \ + (\z\{0..of_nat n / N} \ V. h z = p (k z))" if "n \ N" for n + using that + proof (induction n) + case 0 + show ?case + apply (rule_tac x=U in exI) + apply (rule_tac x="f \ snd" in exI) + apply (intro conjI \y \ U\ continuous_intros continuous_on_subset [OF contf]) + using fim apply (auto simp: heq) + done + next + case (Suc n) + then obtain V k where opeUV: "openin (subtopology euclidean U) V" + and "y \ V" + and contk: "continuous_on ({0..real n / real N} \ V) k" + and kim: "k ` ({0..real n / real N} \ V) \ C" + and keq: "\z. z \ V \ k (0, z) = f z" + and heq: "\z. z \ {0..real n / real N} \ V \ h z = p (k z)" + using Suc_leD by auto + have "n \ N" + using Suc.prems by auto + obtain t where "t \ tk" and t: "{real n / real N .. (1 + real n) / real N} \ K t" + proof (rule bexE [OF \]) + show "{real n / real N .. (1 + real n) / real N} \ {0..1}" + using Suc.prems by (auto simp: divide_simps algebra_simps) + show diameter_less: "diameter {real n / real N .. (1 + real n) / real N} < \" + using \0 < \\ N by (auto simp: divide_simps algebra_simps) + qed blast + have t01: "t \ {0..1}" + using \t \ tk\ \tk \ {0..1}\ by blast + obtain \ where "\\ = {x. x \ C \ p x \ (UU (X t))}" + and opeC: "\U. U \ \ \ openin (subtopology euclidean C) U" + and "pairwise disjnt \" + and homuu: "\U. U \ \ \ \q. homeomorphism U (UU (X t)) p q" + using inUS [OF t01] UU by meson + have n_div_N_in: "real n / real N \ {real n / real N .. (1 + real n) / real N}" + using N by (auto simp: divide_simps algebra_simps) + with t have nN_in_kkt: "real n / real N \ K t" + by blast + have "k (real n / real N, y) \ {x. x \ C \ p x \ (UU (X t))}" + proof (simp, rule conjI) + show "k (real n / real N, y) \ C" + using \y \ V\ kim keq by force + have "p (k (real n / real N, y)) = h (real n / real N, y)" + by (simp add: \y \ V\ heq) + also have "... \ h ` (({0..1} \ K t) \ (U \ NN t))" + apply (rule imageI) + using \y \ V\ t01 \n \ N\ + apply (simp add: nN_in_kkt \y \ U\ inUS divide_simps) + done + also have "... \ UU (X t)" + using him t01 by blast + finally show "p (k (real n / real N, y)) \ UU (X t)" . + qed + then have "k (real n / real N, y) \ \\" + using \\\ = {x \ C. p x \ UU (X t)}\ by blast + then obtain W where W: "k (real n / real N, y) \ W" and "W \ \" + by blast + then obtain p' where opeC': "openin (subtopology euclidean C) W" + and hom': "homeomorphism W (UU (X t)) p p'" + using homuu opeC by blast + then have "W \ C" + using openin_imp_subset by blast + define W' where "W' = UU(X t)" + have opeVW: "openin (subtopology euclidean V) {z \ V. (k \ Pair (real n / real N)) z \ W}" + apply (rule continuous_openin_preimage [OF _ _ opeC']) + apply (intro continuous_intros continuous_on_subset [OF contk]) + using kim apply (auto simp: \y \ V\ W) + done + obtain N' where opeUN': "openin (subtopology euclidean U) N'" + and "y \ N'" and kimw: "k ` ({(real n / real N)} \ N') \ W" + apply (rule_tac N' = "{z \ V. (k \ Pair ((real n / real N))) z \ W}" in that) + apply (fastforce simp: \y \ V\ W intro!: openin_trans [OF opeVW opeUV])+ + done + obtain Q Q' where opeUQ: "openin (subtopology euclidean U) Q" + and cloUQ': "closedin (subtopology euclidean U) Q'" + and "y \ Q" "Q \ Q'" + and Q': "Q' \ (U \ NN(t)) \ N' \ V" + proof - + obtain VO VX where "open VO" "open VX" and VO: "V = U \ VO" and VX: "N' = U \ VX" + using opeUV opeUN' by (auto simp: openin_open) + then have "open (NN(t) \ VO \ VX)" + using NN t01 by blast + then obtain e where "e > 0" and e: "cball y e \ NN(t) \ VO \ VX" + by (metis Int_iff \N' = U \ VX\ \V = U \ VO\ \y \ N'\ \y \ V\ inUS open_contains_cball t01) + show ?thesis + proof + show "openin (subtopology euclidean U) (U \ ball y e)" + by blast + show "closedin (subtopology euclidean U) (U \ cball y e)" + using e by (auto simp: closedin_closed) + qed (use \y \ U\ \e > 0\ VO VX e in auto) + qed + then have "y \ Q'" "Q \ (U \ NN(t)) \ N' \ V" + by blast+ + have neq: "{0..real n / real N} \ {real n / real N..(1 + real n) / real N} = {0..(1 + real n) / real N}" + apply (auto simp: divide_simps) + by (metis mult_zero_left of_nat_0_le_iff of_nat_0_less_iff order_trans real_mult_le_cancel_iff1) + then have neqQ': "{0..real n / real N} \ Q' \ {real n / real N..(1 + real n) / real N} \ Q' = {0..(1 + real n) / real N} \ Q'" + by blast + have cont: "continuous_on ({0..(1 + real n) / real N} \ Q') + (\x. if x \ {0..real n / real N} \ Q' then k x else (p' \ h) x)" + unfolding neqQ' [symmetric] + proof (rule continuous_on_cases_local, simp_all add: neqQ' del: comp_apply) + show "closedin (subtopology euclidean ({0..(1 + real n) / real N} \ Q')) + ({0..real n / real N} \ Q')" + apply (simp add: closedin_closed) + apply (rule_tac x="{0 .. real n / real N} \ UNIV" in exI) + using n_div_N_in apply (auto simp: closed_Times) + done + show "closedin (subtopology euclidean ({0..(1 + real n) / real N} \ Q')) + ({real n / real N..(1 + real n) / real N} \ Q')" + apply (simp add: closedin_closed) + apply (rule_tac x="{real n / real N .. (1 + real n) / real N} \ UNIV" in exI) + apply (auto simp: closed_Times) + by (meson divide_nonneg_nonneg of_nat_0_le_iff order_trans) + show "continuous_on ({0..real n / real N} \ Q') k" + apply (rule continuous_on_subset [OF contk]) + using Q' by auto + have "continuous_on ({real n / real N..(1 + real n) / real N} \ Q') h" + proof (rule continuous_on_subset [OF conth]) + show "{real n / real N..(1 + real n) / real N} \ Q' \ {0..1} \ U" + using \N > 0\ + apply auto + apply (meson divide_nonneg_nonneg of_nat_0_le_iff order_trans) + using Suc.prems order_trans apply fastforce + apply (metis IntE cloUQ' closedin_closed) + done + qed + moreover have "continuous_on (h ` ({real n / real N..(1 + real n) / real N} \ Q')) p'" + proof (rule continuous_on_subset [OF homeomorphism_cont2 [OF hom']]) + have "h ` ({real n / real N..(1 + real n) / real N} \ Q') \ h ` (({0..1} \ K t) \ (U \ NN t))" + apply (rule image_mono) + using \0 < \\ \N > 0\ Suc.prems apply auto + apply (meson divide_nonneg_nonneg of_nat_0_le_iff order_trans) + using Suc.prems order_trans apply fastforce + using t Q' apply auto + done + with him show "h ` ({real n / real N..(1 + real n) / real N} \ Q') \ UU (X t)" + using t01 by blast + qed + ultimately show "continuous_on ({real n / real N..(1 + real n) / real N} \ Q') (p' \ h)" + by (rule continuous_on_compose) + have "k (real n / real N, b) = p' (h (real n / real N, b))" if "b \ Q'" for b + proof - + have "k (real n / real N, b) \ W" + using that Q' kimw by force + then have "k (real n / real N, b) = p' (p (k (real n / real N, b)))" + by (simp add: homeomorphism_apply1 [OF hom']) + then show ?thesis + using Q' that by (force simp: heq) + qed + then show "\x. x \ {real n / real N..(1 + real n) / real N} \ Q' \ + x \ {0..real n / real N} \ Q' \ k x = (p' \ h) x" + by auto + qed + have h_in_UU: "h (x, y) \ UU (X t)" if "y \ Q" "\ x \ real n / real N" "0 \ x" "x \ (1 + real n) / real N" for x y + proof - + have "x \ 1" + using Suc.prems that order_trans by force + moreover have "x \ K t" + by (meson atLeastAtMost_iff le_less not_le subset_eq t that) + moreover have "y \ U" + using \y \ Q\ opeUQ openin_imp_subset by blast + moreover have "y \ NN t" + using Q' \Q \ Q'\ \y \ Q\ by auto + ultimately have "(x, y) \ (({0..1} \ K t) \ (U \ NN t))" + using that by auto + then have "h (x, y) \ h ` (({0..1} \ K t) \ (U \ NN t))" + by blast + also have "... \ UU (X t)" + by (metis him t01) + finally show ?thesis . + qed + let ?k = "(\x. if x \ {0..real n / real N} \ Q' then k x else (p' \ h) x)" + show ?case + proof (intro exI conjI) + show "continuous_on ({0..real (Suc n) / real N} \ Q) ?k" + apply (rule continuous_on_subset [OF cont]) + using \Q \ Q'\ by auto + have "\a b. \a \ real n / real N; b \ Q'; 0 \ a\ \ k (a, b) \ C" + using kim Q' by force + moreover have "\a b. \b \ Q; 0 \ a; a \ (1 + real n) / real N; \ a \ real n / real N\ \ p' (h (a, b)) \ C" + apply (rule \W \ C\ [THEN subsetD]) + using homeomorphism_image2 [OF hom', symmetric] h_in_UU Q' \Q \ Q'\ \W \ C\ + apply auto + done + ultimately show "?k ` ({0..real (Suc n) / real N} \ Q) \ C" + using Q' \Q \ Q'\ by force + show "\z\Q. ?k (0, z) = f z" + using Q' keq \Q \ Q'\ by auto + show "\z \ {0..real (Suc n) / real N} \ Q. h z = p(?k z)" + using \Q \ U \ NN t \ N' \ V\ heq apply clarsimp + using h_in_UU Q' \Q \ Q'\ apply (auto simp: homeomorphism_apply2 [OF hom', symmetric]) + done + qed (auto simp: \y \ Q\ opeUQ) + qed + show ?thesis + using*[OF order_refl] N \0 < \\ by (simp add: split: if_split_asm) + qed + then obtain V fs where opeV: "\y. y \ U \ openin (subtopology euclidean U) (V y)" + and V: "\y. y \ U \ y \ V y" + and contfs: "\y. y \ U \ continuous_on ({0..1} \ V y) (fs y)" + and *: "\y. y \ U \ (fs y) ` ({0..1} \ V y) \ C \ + (\z \ V y. fs y (0, z) = f z) \ + (\z \ {0..1} \ V y. h z = p(fs y z))" + by (metis (mono_tags)) + then have VU: "\y. y \ U \ V y \ U" + by (meson openin_imp_subset) + obtain k where contk: "continuous_on ({0..1} \ U) k" + and k: "\x i. \i \ U; x \ {0..1} \ U \ {0..1} \ V i\ \ k x = fs i x" + proof (rule pasting_lemma_exists) + show "{0..1} \ U \ (\i\U. {0..1} \ V i)" + apply auto + using V by blast + show "\i. i \ U \ openin (subtopology euclidean ({0..1} \ U)) ({0..1} \ V i)" + by (simp add: opeV openin_Times) + show "\i. i \ U \ continuous_on ({0..1} \ V i) (fs i)" + using contfs by blast + show "fs i x = fs j x" if "i \ U" "j \ U" and x: "x \ {0..1} \ U \ {0..1} \ V i \ {0..1} \ V j" + for i j x + proof - + obtain u y where "x = (u, y)" "y \ V i" "y \ V j" "0 \ u" "u \ 1" + using x by auto + show ?thesis + proof (rule covering_space_lift_unique [OF cov, of _ "(0,y)" _ "{0..1} \ {y}" h]) + show "fs i (0, y) = fs j (0, y)" + using*V by (simp add: \y \ V i\ \y \ V j\ that) + show conth_y: "continuous_on ({0..1} \ {y}) h" + apply (rule continuous_on_subset [OF conth]) + using VU \y \ V j\ that by auto + show "h ` ({0..1} \ {y}) \ S" + using \y \ V i\ assms(3) VU that by fastforce + show "continuous_on ({0..1} \ {y}) (fs i)" + using continuous_on_subset [OF contfs] \i \ U\ + by (simp add: \y \ V i\ subset_iff) + show "fs i ` ({0..1} \ {y}) \ C" + using "*" \y \ V i\ \i \ U\ by fastforce + show "\x. x \ {0..1} \ {y} \ h x = p (fs i x)" + using "*" \y \ V i\ \i \ U\ by blast + show "continuous_on ({0..1} \ {y}) (fs j)" + using continuous_on_subset [OF contfs] \j \ U\ + by (simp add: \y \ V j\ subset_iff) + show "fs j ` ({0..1} \ {y}) \ C" + using "*" \y \ V j\ \j \ U\ by fastforce + show "\x. x \ {0..1} \ {y} \ h x = p (fs j x)" + using "*" \y \ V j\ \j \ U\ by blast + show "connected ({0..1::real} \ {y})" + using connected_Icc connected_Times connected_sing by blast + show "(0, y) \ {0..1::real} \ {y}" + by force + show "x \ {0..1} \ {y}" + using \x = (u, y)\ x by blast + qed + qed + qed blast + show ?thesis + proof + show "k ` ({0..1} \ U) \ C" + using V*k VU by fastforce + show "\y. y \ U \ k (0, y) = f y" + by (simp add: V*k) + show "\z. z \ {0..1} \ U \ h z = p (k z)" + using V*k by auto + qed (auto simp: contk) +qed + +corollary covering_space_lift_homotopy_alt: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and h :: "'c::real_normed_vector \ real \ 'b" + assumes cov: "covering_space C p S" + and conth: "continuous_on (U \ {0..1}) h" + and him: "h ` (U \ {0..1}) \ S" + and heq: "\y. y \ U \ h (y,0) = p(f y)" + and contf: "continuous_on U f" and fim: "f ` U \ C" + obtains k where "continuous_on (U \ {0..1}) k" + "k ` (U \ {0..1}) \ C" + "\y. y \ U \ k(y, 0) = f y" + "\z. z \ U \ {0..1} \ h z = p(k z)" +proof - + have "continuous_on ({0..1} \ U) (h \ (\z. (snd z, fst z)))" + by (intro continuous_intros continuous_on_subset [OF conth]) auto + then obtain k where contk: "continuous_on ({0..1} \ U) k" + and kim: "k ` ({0..1} \ U) \ C" + and k0: "\y. y \ U \ k(0, y) = f y" + and heqp: "\z. z \ {0..1} \ U \ (h \ (\z. Pair (snd z) (fst z))) z = p(k z)" + apply (rule covering_space_lift_homotopy [OF cov _ _ _ contf fim]) + using him by (auto simp: contf heq) + show ?thesis + apply (rule_tac k="k \ (\z. Pair (snd z) (fst z))" in that) + apply (intro continuous_intros continuous_on_subset [OF contk]) + using kim heqp apply (auto simp: k0) + done +qed + +corollary covering_space_lift_homotopic_function: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" and g:: "'c::real_normed_vector \ 'a" + assumes cov: "covering_space C p S" + and contg: "continuous_on U g" + and gim: "g ` U \ C" + and pgeq: "\y. y \ U \ p(g y) = f y" + and hom: "homotopic_with (\x. True) U S f f'" + obtains g' where "continuous_on U g'" "image g' U \ C" "\y. y \ U \ p(g' y) = f' y" +proof - + obtain h where conth: "continuous_on ({0..1::real} \ U) h" + and him: "h ` ({0..1} \ U) \ S" + and h0: "\x. h(0, x) = f x" + and h1: "\x. h(1, x) = f' x" + using hom by (auto simp: homotopic_with_def) + have "\y. y \ U \ h (0, y) = p (g y)" + by (simp add: h0 pgeq) + then obtain k where contk: "continuous_on ({0..1} \ U) k" + and kim: "k ` ({0..1} \ U) \ C" + and k0: "\y. y \ U \ k(0, y) = g y" + and heq: "\z. z \ {0..1} \ U \ h z = p(k z)" + using covering_space_lift_homotopy [OF cov conth him _ contg gim] by metis + show ?thesis + proof + show "continuous_on U (k \ Pair 1)" + by (meson contk atLeastAtMost_iff continuous_on_o_Pair order_refl zero_le_one) + show "(k \ Pair 1) ` U \ C" + using kim by auto + show "\y. y \ U \ p ((k \ Pair 1) y) = f' y" + by (auto simp: h1 heq [symmetric]) + qed +qed + +corollary covering_space_lift_inessential_function: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" and U :: "'c::real_normed_vector set" + assumes cov: "covering_space C p S" + and hom: "homotopic_with (\x. True) U S f (\x. a)" + obtains g where "continuous_on U g" "g ` U \ C" "\y. y \ U \ p(g y) = f y" +proof (cases "U = {}") + case True + then show ?thesis + using that continuous_on_empty by blast +next + case False + then obtain b where b: "b \ C" "p b = a" + using covering_space_imp_surjective [OF cov] homotopic_with_imp_subset2 [OF hom] + by auto + then have gim: "(\y. b) ` U \ C" + by blast + show ?thesis + apply (rule covering_space_lift_homotopic_function + [OF cov continuous_on_const gim _ homotopic_with_symD [OF hom]]) + using b that apply auto + done +qed + +subsection\ Lifting of general functions to covering space\ + +proposition covering_space_lift_path_strong: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and f :: "'c::real_normed_vector \ 'b" + assumes cov: "covering_space C p S" and "a \ C" + and "path g" and pag: "path_image g \ S" and pas: "pathstart g = p a" + obtains h where "path h" "path_image h \ C" "pathstart h = a" + and "\t. t \ {0..1} \ p(h t) = g t" +proof - + obtain k:: "real \ 'c \ 'a" + where contk: "continuous_on ({0..1} \ {undefined}) k" + and kim: "k ` ({0..1} \ {undefined}) \ C" + and k0: "k (0, undefined) = a" + and pk: "\z. z \ {0..1} \ {undefined} \ p(k z) = (g \ fst) z" + proof (rule covering_space_lift_homotopy [OF cov, of "{undefined}" "g \ fst"]) + show "continuous_on ({0..1::real} \ {undefined::'c}) (g \ fst)" + apply (intro continuous_intros) + using \path g\ by (simp add: path_def) + show "(g \ fst) ` ({0..1} \ {undefined}) \ S" + using pag by (auto simp: path_image_def) + show "(g \ fst) (0, y) = p a" if "y \ {undefined}" for y::'c + by (metis comp_def fst_conv pas pathstart_def) + qed (use assms in auto) + show ?thesis + proof + show "path (k \ (\t. Pair t undefined))" + unfolding path_def + by (intro continuous_on_compose continuous_intros continuous_on_subset [OF contk]) auto + show "path_image (k \ (\t. (t, undefined))) \ C" + using kim by (auto simp: path_image_def) + show "pathstart (k \ (\t. (t, undefined))) = a" + by (auto simp: pathstart_def k0) + show "\t. t \ {0..1} \ p ((k \ (\t. (t, undefined))) t) = g t" + by (auto simp: pk) + qed +qed + +corollary covering_space_lift_path: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + assumes cov: "covering_space C p S" and "path g" and pig: "path_image g \ S" + obtains h where "path h" "path_image h \ C" "\t. t \ {0..1} \ p(h t) = g t" +proof - + obtain a where "a \ C" "pathstart g = p a" + by (metis pig cov covering_space_imp_surjective imageE pathstart_in_path_image subsetCE) + show ?thesis + using covering_space_lift_path_strong [OF cov \a \ C\ \path g\ pig] + by (metis \pathstart g = p a\ that) +qed + + +proposition covering_space_lift_homotopic_paths: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + assumes cov: "covering_space C p S" + and "path g1" and pig1: "path_image g1 \ S" + and "path g2" and pig2: "path_image g2 \ S" + and hom: "homotopic_paths S g1 g2" + and "path h1" and pih1: "path_image h1 \ C" and ph1: "\t. t \ {0..1} \ p(h1 t) = g1 t" + and "path h2" and pih2: "path_image h2 \ C" and ph2: "\t. t \ {0..1} \ p(h2 t) = g2 t" + and h1h2: "pathstart h1 = pathstart h2" + shows "homotopic_paths C h1 h2" +proof - + obtain h :: "real \ real \ 'b" + where conth: "continuous_on ({0..1} \ {0..1}) h" + and him: "h ` ({0..1} \ {0..1}) \ S" + and h0: "\x. h (0, x) = g1 x" and h1: "\x. h (1, x) = g2 x" + and heq0: "\t. t \ {0..1} \ h (t, 0) = g1 0" + and heq1: "\t. t \ {0..1} \ h (t, 1) = g1 1" + using hom by (auto simp: homotopic_paths_def homotopic_with_def pathstart_def pathfinish_def) + obtain k where contk: "continuous_on ({0..1} \ {0..1}) k" + and kim: "k ` ({0..1} \ {0..1}) \ C" + and kh2: "\y. y \ {0..1} \ k (y, 0) = h2 0" + and hpk: "\z. z \ {0..1} \ {0..1} \ h z = p (k z)" + apply (rule covering_space_lift_homotopy_alt [OF cov conth him, of "\x. h2 0"]) + using h1h2 ph1 ph2 apply (force simp: heq0 pathstart_def pathfinish_def) + using path_image_def pih2 continuous_on_const by fastforce+ + have contg1: "continuous_on {0..1} g1" and contg2: "continuous_on {0..1} g2" + using \path g1\ \path g2\ path_def by blast+ + have g1im: "g1 ` {0..1} \ S" and g2im: "g2 ` {0..1} \ S" + using path_image_def pig1 pig2 by auto + have conth1: "continuous_on {0..1} h1" and conth2: "continuous_on {0..1} h2" + using \path h1\ \path h2\ path_def by blast+ + have h1im: "h1 ` {0..1} \ C" and h2im: "h2 ` {0..1} \ C" + using path_image_def pih1 pih2 by auto + show ?thesis + unfolding homotopic_paths pathstart_def pathfinish_def + proof (intro exI conjI ballI) + show keqh1: "k(0, x) = h1 x" if "x \ {0..1}" for x + proof (rule covering_space_lift_unique [OF cov _ contg1 g1im]) + show "k (0,0) = h1 0" + by (metis atLeastAtMost_iff h1h2 kh2 order_refl pathstart_def zero_le_one) + show "continuous_on {0..1} (\a. k (0, a))" + by (intro continuous_intros continuous_on_compose2 [OF contk]) auto + show "\x. x \ {0..1} \ g1 x = p (k (0, x))" + by (metis atLeastAtMost_iff h0 hpk zero_le_one mem_Sigma_iff order_refl) + qed (use conth1 h1im kim that in \auto simp: ph1\) + show "k(1, x) = h2 x" if "x \ {0..1}" for x + proof (rule covering_space_lift_unique [OF cov _ contg2 g2im]) + show "k (1,0) = h2 0" + by (metis atLeastAtMost_iff kh2 order_refl zero_le_one) + show "continuous_on {0..1} (\a. k (1, a))" + by (intro continuous_intros continuous_on_compose2 [OF contk]) auto + show "\x. x \ {0..1} \ g2 x = p (k (1, x))" + by (metis atLeastAtMost_iff h1 hpk mem_Sigma_iff order_refl zero_le_one) + qed (use conth2 h2im kim that in \auto simp: ph2\) + show "\t. t \ {0..1} \ (k \ Pair t) 0 = h1 0" + by (metis comp_apply h1h2 kh2 pathstart_def) + show "(k \ Pair t) 1 = h1 1" if "t \ {0..1}" for t + proof (rule covering_space_lift_unique + [OF cov, of "\a. (k \ Pair a) 1" 0 "\a. h1 1" "{0..1}" "\x. g1 1"]) + show "(k \ Pair 0) 1 = h1 1" + using keqh1 by auto + show "continuous_on {0..1} (\a. (k \ Pair a) 1)" + apply simp + by (intro continuous_intros continuous_on_compose2 [OF contk]) auto + show "\x. x \ {0..1} \ g1 1 = p ((k \ Pair x) 1)" + using heq1 hpk by auto + qed (use contk kim g1im h1im that in \auto simp: ph1 continuous_on_const\) + qed (use contk kim in auto) +qed + + +corollary covering_space_monodromy: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + assumes cov: "covering_space C p S" + and "path g1" and pig1: "path_image g1 \ S" + and "path g2" and pig2: "path_image g2 \ S" + and hom: "homotopic_paths S g1 g2" + and "path h1" and pih1: "path_image h1 \ C" and ph1: "\t. t \ {0..1} \ p(h1 t) = g1 t" + and "path h2" and pih2: "path_image h2 \ C" and ph2: "\t. t \ {0..1} \ p(h2 t) = g2 t" + and h1h2: "pathstart h1 = pathstart h2" + shows "pathfinish h1 = pathfinish h2" + using covering_space_lift_homotopic_paths [OF assms] homotopic_paths_imp_pathfinish by blast + + +corollary covering_space_lift_homotopic_path: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + assumes cov: "covering_space C p S" + and hom: "homotopic_paths S f f'" + and "path g" and pig: "path_image g \ C" + and a: "pathstart g = a" and b: "pathfinish g = b" + and pgeq: "\t. t \ {0..1} \ p(g t) = f t" + obtains g' where "path g'" "path_image g' \ C" + "pathstart g' = a" "pathfinish g' = b" "\t. t \ {0..1} \ p(g' t) = f' t" +proof (rule covering_space_lift_path_strong [OF cov, of a f']) + show "a \ C" + using a pig by auto + show "path f'" "path_image f' \ S" + using hom homotopic_paths_imp_path homotopic_paths_imp_subset by blast+ + show "pathstart f' = p a" + by (metis a atLeastAtMost_iff hom homotopic_paths_imp_pathstart order_refl pathstart_def pgeq zero_le_one) +qed (metis (mono_tags, lifting) assms cov covering_space_monodromy hom homotopic_paths_imp_path homotopic_paths_imp_subset pgeq pig) + + +proposition covering_space_lift_general: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and f :: "'c::real_normed_vector \ 'b" + assumes cov: "covering_space C p S" and "a \ C" "z \ U" + and U: "path_connected U" "locally path_connected U" + and contf: "continuous_on U f" and fim: "f ` U \ S" + and feq: "f z = p a" + and hom: "\r. \path r; path_image r \ U; pathstart r = z; pathfinish r = z\ + \ \q. path q \ path_image q \ C \ + pathstart q = a \ pathfinish q = a \ + homotopic_paths S (f \ r) (p \ q)" + obtains g where "continuous_on U g" "g ` U \ C" "g z = a" "\y. y \ U \ p(g y) = f y" +proof - + have *: "\g h. path g \ path_image g \ U \ + pathstart g = z \ pathfinish g = y \ + path h \ path_image h \ C \ pathstart h = a \ + (\t \ {0..1}. p(h t) = f(g t))" + if "y \ U" for y + proof - + obtain g where "path g" "path_image g \ U" and pastg: "pathstart g = z" + and pafig: "pathfinish g = y" + using U \z \ U\ \y \ U\ by (force simp: path_connected_def) + obtain h where "path h" "path_image h \ C" "pathstart h = a" + and "\t. t \ {0..1} \ p(h t) = (f \ g) t" + proof (rule covering_space_lift_path_strong [OF cov \a \ C\]) + show "path (f \ g)" + using \path g\ \path_image g \ U\ contf continuous_on_subset path_continuous_image by blast + show "path_image (f \ g) \ S" + by (metis \path_image g \ U\ fim image_mono path_image_compose subset_trans) + show "pathstart (f \ g) = p a" + by (simp add: feq pastg pathstart_compose) + qed auto + then show ?thesis + by (metis \path g\ \path_image g \ U\ comp_apply pafig pastg) + qed + have "\l. \g h. path g \ path_image g \ U \ pathstart g = z \ pathfinish g = y \ + path h \ path_image h \ C \ pathstart h = a \ + (\t \ {0..1}. p(h t) = f(g t)) \ pathfinish h = l" for y + proof - + have "pathfinish h = pathfinish h'" + if g: "path g" "path_image g \ U" "pathstart g = z" "pathfinish g = y" + and h: "path h" "path_image h \ C" "pathstart h = a" + and phg: "\t. t \ {0..1} \ p(h t) = f(g t)" + and g': "path g'" "path_image g' \ U" "pathstart g' = z" "pathfinish g' = y" + and h': "path h'" "path_image h' \ C" "pathstart h' = a" + and phg': "\t. t \ {0..1} \ p(h' t) = f(g' t)" + for g h g' h' + proof - + obtain q where "path q" and piq: "path_image q \ C" and pastq: "pathstart q = a" and pafiq: "pathfinish q = a" + and homS: "homotopic_paths S (f \ g +++ reversepath g') (p \ q)" + using g g' hom [of "g +++ reversepath g'"] by (auto simp: subset_path_image_join) + have papq: "path (p \ q)" + using homS homotopic_paths_imp_path by blast + have pipq: "path_image (p \ q) \ S" + using homS homotopic_paths_imp_subset by blast + obtain q' where "path q'" "path_image q' \ C" + and "pathstart q' = pathstart q" "pathfinish q' = pathfinish q" + and pq'_eq: "\t. t \ {0..1} \ p (q' t) = (f \ g +++ reversepath g') t" + using covering_space_lift_homotopic_path [OF cov homotopic_paths_sym [OF homS] \path q\ piq refl refl] + by auto + have "q' t = (h \ op *\<^sub>R 2) t" if "0 \ t" "t \ 1/2" for t + proof (rule covering_space_lift_unique [OF cov, of q' 0 "h \ op *\<^sub>R 2" "{0..1/2}" "f \ g \ op *\<^sub>R 2" t]) + show "q' 0 = (h \ op *\<^sub>R 2) 0" + by (metis \pathstart q' = pathstart q\ comp_def g h pastq pathstart_def pth_4(2)) + show "continuous_on {0..1/2} (f \ g \ op *\<^sub>R 2)" + apply (intro continuous_intros continuous_on_compose continuous_on_path [OF \path g\] continuous_on_subset [OF contf]) + using g(2) path_image_def by fastforce+ + show "(f \ g \ op *\<^sub>R 2) ` {0..1/2} \ S" + using g(2) path_image_def fim by fastforce + show "(h \ op *\<^sub>R 2) ` {0..1/2} \ C" + using h path_image_def by fastforce + show "q' ` {0..1/2} \ C" + using \path_image q' \ C\ path_image_def by fastforce + show "\x. x \ {0..1/2} \ (f \ g \ op *\<^sub>R 2) x = p (q' x)" + by (auto simp: joinpaths_def pq'_eq) + show "\x. x \ {0..1/2} \ (f \ g \ op *\<^sub>R 2) x = p ((h \ op *\<^sub>R 2) x)" + by (simp add: phg) + show "continuous_on {0..1/2} q'" + by (simp add: continuous_on_path \path q'\) + show "continuous_on {0..1/2} (h \ op *\<^sub>R 2)" + apply (intro continuous_intros continuous_on_compose continuous_on_path [OF \path h\], force) + done + qed (use that in auto) + moreover have "q' t = (reversepath h' \ (\t. 2 *\<^sub>R t - 1)) t" if "1/2 < t" "t \ 1" for t + proof (rule covering_space_lift_unique [OF cov, of q' 1 "reversepath h' \ (\t. 2 *\<^sub>R t - 1)" "{1/2<..1}" "f \ reversepath g' \ (\t. 2 *\<^sub>R t - 1)" t]) + show "q' 1 = (reversepath h' \ (\t. 2 *\<^sub>R t - 1)) 1" + using h' \pathfinish q' = pathfinish q\ pafiq + by (simp add: pathstart_def pathfinish_def reversepath_def) + show "continuous_on {1/2<..1} (f \ reversepath g' \ (\t. 2 *\<^sub>R t - 1))" + apply (intro continuous_intros continuous_on_compose continuous_on_path \path g'\ continuous_on_subset [OF contf]) + using g' apply simp_all + by (auto simp: path_image_def reversepath_def) + show "(f \ reversepath g' \ (\t. 2 *\<^sub>R t - 1)) ` {1/2<..1} \ S" + using g'(2) path_image_def fim by (auto simp: image_subset_iff path_image_def reversepath_def) + show "q' ` {1/2<..1} \ C" + using \path_image q' \ C\ path_image_def by fastforce + show "(reversepath h' \ (\t. 2 *\<^sub>R t - 1)) ` {1/2<..1} \ C" + using h' by (simp add: path_image_def reversepath_def subset_eq) + show "\x. x \ {1/2<..1} \ (f \ reversepath g' \ (\t. 2 *\<^sub>R t - 1)) x = p (q' x)" + by (auto simp: joinpaths_def pq'_eq) + show "\x. x \ {1/2<..1} \ + (f \ reversepath g' \ (\t. 2 *\<^sub>R t - 1)) x = p ((reversepath h' \ (\t. 2 *\<^sub>R t - 1)) x)" + by (simp add: phg' reversepath_def) + show "continuous_on {1/2<..1} q'" + by (auto intro: continuous_on_path [OF \path q'\]) + show "continuous_on {1/2<..1} (reversepath h' \ (\t. 2 *\<^sub>R t - 1))" + apply (intro continuous_intros continuous_on_compose continuous_on_path \path h'\) + using h' apply auto + done + qed (use that in auto) + ultimately have "q' t = (h +++ reversepath h') t" if "0 \ t" "t \ 1" for t + using that by (simp add: joinpaths_def) + then have "path(h +++ reversepath h')" + by (auto intro: path_eq [OF \path q'\]) + then show ?thesis + by (auto simp: \path h\ \path h'\) + qed + then show ?thesis by metis + qed + then obtain l :: "'c \ 'a" + where l: "\y g h. \path g; path_image g \ U; pathstart g = z; pathfinish g = y; + path h; path_image h \ C; pathstart h = a; + \t. t \ {0..1} \ p(h t) = f(g t)\ \ pathfinish h = l y" + by metis + show ?thesis + proof + show pleq: "p (l y) = f y" if "y \ U" for y + using*[OF \y \ U\] by (metis l atLeastAtMost_iff order_refl pathfinish_def zero_le_one) + show "l z = a" + using l [of "linepath z z" z "linepath a a"] by (auto simp: assms) + show LC: "l ` U \ C" + by (clarify dest!: *) (metis (full_types) l pathfinish_in_path_image subsetCE) + have "\T. openin (subtopology euclidean U) T \ y \ T \ T \ {x \ U. l x \ X}" + if X: "openin (subtopology euclidean C) X" and "y \ U" "l y \ X" for X y + proof - + have "X \ C" + using X openin_euclidean_subtopology_iff by blast + have "f y \ S" + using fim \y \ U\ by blast + then obtain W \ + where WV: "f y \ W \ openin (subtopology euclidean S) W \ + (\\ = {x. x \ C \ p x \ W} \ + (\U \ \. openin (subtopology euclidean C) U) \ + pairwise disjnt \ \ + (\U \ \. \q. homeomorphism U W p q))" + using cov by (force simp: covering_space_def) + then have "l y \ \\" + using \X \ C\ pleq that by auto + then obtain W' where "l y \ W'" and "W' \ \" + by blast + with WV obtain p' where opeCW': "openin (subtopology euclidean C) W'" + and homUW': "homeomorphism W' W p p'" + by blast + then have contp': "continuous_on W p'" and p'im: "p' ` W \ W'" + using homUW' homeomorphism_image2 homeomorphism_cont2 by fastforce+ + obtain V where "y \ V" "y \ U" and fimW: "f ` V \ W" "V \ U" + and "path_connected V" and opeUV: "openin (subtopology euclidean U) V" + proof - + have "openin (subtopology euclidean U) {c \ U. f c \ W}" + using WV contf continuous_on_open_gen fim by auto + then show ?thesis + using U WV + apply (auto simp: locally_path_connected) + apply (drule_tac x="{x. x \ U \ f x \ W}" in spec) + apply (drule_tac x=y in spec) + apply (auto simp: \y \ U\ intro: that) + done + qed + have "W' \ C" "W \ S" + using opeCW' WV openin_imp_subset by auto + have p'im: "p' ` W \ W'" + using homUW' homeomorphism_image2 by fastforce + show ?thesis + proof (intro exI conjI) + have "openin (subtopology euclidean S) {x \ W. p' x \ W' \ X}" + proof (rule openin_trans) + show "openin (subtopology euclidean W) {x \ W. p' x \ W' \ X}" + apply (rule continuous_openin_preimage [OF contp' p'im]) + using X \W' \ C\ apply (auto simp: openin_open) + done + show "openin (subtopology euclidean S) W" + using WV by blast + qed + then show "openin (subtopology euclidean U) (V \ {x. x \ U \ f x \ {x. x \ W \ p' x \ W' \ X}})" + by (intro openin_Int opeUV continuous_openin_preimage [OF contf fim]) + have "p' (f y) \ X" + using \l y \ W'\ homeomorphism_apply1 [OF homUW'] pleq \y \ U\ \l y \ X\ by fastforce + then show "y \ V \ {x \ U. f x \ {x \ W. p' x \ W' \ X}}" + using \y \ U\ \y \ V\ WV p'im by auto + show "V \ {x \ U. f x \ {x \ W. p' x \ W' \ X}} \ {x \ U. l x \ X}" + proof clarsimp + fix y' + assume y': "y' \ V" "y' \ U" "f y' \ W" "p' (f y') \ W'" "p' (f y') \ X" + then obtain \ where "path \" "path_image \ \ V" "pathstart \ = y" "pathfinish \ = y'" + by (meson \path_connected V\ \y \ V\ path_connected_def) + obtain pp qq where "path pp" "path_image pp \ U" + "pathstart pp = z" "pathfinish pp = y" + "path qq" "path_image qq \ C" "pathstart qq = a" + and pqqeq: "\t. t \ {0..1} \ p(qq t) = f(pp t)" + using*[OF \y \ U\] by blast + have finW: "\x. \0 \ x; x \ 1\ \ f (\ x) \ W" + using \path_image \ \ V\ by (auto simp: image_subset_iff path_image_def fimW [THEN subsetD]) + have "pathfinish (qq +++ (p' \ f \ \)) = l y'" + proof (rule l [of "pp +++ \" y' "qq +++ (p' \ f \ \)" ]) + show "path (pp +++ \)" + by (simp add: \path \\ \path pp\ \pathfinish pp = y\ \pathstart \ = y\) + show "path_image (pp +++ \) \ U" + using \V \ U\ \path_image \ \ V\ \path_image pp \ U\ not_in_path_image_join by blast + show "pathstart (pp +++ \) = z" + by (simp add: \pathstart pp = z\) + show "pathfinish (pp +++ \) = y'" + by (simp add: \pathfinish \ = y'\) + have paqq: "pathfinish qq = pathstart (p' \ f \ \)" + apply (simp add: \pathstart \ = y\ pathstart_compose) + apply (metis (mono_tags, lifting) \l y \ W'\ \path pp\ \path qq\ \path_image pp \ U\ \path_image qq \ C\ + \pathfinish pp = y\ \pathstart pp = z\ \pathstart qq = a\ + homeomorphism_apply1 [OF homUW'] l pleq pqqeq \y \ U\) + done + have "continuous_on (path_image \) (p' \ f)" + proof (rule continuous_on_compose) + show "continuous_on (path_image \) f" + using \path_image \ \ V\ \V \ U\ contf continuous_on_subset by blast + show "continuous_on (f ` path_image \) p'" + apply (rule continuous_on_subset [OF contp']) + apply (auto simp: path_image_def pathfinish_def pathstart_def finW) + done + qed + then show "path (qq +++ (p' \ f \ \))" + using \path \\ \path qq\ paqq path_continuous_image path_join_imp by blast + show "path_image (qq +++ (p' \ f \ \)) \ C" + apply (rule subset_path_image_join) + apply (simp add: \path_image qq \ C\) + by (metis \W' \ C\ \path_image \ \ V\ dual_order.trans fimW(1) image_comp image_mono p'im path_image_compose) + show "pathstart (qq +++ (p' \ f \ \)) = a" + by (simp add: \pathstart qq = a\) + show "p ((qq +++ (p' \ f \ \)) \) = f ((pp +++ \) \)" if \: "\ \ {0..1}" for \ + proof (simp add: joinpaths_def, safe) + show "p (qq (2*\)) = f (pp (2*\))" if "\*2 \ 1" + using \\ \ {0..1}\ pqqeq that by auto + show "p (p' (f (\ (2*\ - 1)))) = f (\ (2*\ - 1))" if "\ \*2 \ 1" + apply (rule homeomorphism_apply2 [OF homUW' finW]) + using that \ by auto + qed + qed + with \pathfinish \ = y'\ \p' (f y') \ X\ show "l y' \ X" + unfolding pathfinish_join by (simp add: pathfinish_def) + qed + qed + qed + then show "continuous_on U l" + using openin_subopen continuous_on_open_gen [OF LC] + by (metis (no_types, lifting) mem_Collect_eq) + qed +qed + + +corollary covering_space_lift_stronger: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and f :: "'c::real_normed_vector \ 'b" + assumes cov: "covering_space C p S" "a \ C" "z \ U" + and U: "path_connected U" "locally path_connected U" + and contf: "continuous_on U f" and fim: "f ` U \ S" + and feq: "f z = p a" + and hom: "\r. \path r; path_image r \ U; pathstart r = z; pathfinish r = z\ + \ \b. homotopic_paths S (f \ r) (linepath b b)" + obtains g where "continuous_on U g" "g ` U \ C" "g z = a" "\y. y \ U \ p(g y) = f y" +proof (rule covering_space_lift_general [OF cov U contf fim feq]) + fix r + assume "path r" "path_image r \ U" "pathstart r = z" "pathfinish r = z" + then obtain b where b: "homotopic_paths S (f \ r) (linepath b b)" + using hom by blast + then have "f (pathstart r) = b" + by (metis homotopic_paths_imp_pathstart pathstart_compose pathstart_linepath) + then have "homotopic_paths S (f \ r) (linepath (f z) (f z))" + by (simp add: b \pathstart r = z\) + then have "homotopic_paths S (f \ r) (p \ linepath a a)" + by (simp add: o_def feq linepath_def) + then show "\q. path q \ + path_image q \ C \ + pathstart q = a \ pathfinish q = a \ homotopic_paths S (f \ r) (p \ q)" + by (force simp: \a \ C\) +qed auto + +corollary covering_space_lift_strong: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and f :: "'c::real_normed_vector \ 'b" + assumes cov: "covering_space C p S" "a \ C" "z \ U" + and scU: "simply_connected U" and lpcU: "locally path_connected U" + and contf: "continuous_on U f" and fim: "f ` U \ S" + and feq: "f z = p a" + obtains g where "continuous_on U g" "g ` U \ C" "g z = a" "\y. y \ U \ p(g y) = f y" +proof (rule covering_space_lift_stronger [OF cov _ lpcU contf fim feq]) + show "path_connected U" + using scU simply_connected_eq_contractible_loop_some by blast + fix r + assume r: "path r" "path_image r \ U" "pathstart r = z" "pathfinish r = z" + have "linepath (f z) (f z) = f \ linepath z z" + by (simp add: o_def linepath_def) + then have "homotopic_paths S (f \ r) (linepath (f z) (f z))" + by (metis r contf fim homotopic_paths_continuous_image scU simply_connected_eq_contractible_path) + then show "\b. homotopic_paths S (f \ r) (linepath b b)" + by blast +qed blast + +corollary covering_space_lift: + fixes p :: "'a::real_normed_vector \ 'b::real_normed_vector" + and f :: "'c::real_normed_vector \ 'b" + assumes cov: "covering_space C p S" + and U: "simply_connected U" "locally path_connected U" + and contf: "continuous_on U f" and fim: "f ` U \ S" + obtains g where "continuous_on U g" "g ` U \ C" "\y. y \ U \ p(g y) = f y" +proof (cases "U = {}") + case True + with that show ?thesis by auto +next + case False + then obtain z where "z \ U" by blast + then obtain a where "a \ C" "f z = p a" + by (metis cov covering_space_imp_surjective fim image_iff image_subset_iff) + then show ?thesis + by (metis that covering_space_lift_strong [OF cov _ \z \ U\ U contf fim]) +qed + end