Skip to content

Commit f50a2d4

Browse files
committed
feat(Topology): skyscraper sheaves are flasque (leanprover-community#38775)
In this PR we show that skyscraper sheaves are flasque. In particular, we show that a skyscraper sheaf valued in an object A whose map to the terminal object is an epimorphism is a flasque sheaf. We also show the useful corollary that in particular, any skyscraper sheaf is flasque if the sheaf takes values in a category with a zero object Co-authored-by: Raph-DG <raphaeldouglasgiles@gmail.com>
1 parent b76ce36 commit f50a2d4

3 files changed

Lines changed: 44 additions & 0 deletions

File tree

Mathlib/CategoryTheory/Limits/Shapes/ZeroObjects.lean

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,4 +316,7 @@ open ZeroObject
316316
theorem Functor.isZero_iff [HasZeroObject D] (F : C ⥤ D) : IsZero F ↔ ∀ X, IsZero (F.obj X) :=
317317
⟨fun hF X => hF.obj X, Functor.isZero _⟩
318318

319+
instance {C : Type*} [Category* C] (A : C) [HasZeroObject C] : Epi (terminalIsTerminal.from A) :=
320+
(((isZero_zero C).of_iso HasZeroObject.zeroIsoTerminal.symm).epi _)
321+
319322
end CategoryTheory

Mathlib/Topology/Sheaves/Flasque.lean

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,3 +185,31 @@ theorem of_shortExact_of_isFlasque₁₂ {S : ShortComplex (Sheaf AddCommGrpCat
185185
exact CategoryTheory.epi_of_epi (S.g.1.app U) (S.X₃.obj.map i)
186186

187187
end TopCat.Sheaf.IsFlasque
188+
189+
/--
190+
If the unique map from `A` to the terminal object is an epimorphism, then the skyscraper sheaf
191+
valued in `A` supported at an arbitrary point is a flasque sheaf.
192+
-/
193+
theorem isFlasque_skyscraperSheaf_of_epi_from {X : TopCat} (p₀ : ↑X)
194+
[(U : Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type*} [Category* C] (A : C) [HasTerminal C]
195+
[Epi <| terminalIsTerminal.from A] :
196+
(skyscraperSheaf p₀ A).IsFlasque where
197+
epi {U V} r := by
198+
by_cases h1 : p₀ ∈ unop U
199+
· by_cases h2 : p₀ ∈ unop V
200+
· simp_all only [skyscraperSheaf_obj_obj, skyscraperSheaf_obj_map, ↓reduceDIte]
201+
infer_instance
202+
· simp
203+
grind
204+
· have h2 : p₀ ∉ unop V := fun hV => h1 (r.unop.le hV)
205+
have := isIso_of_isTerminal (isTerminalSkyscraperSheafObjObjOfNotMem h1)
206+
(isTerminalSkyscraperSheafObjObjOfNotMem h2) ((skyscraperSheaf p₀ A).obj.map r)
207+
infer_instance
208+
209+
/--
210+
If the target category has a zero object, then any skyscraper sheaf valued in this category is a
211+
flasque sheaf.
212+
-/
213+
theorem isFlasque_skyscraperSheaf_of_hasZeroObject {X : TopCat} (p₀ : ↑X)
214+
[(U : Opens ↑X) → Decidable (p₀ ∈ U)] {C : Type*} [Category* C] (A : C) [HasZeroObject C] :
215+
(skyscraperSheaf p₀ A).IsFlasque := isFlasque_skyscraperSheaf_of_epi_from p₀ A

Mathlib/Topology/Sheaves/Skyscraper.lean

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ theorem skyscraperPresheaf_isSheaf : (skyscraperPresheaf p₀ A).IsSheaf := by
240240
The skyscraper presheaf supported at `p₀` with value `A` is the sheaf that assigns `A` to all opens
241241
`U` that contain `p₀` and assigns `*` otherwise.
242242
-/
243+
@[simps!]
243244
def skyscraperSheaf : Sheaf C X :=
244245
⟨skyscraperPresheaf p₀ A, skyscraperPresheaf_isSheaf _ _⟩
245246

@@ -410,6 +411,18 @@ noncomputable def skyscraperSheafForgetAdjunction [HasColimits C] :
410411
Presheaf.stalkFunctor C p₀ ⊣ skyscraperSheafFunctor p₀ ⋙ Sheaf.forget C X :=
411412
skyscraperPresheafStalkAdjunction p₀
412413

414+
variable {A p₀} in
415+
/--
416+
On an open set not containing `p₀`, the value of skyscraper sheaf supported at `p₀` is a terminal
417+
object.
418+
-/
419+
noncomputable
420+
def isTerminalSkyscraperSheafObjObjOfNotMem {U : (Opens X)ᵒᵖ} (h : p₀ ∉ unop U) :
421+
IsTerminal ((skyscraperSheaf p₀ A).obj.obj U) := by
422+
dsimp
423+
rw [if_neg h]
424+
exact terminalIsTerminal
425+
413426
end
414427

415428
end

0 commit comments

Comments
 (0)