@@ -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}
@@ -92,6 +92,24 @@ lemma of_nhds (h : ∀ x, ∃ s ∈ S, s ∈ 𝓝 x) : IsCoherentWith S :=
9292 let ⟨s, hsS, hsx⟩ := h x
9393 (hf s hsS).continuousAt hsx
9494
95+ lemma of_open_cover (hSO : ∀ s ∈ S, IsOpen s) (hSU : ⋃₀ S = univ) : IsCoherentWith S :=
96+ of_nhds (S := S) fun x ↦
97+ let ⟨s, hsS, hsx⟩ := sUnion_eq_univ_iff.mp hSU x
98+ ⟨s, hsS, hSO _ hsS |>.mem_nhds hsx⟩
99+
100+ -- lemma of_closed_cover (hSC : ∀ s ∈ S, IsClosed s) (hSU : ⋃ s ∈ S, sᶜ = univ) :
101+ -- IsCoherentWith S := by
102+ -- have hSc : IsCoherentWith { sᶜ | s ∈ S } := by
103+ -- apply of_open_cover <;> simpa [sUnion_eq_iUnion, iUnion_subtype]
104+ -- apply of_isClosed
105+ -- intro t ht
106+ -- simp_rw +contextual [(hSC _ _).inter_preimage_val_iff] at ht
107+ -- rw [ hSc.isClosed_iff ]
108+ -- simp
109+ -- intro s hs
110+ -- rw [← isOpen_compl_iff, ← preimage_compl, (hSC s hs).isOpen_compl.inter_preimage_val_iff,
111+ -- ← compl_union, isOpen_compl_iff]
112+
95113/-- If a space `X` is coherent with an indexed family of subspaces `S` whose union is `X`, then the
96114 canonical inclusion from `Σ i, S i` to `X` is a quotient map. -/
97115lemma isQuotientMap_sigma_desc'
@@ -115,4 +133,118 @@ lemma isQuotientMap_sigma_desc (hX : IsCoherentWith S) (hS : ⋃₀ S = univ) :
115133 IsCoherentWith.isQuotientMap_sigma_desc' (S := ((↑) : S → Set X))
116134 (h ▸ hX) (sUnion_eq_iUnion ▸ hS)
117135
136+ variable {S : Set (Set X)} (hS : IsCoherentWith S) (surj : ⋃₀ S = Set.univ) (F : ∀ s ∈ S, C(s, Y))
137+ (hF : ∀ (s) (hs : s ∈ S) (t) (ht : t ∈ S) (x : X) (hxs : x ∈ s) (hxt : x ∈ t),
138+ F s hs ⟨x, hxs⟩ = F t ht ⟨x, hxt⟩)
139+
140+ /-- A family `F s` of continuous maps `C(s, Y)`, where (1) the domains `s` are taken from a set `S`
141+ of sets in `X` which are jointly surjective and coherent with `X` and (2) the functions `F s` agree
142+ pairwise on intersections, can be glued to construct a continuous map `C(X, Y)`. -/
143+ noncomputable def liftCover : C(X, Y) where
144+ toFun := Set.liftCover ((↑) : S → Set X) (fun s ↦ F s s.2 ) (fun s t ↦ hF s s.2 t t.2 )
145+ (by simp [sUnion_eq_iUnion, ← surj])
146+ continuous_toFun := by
147+ rw [hS.continuous_iff, Subtype.forall']
148+ intro s
149+ rw [continuousOn_iff_continuous_restrict, Set.liftCover_restrict]
150+ exact (F s s.2 ).continuous
151+
152+ variable {hS surj F hF}
153+
154+ @[simp]
155+ theorem liftCover_coe {s : S} (x : (s : Set X)) : hS.liftCover surj F hF x = F s s.2 x := by
156+ simp [IsCoherentWith.liftCover]
157+
158+ @[simp]
159+ theorem liftCover_of_mem_coe {s : Set X} (hs : s ∈ S) (x : s) :
160+ hS.liftCover surj F hF x = F s hs x :=
161+ hS.liftCover_coe (s := ⟨s, hs⟩) x
162+
163+ theorem liftCover_of_mem {s : Set X} (hs : s ∈ S) {x : X} (hx : x ∈ s) :
164+ hS.liftCover surj F hF x = F s hs ⟨x, hx⟩ :=
165+ hS.liftCover_of_mem_coe hs ⟨x, hx⟩
166+
167+ theorem preimage_liftCover (t : Set Y) :
168+ hS.liftCover surj F hF ⁻¹' t = ⋃ s : S, (↑) '' (F s s.2 ⁻¹' t) := by
169+ simp only [IsCoherentWith.liftCover, ContinuousMap.coe_mk]
170+ rw [Set.preimage_liftCover]
171+
172+ @[simp]
173+ theorem liftCover_restrict (s : Set X) (hs : s ∈ S) :
174+ s.restrict (hS.liftCover surj F hF) = F s hs := by
175+ ext x; simp [hs]
176+
177+ variable (hS surj) in
178+ /-- When `X` is coherent with a set of subspaces `S`, every continuous map out of `X` can be
179+ written as a `liftCover`. -/
180+ @[simps]
181+ noncomputable def liftEquiv :
182+ { F : ∀ s ∈ S, C(s, Y) // ∀ s (hs : s ∈ S) t (ht : t ∈ S) x (hxs : x ∈ s) (hxt : x ∈ t),
183+ F s hs ⟨x, hxs⟩ = F t ht ⟨x, hxt⟩ } ≃ C(X, Y) where
184+ toFun F := hS.liftCover surj F F.2
185+ invFun f := ⟨fun s hs ↦ f.restrict s, fun s hs t ht x hxs hxt ↦ by simp⟩
186+ left_inv := by rintro ⟨F, hF⟩; ext s hs x; simp [hs]
187+ right_inv f := by
188+ ext x
189+ rw [sUnion_eq_univ_iff] at surj
190+ obtain ⟨s, hs, hxs⟩ := surj x
191+ simp [liftCover_of_mem hs hxs]
192+
193+ /-- A version of `liftEquiv_apply` that is more convenient when rewriting. -/
194+ lemma liftEquiv_apply' : hS.liftCover surj F hF = hS.liftEquiv surj ⟨F, hF⟩ := by rfl
195+
196+ variable {ι} {S : ι → Set X} (hS : IsCoherentWith (range S)) (surj : ⋃ i, S i = Set.univ)
197+ (φ : (i : ι) → C(S i, Y))
198+ (hφ : ∀ i j x (hxi : x ∈ S i) (hxj : x ∈ S j), φ i ⟨x, hxi⟩ = φ j ⟨x, hxj⟩)
199+
200+ /-- A family `φ i` of continuous maps `(i : ι) → C(S i, Y)`, where (1) the domains `S i` are taken
201+ from a family `S` of sets in `X` which are jointly surjective and coherent with `X` and (2) the
202+ functions `φ` agree pairwise on intersections, can be glued to construct a continuous map
203+ `C(X, Y)`. -/
204+ noncomputable def liftCover' : C(X, Y) where
205+ toFun := Set.liftCover S (φ ·) hφ surj
206+ continuous_toFun := by
207+ rw [hS.continuous_iff, forall_mem_range]
208+ intro i
209+ rw [continuousOn_iff_continuous_restrict, Set.liftCover_restrict]
210+ exact (φ i).continuous
211+
212+ variable {hS surj φ hφ}
213+ variable {i : ι}
214+
215+ @[simp]
216+ theorem liftCover'_coe (x : S i) : hS.liftCover' surj φ hφ x = φ i x := by
217+ simp [IsCoherentWith.liftCover']
218+
219+ @[simp]
220+ theorem liftCover'_of_mem {x : X} (hx : x ∈ S i) : hS.liftCover' surj φ hφ x = φ i ⟨x, hx⟩ :=
221+ hS.liftCover'_coe ⟨x, hx⟩
222+
223+ theorem preimage_liftCover' (t : Set Y) :
224+ hS.liftCover' surj φ hφ ⁻¹' t = ⋃ i, (↑) '' (φ i ⁻¹' t) := by
225+ simp only [IsCoherentWith.liftCover', ContinuousMap.coe_mk]
226+ rw [Set.preimage_liftCover]
227+
228+ @[simp]
229+ theorem liftCover'_restrict : (S i).restrict (hS.liftCover' surj φ hφ) = φ i := by ext x; simp
230+
231+ variable (hS surj) in
232+ /-- When `X` is coherent with a family of subspaces `S i`, every continuous map out of `X` can be
233+ written as a `liftCover'`. -/
234+ @[simps]
235+ noncomputable def liftEquiv' :
236+ { φ : (i : ι) → C(S i, Y) // ∀ i j x (hxi : x ∈ S i) (hxj : x ∈ S j),
237+ φ i ⟨x, hxi⟩ = φ j ⟨x, hxj⟩ } ≃ C(X, Y) where
238+ toFun φ := hS.liftCover' surj φ φ.2
239+ invFun f := ⟨fun i ↦ f.restrict (S i), fun i j x hxi hxj ↦ by simp⟩
240+ left_inv := by rintro ⟨φ, hφ⟩; ext i x; simp
241+ right_inv f := by
242+ ext x
243+ rw [iUnion_eq_univ_iff] at surj
244+ obtain ⟨i, hxi⟩ := surj x
245+ simp [liftCover'_of_mem hxi]
246+
247+ /-- A version of `liftEquiv'_apply` that is more convenient when rewriting. -/
248+ lemma liftEquiv'_apply' : hS.liftCover' surj φ hφ = hS.liftEquiv' surj ⟨φ, hφ⟩ := by rfl
249+
118250end Topology.IsCoherentWith
0 commit comments