@@ -31,7 +31,7 @@ and provide the others as corollaries.
3131 then we have `IsCoherentWith S`;
3232 -/
3333
34- open Filter Set
34+ open Filter Set Set.Notation
3535
3636variable {X Y : Type *} [TopologicalSpace X] [TopologicalSpace Y]
3737 {S : Set (Set X)} {t : Set X} {x : X}
@@ -115,4 +115,118 @@ lemma isQuotientMap_sigma_desc (hX : IsCoherentWith S) (hS : ⋃₀ S = univ) :
115115 IsCoherentWith.isQuotientMap_sigma_desc' (S := ((↑) : S → Set X))
116116 (h ▸ hX) (sUnion_eq_iUnion ▸ hS)
117117
118+ variable {S : Set (Set X)} (hS : IsCoherentWith S) (surj : ⋃₀ S = Set.univ) (F : ∀ s ∈ S, C(s, Y))
119+ (hF : ∀ (s) (hs : s ∈ S) (t) (ht : t ∈ S) (x : X) (hxs : x ∈ s) (hxt : x ∈ t),
120+ F s hs ⟨x, hxs⟩ = F t ht ⟨x, hxt⟩)
121+
122+ /-- A family `F s` of continuous maps `C(s, Y)`, where (1) the domains `s` are taken from a set `S`
123+ of sets in `X` which are jointly surjective and coherent with `X` and (2) the functions `F s` agree
124+ pairwise on intersections, can be glued to construct a continuous map `C(X, Y)`. -/
125+ noncomputable def liftCover : C(X, Y) where
126+ toFun := Set.liftCover ((↑) : S → Set X) (fun s ↦ F s s.2 ) (fun s t ↦ hF s s.2 t t.2 )
127+ (by simp [sUnion_eq_iUnion, ← surj])
128+ continuous_toFun := by
129+ rw [hS.continuous_iff, Subtype.forall']
130+ intro s
131+ rw [continuousOn_iff_continuous_restrict, Set.liftCover_restrict]
132+ exact (F s s.2 ).continuous
133+
134+ variable {hS surj F hF}
135+
136+ @[simp]
137+ theorem liftCover_coe {s : S} (x : (s : Set X)) : hS.liftCover surj F hF x = F s s.2 x := by
138+ simp [IsCoherentWith.liftCover]
139+
140+ @[simp]
141+ theorem liftCover_of_mem_coe {s : Set X} (hs : s ∈ S) (x : s) :
142+ hS.liftCover surj F hF x = F s hs x :=
143+ hS.liftCover_coe (s := ⟨s, hs⟩) x
144+
145+ theorem liftCover_of_mem {s : Set X} (hs : s ∈ S) {x : X} (hx : x ∈ s) :
146+ hS.liftCover surj F hF x = F s hs ⟨x, hx⟩ :=
147+ hS.liftCover_of_mem_coe hs ⟨x, hx⟩
148+
149+ theorem preimage_liftCover (t : Set Y) :
150+ hS.liftCover surj F hF ⁻¹' t = ⋃ s : S, (↑) '' (F s s.2 ⁻¹' t) := by
151+ simp only [IsCoherentWith.liftCover, ContinuousMap.coe_mk]
152+ rw [Set.preimage_liftCover]
153+
154+ @[simp]
155+ theorem liftCover_restrict (s : Set X) (hs : s ∈ S) :
156+ s.restrict (hS.liftCover surj F hF) = F s hs := by
157+ ext x; simp [hs]
158+
159+ variable (hS surj) in
160+ /-- When `X` is coherent with a set of subspaces `S`, every continuous map out of `X` can be
161+ written as a `liftCover`. -/
162+ @[simps]
163+ noncomputable def liftEquiv :
164+ { F : ∀ s ∈ S, C(s, Y) // ∀ s (hs : s ∈ S) t (ht : t ∈ S) x (hxs : x ∈ s) (hxt : x ∈ t),
165+ F s hs ⟨x, hxs⟩ = F t ht ⟨x, hxt⟩ } ≃ C(X, Y) where
166+ toFun F := hS.liftCover surj F F.2
167+ invFun f := ⟨fun s hs ↦ f.restrict s, fun s hs t ht x hxs hxt ↦ by simp⟩
168+ left_inv := by rintro ⟨F, hF⟩; ext s hs x; simp [hs]
169+ right_inv f := by
170+ ext x
171+ rw [sUnion_eq_univ_iff] at surj
172+ obtain ⟨s, hs, hxs⟩ := surj x
173+ simp [liftCover_of_mem hs hxs]
174+
175+ /-- A version of `liftEquiv_apply` that is more convenient when rewriting. -/
176+ lemma liftEquiv_apply' : hS.liftCover surj F hF = hS.liftEquiv surj ⟨F, hF⟩ := by rfl
177+
178+ variable {ι} {S : ι → Set X} (hS : IsCoherentWith (range S)) (surj : ⋃ i, S i = Set.univ)
179+ (φ : (i : ι) → C(S i, Y))
180+ (hφ : ∀ i j x (hxi : x ∈ S i) (hxj : x ∈ S j), φ i ⟨x, hxi⟩ = φ j ⟨x, hxj⟩)
181+
182+ /-- A family `φ i` of continuous maps `(i : ι) → C(S i, Y)`, where (1) the domains `S i` are taken
183+ from a family `S` of sets in `X` which are jointly surjective and coherent with `X` and (2) the
184+ functions `φ` agree pairwise on intersections, can be glued to construct a continuous map
185+ `C(X, Y)`. -/
186+ noncomputable def liftCover' : C(X, Y) where
187+ toFun := Set.liftCover S (φ ·) hφ surj
188+ continuous_toFun := by
189+ rw [hS.continuous_iff, forall_mem_range]
190+ intro i
191+ rw [continuousOn_iff_continuous_restrict, Set.liftCover_restrict]
192+ exact (φ i).continuous
193+
194+ variable {hS surj φ hφ}
195+ variable {i : ι}
196+
197+ @[simp]
198+ theorem liftCover'_coe (x : S i) : hS.liftCover' surj φ hφ x = φ i x := by
199+ simp [IsCoherentWith.liftCover']
200+
201+ @[simp]
202+ theorem liftCover'_of_mem {x : X} (hx : x ∈ S i) : hS.liftCover' surj φ hφ x = φ i ⟨x, hx⟩ :=
203+ hS.liftCover'_coe ⟨x, hx⟩
204+
205+ theorem preimage_liftCover' (t : Set Y) :
206+ hS.liftCover' surj φ hφ ⁻¹' t = ⋃ i, (↑) '' (φ i ⁻¹' t) := by
207+ simp only [IsCoherentWith.liftCover', ContinuousMap.coe_mk]
208+ rw [Set.preimage_liftCover]
209+
210+ @[simp]
211+ theorem liftCover'_restrict : (S i).restrict (hS.liftCover' surj φ hφ) = φ i := by ext x; simp
212+
213+ variable (hS surj) in
214+ /-- When `X` is coherent with a family of subspaces `S i`, every continuous map out of `X` can be
215+ written as a `liftCover'`. -/
216+ @[simps]
217+ noncomputable def liftEquiv' :
218+ { φ : (i : ι) → C(S i, Y) // ∀ i j x (hxi : x ∈ S i) (hxj : x ∈ S j),
219+ φ i ⟨x, hxi⟩ = φ j ⟨x, hxj⟩ } ≃ C(X, Y) where
220+ toFun φ := hS.liftCover' surj φ φ.2
221+ invFun f := ⟨fun i ↦ f.restrict (S i), fun i j x hxi hxj ↦ by simp⟩
222+ left_inv := by rintro ⟨φ, hφ⟩; ext i x; simp
223+ right_inv f := by
224+ ext x
225+ rw [iUnion_eq_univ_iff] at surj
226+ obtain ⟨i, hxi⟩ := surj x
227+ simp [liftCover'_of_mem hxi]
228+
229+ /-- A version of `liftEquiv'_apply` that is more convenient when rewriting. -/
230+ lemma liftEquiv'_apply' : hS.liftCover' surj φ hφ = hS.liftEquiv' surj ⟨φ, hφ⟩ := by rfl
231+
118232end Topology.IsCoherentWith
0 commit comments