@@ -30,7 +30,7 @@ and provide the others as corollaries.
3030 then we have `IsCoherentWith S`;
3131 -/
3232
33- open Filter Set
33+ open Filter Set Set.Notation
3434
3535variable {X : Type *} [TopologicalSpace X] {S : Set (Set X)} {t : Set X} {x : X}
3636
@@ -90,4 +90,118 @@ lemma of_nhds (h : ∀ x, ∃ s ∈ S, s ∈ 𝓝 x) : IsCoherentWith S :=
9090 let ⟨s, hsS, hsx⟩ := h x
9191 (hf s hsS).continuousAt hsx
9292
93+ variable {S : Set (Set X)} (hS : IsCoherentWith S) (surj : ⋃₀ S = Set.univ) (F : ∀ s ∈ S, C(s, Y))
94+ (hF : ∀ (s) (hs : s ∈ S) (t) (ht : t ∈ S) (x : X) (hxs : x ∈ s) (hxt : x ∈ t),
95+ F s hs ⟨x, hxs⟩ = F t ht ⟨x, hxt⟩)
96+
97+ /-- A family `F s` of continuous maps `C(s, Y)`, where (1) the domains `s` are taken from a set `S`
98+ of sets in `X` which are jointly surjective and coherent with `X` and (2) the functions `F s` agree
99+ pairwise on intersections, can be glued to construct a continuous map `C(X, Y)`. -/
100+ noncomputable def liftCover : C(X, Y) where
101+ toFun := Set.liftCover ((↑) : S → Set X) (fun s ↦ F s s.2 ) (fun s t ↦ hF s s.2 t t.2 )
102+ (by simp [sUnion_eq_iUnion, ← surj])
103+ continuous_toFun := by
104+ rw [hS.continuous_iff, Subtype.forall']
105+ intro s
106+ rw [continuousOn_iff_continuous_restrict, Set.liftCover_restrict]
107+ exact (F s s.2 ).continuous
108+
109+ variable {hS surj F hF}
110+
111+ @[simp]
112+ theorem liftCover_coe {s : S} (x : (s : Set X)) : hS.liftCover surj F hF x = F s s.2 x := by
113+ simp [IsCoherentWith.liftCover]
114+
115+ @[simp]
116+ theorem liftCover_of_mem_coe {s : Set X} (hs : s ∈ S) (x : s) :
117+ hS.liftCover surj F hF x = F s hs x :=
118+ hS.liftCover_coe (s := ⟨s, hs⟩) x
119+
120+ theorem liftCover_of_mem {s : Set X} (hs : s ∈ S) {x : X} (hx : x ∈ s) :
121+ hS.liftCover surj F hF x = F s hs ⟨x, hx⟩ :=
122+ hS.liftCover_of_mem_coe hs ⟨x, hx⟩
123+
124+ theorem preimage_liftCover (t : Set Y) :
125+ hS.liftCover surj F hF ⁻¹' t = ⋃ s : S, (↑) '' (F s s.2 ⁻¹' t) := by
126+ simp only [IsCoherentWith.liftCover, ContinuousMap.coe_mk]
127+ rw [Set.preimage_liftCover]
128+
129+ @[simp]
130+ theorem liftCover_restrict (s : Set X) (hs : s ∈ S) :
131+ s.restrict (hS.liftCover surj F hF) = F s hs := by
132+ ext x; simp [hs]
133+
134+ variable (hS surj) in
135+ /-- When `X` is coherent with a set of subspaces `S`, every continuous map out of `X` can be
136+ written as a `liftCover`. -/
137+ @[simps]
138+ noncomputable def liftEquiv :
139+ { F : ∀ s ∈ S, C(s, Y) // ∀ s (hs : s ∈ S) t (ht : t ∈ S) x (hxs : x ∈ s) (hxt : x ∈ t),
140+ F s hs ⟨x, hxs⟩ = F t ht ⟨x, hxt⟩ } ≃ C(X, Y) where
141+ toFun F := hS.liftCover surj F F.2
142+ invFun f := ⟨fun s hs ↦ f.restrict s, fun s hs t ht x hxs hxt ↦ by simp⟩
143+ left_inv := by rintro ⟨F, hF⟩; ext s hs x; simp [hs]
144+ right_inv f := by
145+ ext x
146+ rw [sUnion_eq_univ_iff] at surj
147+ obtain ⟨s, hs, hxs⟩ := surj x
148+ simp [liftCover_of_mem hs hxs]
149+
150+ /-- A version of `liftEquiv_apply` that is more convenient when rewriting. -/
151+ lemma liftEquiv_apply' : hS.liftCover surj F hF = hS.liftEquiv surj ⟨F, hF⟩ := by rfl
152+
153+ variable {ι} {S : ι → Set X} (hS : IsCoherentWith (range S)) (surj : ⋃ i, S i = Set.univ)
154+ (φ : (i : ι) → C(S i, Y))
155+ (hφ : ∀ i j x (hxi : x ∈ S i) (hxj : x ∈ S j), φ i ⟨x, hxi⟩ = φ j ⟨x, hxj⟩)
156+
157+ /-- A family `φ i` of continuous maps `(i : ι) → C(S i, Y)`, where (1) the domains `S i` are taken
158+ from a family `S` of sets in `X` which are jointly surjective and coherent with `X` and (2) the
159+ functions `φ` agree pairwise on intersections, can be glued to construct a continuous map
160+ `C(X, Y)`. -/
161+ noncomputable def liftCover' : C(X, Y) where
162+ toFun := Set.liftCover S (φ ·) hφ surj
163+ continuous_toFun := by
164+ rw [hS.continuous_iff, forall_mem_range]
165+ intro i
166+ rw [continuousOn_iff_continuous_restrict, Set.liftCover_restrict]
167+ exact (φ i).continuous
168+
169+ variable {hS surj φ hφ}
170+ variable {i : ι}
171+
172+ @[simp]
173+ theorem liftCover'_coe (x : S i) : hS.liftCover' surj φ hφ x = φ i x := by
174+ simp [IsCoherentWith.liftCover']
175+
176+ @[simp]
177+ theorem liftCover'_of_mem {x : X} (hx : x ∈ S i) : hS.liftCover' surj φ hφ x = φ i ⟨x, hx⟩ :=
178+ hS.liftCover'_coe ⟨x, hx⟩
179+
180+ theorem preimage_liftCover' (t : Set Y) :
181+ hS.liftCover' surj φ hφ ⁻¹' t = ⋃ i, (↑) '' (φ i ⁻¹' t) := by
182+ simp only [IsCoherentWith.liftCover', ContinuousMap.coe_mk]
183+ rw [Set.preimage_liftCover]
184+
185+ @[simp]
186+ theorem liftCover'_restrict : (S i).restrict (hS.liftCover' surj φ hφ) = φ i := by ext x; simp
187+
188+ variable (hS surj) in
189+ /-- When `X` is coherent with a family of subspaces `S i`, every continuous map out of `X` can be
190+ written as a `liftCover'`. -/
191+ @[simps]
192+ noncomputable def liftEquiv' :
193+ { φ : (i : ι) → C(S i, Y) // ∀ i j x (hxi : x ∈ S i) (hxj : x ∈ S j),
194+ φ i ⟨x, hxi⟩ = φ j ⟨x, hxj⟩ } ≃ C(X, Y) where
195+ toFun φ := hS.liftCover' surj φ φ.2
196+ invFun f := ⟨fun i ↦ f.restrict (S i), fun i j x hxi hxj ↦ by simp⟩
197+ left_inv := by rintro ⟨φ, hφ⟩; ext i x; simp
198+ right_inv f := by
199+ ext x
200+ rw [iUnion_eq_univ_iff] at surj
201+ obtain ⟨i, hxi⟩ := surj x
202+ simp [liftCover'_of_mem hxi]
203+
204+ /-- A version of `liftEquiv'_apply` that is more convenient when rewriting. -/
205+ lemma liftEquiv'_apply' : hS.liftCover' surj φ hφ = hS.liftEquiv' surj ⟨φ, hφ⟩ := by rfl
206+
93207end Topology.IsCoherentWith
0 commit comments