Skip to content

Commit 56f022b

Browse files
feat (IsCoherentWith) : families of maps from a coherent collection of subspaces lift uniquely to maps from the total space
1 parent 89dd94b commit 56f022b

File tree

2 files changed

+125
-1
lines changed

2 files changed

+125
-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: 115 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}
@@ -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+
118232
end Topology.IsCoherentWith

0 commit comments

Comments
 (0)