1
+ import Mathlib.Topology.Basic
2
+ import Mathlib.Topology.ContinuousOn
3
+ import Mathlib.Topology.Covering
4
+ import Mathlib.Topology.LocalHomeomorph
5
+ import Mathlib.Topology.UnitInterval
6
+ import Coverings.lean3
7
+
8
+ open Topology Filter unitInterval Bundle Function Set
9
+ namespace IsCoveringMap
10
+
11
+ /-
12
+ Notation:
13
+ `E` : the covering space of `X`
14
+ `F` : the lift of the map `f`
15
+ `F₀` : the start of `F`, i.e. `F₀ = F(y, 0)`
16
+
17
+ `U : ι → Set α` : collection of (open) sets of α
18
+ `s ⊆ ⋃ i, U i` : a (possibly infinite) open cover
19
+ `∃ t : Finset ι, s ⊆ ⋃ i ∈ t, U i` : existence of finite subcover
20
+
21
+ `Continuous f` : `f` is globally continuous
22
+ `ContinuousAt f a` : `f` is continuous at the point a
23
+
24
+ `IsCompact (s : Set α)` : the set s is compact in topological space `α`
25
+
26
+ `Trivialization F proj` : local trivialization of `proj : E → B` with fiber `F`
27
+ `IsEvenlyCovered x ι` : `DiscreteTopology ι ∧ ∃ t : Trivialization ι p, x ∈ t.baseSet`
28
+ : fiber over x has discrete topology & has a local trivialization
29
+ `IsCoveringMap (f : E → X)` : `∀ x, IsEvenlyCovered (f x) (f ⁻¹' {x})`
30
+
31
+ `∀ᶠ y ∈ 𝓝 x, P y` : exists a nbhd `U` of `x` such that `y ∈ U → P y`
32
+
33
+ Theorems:
34
+ `toTrivialization` : gets local trivialization above a point from a covering map
35
+ `IsCompact.elim_finite_subcover` : reduces open cover to finite cover
36
+
37
+ `isCompact_singleton` : set of a single point is compact
38
+ `isCompact_prod` : product of compact sets is compact
39
+ -/
40
+
41
+ variable {X E : Type _}
42
+ variable [TopologicalSpace X] [TopologicalSpace E]
43
+ variable {p : C(E, X)}
44
+ variable {Y : Type _} [TopologicalSpace Y]
45
+ variable {hp : IsCoveringMap p} (φ : LiftingSetup Y hp)
46
+
47
+ structure LiftingSetup (Y : Type _) [TopologicalSpace Y] (hp : IsCoveringMap p) where
48
+ f : C(Y × I, X)
49
+ F₀ : C(Y, E)
50
+ f_eq_pF₀ : ∀ y : Y, f (y, 0 ) = (p ∘ F₀) y
51
+
52
+ structure TrivializedNbhd (y : Y) (t : I) where
53
+ triv : Trivialization (p ⁻¹' {φ.f (y, t)}) p
54
+ -- U is a nbhd of (y, t) which maps to triv.baseSet
55
+ U : Set (Y × I)
56
+ hU : U ∈ 𝓝 (y, t)
57
+
58
+ lemma nbhd_in_trivialization (y : Y) (t : I) :
59
+ ∃ triv : Trivialization (p ⁻¹' {φ.f (y, t)}) p, φ.f ⁻¹' triv.baseSet ∈ 𝓝 (y, t) := by
60
+ specialize hp <| φ.f (y, t)
61
+ let triv : Trivialization (p ⁻¹' {φ.f (y, t)}) p := by
62
+ apply IsEvenlyCovered.toTrivialization hp
63
+ use triv
64
+ rw [mem_nhds_iff]
65
+ use φ.f ⁻¹' triv.baseSet
66
+ constructor
67
+ . rfl
68
+ . constructor
69
+ . exact IsOpen.preimage φ.f.continuous_toFun triv.open_baseSet
70
+ . rw [preimage]
71
+ exact IsEvenlyCovered.mem_toTrivialization_baseSet hp
72
+
73
+ noncomputable def triv_nbhd (y : Y) (t : I) : TrivializedNbhd φ y t where
74
+ triv := (nbhd_in_trivialization φ y t).choose
75
+ U := φ.f ⁻¹' (nbhd_in_trivialization φ y t).choose.baseSet
76
+ hU := (nbhd_in_trivialization φ y t).choose_spec
77
+
78
+ theorem existence_of_homotopy_lift : ∃ F : C(Y × I, E), p ∘ F = f ∧ (fun y ↦ F (y, 0 )) = F₀ := by
79
+ sorry
0 commit comments