Skip to content

Commit a53d898

Browse files
Merge commit '9a62e0dcc934940e17b41f680f53f93170979fd1' into CWForward_colimits
2 parents d8f2354 + 9a62e0d commit a53d898

File tree

2 files changed

+143
-1
lines changed

2 files changed

+143
-1
lines changed

Mathlib/Data/Set/UnionLift.lean

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
44
Authors: Chris Hughes
55
-/
66
import Mathlib.Data.Set.Lattice
7+
import Mathlib.Data.Set.Subset
78
import Mathlib.Order.Directed
89

910
/-!
@@ -39,6 +40,7 @@ directed union, directed supremum, glue, gluing
3940
variable {α : Type*} {ι β : Sort _}
4041

4142
namespace Set
43+
open Set.Notation
4244

4345
section UnionLift
4446

@@ -82,6 +84,10 @@ theorem preimage_iUnionLift (t : Set β) :
8284
obtain rfl : y = x := congr_arg Subtype.val hxy
8385
rwa [iUnionLift_of_mem x hi]
8486

87+
theorem iUnionLift_restrict {i : ι} :
88+
restrict (T ↓∩ S i) (iUnionLift S f hf T hT) = f i ∘ preimageValInclusion T (S i) := by
89+
ext ⟨⟨x, hxT⟩, hxS⟩; simp at hxS; simp [iUnionLift_of_mem ⟨x, hxT⟩ hxS]
90+
8591
/-- `iUnionLift_const` is useful for proving that `iUnionLift` is a homomorphism
8692
of algebraic structures when defined on the Union of algebraic subobjects.
8793
For example, it could be used to prove that the lift of a collection
@@ -165,4 +171,8 @@ theorem preimage_liftCover (t : Set β) : liftCover S f hf hS ⁻¹' t = ⋃ i,
165171
rw [preimage_comp, preimage_iUnionLift]
166172
ext; simp
167173

174+
@[simp]
175+
theorem liftCover_restrict {i : ι} : (S i).restrict (liftCover S f hf hS) = f i := by ext x; simp
176+
177+
168178
end Set

Mathlib/Topology/Coherent.lean

Lines changed: 133 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

3636
variable {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. -/
97115
lemma 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+
118250
end Topology.IsCoherentWith

0 commit comments

Comments
 (0)