@@ -85,6 +85,58 @@ then `(E.map F).multifork P` is a limit iff `E.multifork (F.op ⋙ P)` is a limi
8585def 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+
88140end PreOneHypercover
89141
90142namespace GrothendieckTopology
0 commit comments