Skip to content

Commit 994ee81

Browse files
feat (IsCoherentWith) : families of maps from a coherent collection of subspaces lift uniquely to maps from the total space
1 parent 4f7d34e commit 994ee81

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
@@ -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

3535
variable {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+
93207
end Topology.IsCoherentWith

0 commit comments

Comments
 (0)