Skip to content

Commit 65cede5

Browse files
committed
feat(CategoryTheory/Sites): a cover preserving functor that preserves pullbacks preserves 1-hypercovers (#39592)
1 parent 2715441 commit 65cede5

3 files changed

Lines changed: 84 additions & 0 deletions

File tree

Mathlib/CategoryTheory/Sites/Continuous.lean

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,58 @@ then `(E.map F).multifork P` is a limit iff `E.multifork (F.op ⋙ P)` is a limi
8585
def isLimitMapMultiforkEquiv {A : Type u} [Category.{t} A] (P : Dᵒᵖ ⥤ A) :
8686
IsLimit ((E.map F).multifork P) ≃ IsLimit (E.multifork (F.op ⋙ P)) := by rfl
8787

88+
section
89+
90+
variable {E} {W : C} {i₁ i₂ : E.I₀} (p₁ : W ⟶ E.X i₁) (p₂ : W ⟶ E.X i₂)
91+
92+
lemma functorPushforward_sieve₁_map_le :
93+
Sieve.functorPushforward F (E.sieve₁ p₁ p₂) ≤ (E.map F).sieve₁ (F.map p₁) (F.map p₂) := by
94+
rw [Sieve.functorPushforward_le_iff_le_functorPullback]
95+
intro Y f ⟨k, u, hf₁, hf₂⟩
96+
exact ⟨k, F.map u, by simp [← Functor.map_comp, hf₁], by simp [← Functor.map_comp, hf₂]⟩
97+
98+
variable (i₁ i₂) in
99+
set_option backward.isDefEq.respectTransparency false in
100+
lemma functorPushforward_sieve₁'_of_preservesLimit [HasPullback (E.f i₁) (E.f i₂)]
101+
[PreservesLimit (cospan (E.f i₁) (E.f i₂)) F] :
102+
Sieve.functorPushforward F (E.sieve₁' i₁ i₂) =
103+
(E.map F).sieve₁ (F.map <| pullback.fst _ _) (F.map <| pullback.snd _ _) := by
104+
have : HasPullback ((E.map F).f i₁) ((E.map F).f i₂) :=
105+
hasPullback_of_preservesPullback F (E.f i₁) (E.f i₂)
106+
refine le_antisymm ?_ ?_
107+
· rw [PreOneHypercover.sieve₁'_eq_sieve₁]
108+
apply PreOneHypercover.functorPushforward_sieve₁_map_le
109+
· rw [PreOneHypercover.sieve₁_eq_pullback_sieve₁' _ _ _
110+
(by simp [← Functor.map_comp, pullback.condition])]
111+
rintro W f ⟨Z, u, v, ⟨k⟩, h⟩
112+
refine ⟨E.Y k, pullback.lift (E.p₁ k) (E.p₂ k) (E.w _), u, ?_, ?_⟩
113+
· use E.Y k, 𝟙 _, pullback.lift (E.p₁ k) (E.p₂ k) (E.w _), ⟨k⟩
114+
simp
115+
· simp only [pullback.hom_ext_iff, Category.assoc, limit.lift_π, PullbackCone.mk_π_app] at h
116+
apply IsPullback.hom_ext (IsPullback.map _ (.of_hasPullback _ _)) <;>
117+
simp [← h.left, ← h.right, ← Functor.map_comp]
118+
119+
set_option backward.isDefEq.respectTransparency false in
120+
lemma functorPushforward_sieve₁_of_preservesPullbacks (h : p₁ ≫ E.f _ = p₂ ≫ E.f _)
121+
[HasPullbacks C] [PreservesLimitsOfShape WalkingCospan F] :
122+
Sieve.functorPushforward F (E.sieve₁ p₁ p₂) = (E.map F).sieve₁ (F.map p₁) (F.map p₂) := by
123+
refine le_antisymm (PreOneHypercover.functorPushforward_sieve₁_map_le _ _ _) ?_
124+
have : HasPullback ((E.map F).f i₁) ((E.map F).f i₂) :=
125+
hasPullback_of_preservesPullback F (E.f i₁) (E.f i₂)
126+
rintro T f ⟨k, u, hf₁, hf₂⟩
127+
let l : W ⟶ pullback (E.f i₁) (E.f i₂) := pullback.lift p₁ p₂ h
128+
have hl₁ : l ≫ pullback.fst _ _ = p₁ := by simp [l]
129+
have hl₂ : l ≫ pullback.snd _ _ = p₂ := by simp [l]
130+
let r : E.Y k ⟶ pullback (E.f i₁) (E.f i₂) := pullback.lift (E.p₁ _) (E.p₂ _) (E.w _)
131+
refine ⟨pullback l r, pullback.fst _ _, IsPullback.lift
132+
(IsPullback.map _ (.of_hasPullback _ _)) f u ?_, ?_, ?_⟩
133+
· apply (IsPullback.map _ (.of_hasPullback _ _)).hom_ext <;>
134+
simp [l, r, ← Functor.map_comp, hf₁, hf₂]
135+
· refine ⟨k, pullback.snd _ _, ?_, ?_⟩ <;> simp [← hl₁, ← hl₂, pullback.condition_assoc, r]
136+
· simp
137+
138+
end
139+
88140
end PreOneHypercover
89141

90142
namespace GrothendieckTopology

Mathlib/CategoryTheory/Sites/CoverPreserving.lean

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,21 @@ lemma Functor.isContinuous_of_coverPreserving (hF₁ : CompatiblePreserving.{max
168168
rintro Y _ ⟨Z, g, h, hg, rfl⟩
169169
simpa using congrArg _ ((hy₁ g hg).trans (hy₂ g hg).symm)
170170

171+
/-- If `C` has pullbacks and `F : C ⥤ D` preserves pullbacks, any cover preserving
172+
functor preserves all `1`-hypercovers. -/
173+
lemma Functor.PreservesOneHypercovers.of_coverPreserving [HasPullbacks C]
174+
[PreservesLimitsOfShape WalkingCospan F] (H : CoverPreserving J K F) :
175+
Functor.PreservesOneHypercovers.{w} F J K := by
176+
refine fun {U} E ↦ ⟨?_, fun i₁ i₂ W p₁ p₂ h ↦ ?_⟩
177+
· simp [PreZeroHypercover.sieve₀_map, H.cover_preserve E.mem₀]
178+
· let P : C := pullback (E.f i₁) (E.f i₂)
179+
have : HasPullback ((E.toPreOneHypercover.map F).f i₁) ((E.toPreOneHypercover.map F).f i₂) :=
180+
hasPullback_of_preservesPullback F (E.f i₁) (E.f i₂)
181+
have := H.cover_preserve (E.mem₁ i₁ i₂ (pullback.fst (E.f i₁) (E.f i₂)) _ pullback.condition)
182+
rw [PreOneHypercover.functorPushforward_sieve₁_of_preservesPullbacks _ _ _
183+
pullback.condition] at this
184+
refine K.superset_covering ?_
185+
(K.pullback_stable (IsPullback.lift (.map _ (.of_hasPullback _ _)) p₁ p₂ h) this)
186+
simp [PreOneHypercover.pullback_sieve₁]
187+
171188
end CategoryTheory

Mathlib/CategoryTheory/Sites/Hypercover/One.lean

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,13 @@ def sieve₁ {i₁ i₂ : E.I₀} {W : C} (p₁ : W ⟶ E.X i₁) (p₂ : W ⟶
7171
rintro Z Z' g ⟨j, h, fac₁, fac₂⟩ φ
7272
exact ⟨j, φ ≫ h, by simpa using φ ≫= fac₁, by simpa using φ ≫= fac₂⟩
7373

74+
lemma pullback_sieve₁ {i₁ i₂ : E.I₀} {W : C} (p₁ : W ⟶ E.X i₁) (p₂ : W ⟶ E.X i₂)
75+
{T : C} (f : T ⟶ W) :
76+
Sieve.pullback f (E.sieve₁ p₁ p₂) = E.sieve₁ (f ≫ p₁) (f ≫ p₂) := by
77+
refine le_antisymm ?_ ?_ <;>
78+
· intro Z g ⟨k, u, hu₁, hu₂⟩
79+
cat_disch
80+
7481
section
7582

7683
variable {i₁ i₂ : E.I₀} [HasPullback (E.f i₁) (E.f i₂)]
@@ -79,6 +86,14 @@ variable {i₁ i₂ : E.I₀} [HasPullback (E.f i₁) (E.f i₂)]
7986
noncomputable abbrev toPullback (j : E.I₁ i₁ i₂) : E.Y j ⟶ pullback (E.f i₁) (E.f i₂) :=
8087
pullback.lift (E.p₁ j) (E.p₂ j) (E.w j)
8188

89+
@[reassoc (attr := simp)]
90+
lemma toPullback_fst (k : E.I₁ i₁ i₂) : E.toPullback k ≫ pullback.fst _ _ = E.p₁ k := by
91+
rw [pullback.lift_fst]
92+
93+
@[reassoc (attr := simp)]
94+
lemma toPullback_snd (k : E.I₁ i₁ i₂) : E.toPullback k ≫ pullback.snd _ _ = E.p₂ k := by
95+
rw [pullback.lift_snd]
96+
8297
variable (i₁ i₂) in
8398
/-- The sieve of `pullback (E.f i₁) (E.f i₂)` given by `E : PreOneHypercover S`. -/
8499
noncomputable def sieve₁' : Sieve (pullback (E.f i₁) (E.f i₂)) :=

0 commit comments

Comments
 (0)