@@ -15,6 +15,11 @@ and a family of maps `f i : X i ⟶ S` in the category `C`,
1515we define the category `F.DescentData f` of objects over the `X i`
1616equipped with a descent data relative to the morphisms `f i : X i ⟶ S`.
1717
18+ We show that up to an equivalence, the category `F.DescentData f` is unchanged
19+ when we replace `S` by an isomorphic object, or the family `f i : X i ⟶ S`
20+ by another family which generates the same sieve
21+ (see `Pseudofunctor.DescentData.pullFunctorEquivalence`).
22+
1823## TODO (@joelriou, @chrisflav)
1924* Relate the prestack condition to the fully faithfullness of `Pseudofunctor.toDescentData`.
2025* Define stacks.
@@ -25,7 +30,7 @@ when `F` also has a covariant functoriality, etc.).
2530
2631@[expose] public section
2732
28- universe t v' v u' u
33+ universe t t' t'' v' v u' u
2934
3035namespace CategoryTheory
3136
@@ -129,11 +134,6 @@ def ofObj (M : F.obj (.mk (op S))) : F.DescentData f where
129134 gf₁.op.toLoc q'.op.toLoc (by grind) (by grind) (by grind),
130135 F.mapComp'₀₂₃_inv_comp_mapComp'₀₁₃_hom_app (f i₂).op.toLoc f₂.op.toLoc g.op.toLoc
131136 q.op.toLoc gf₂.op.toLoc q'.op.toLoc (by grind) (by grind) (by grind)]
132- hom_self Y q i g h := by
133- simp [← Cat.Hom₂.comp_app]
134- hom_comp Y q i₁ i₂ i₃ f₁ f₂ f₃ hf₁ hf₂ hf₃ := by
135- simp only [← Cat.Hom₂.comp_app]
136- simp
137137
138138/-- Constructor for isomorphisms in `Pseudofunctor.DescentData`. -/
139139@[simps]
@@ -143,8 +143,7 @@ def isoMk {D₁ D₂ : F.DescentData f} (e : ∀ (i : ι), D₁.obj i ≅ D₂.o
143143 (F.map f₁.op.toLoc).toFunctor.map (e i₁).hom ≫ D₂.hom q f₁ f₂ =
144144 D₁.hom q f₁ f₂ ≫ (F.map f₂.op.toLoc).toFunctor.map (e i₂).hom := by cat_disch) : D₁ ≅ D₂ where
145145 hom :=
146- { hom i := (e i).hom
147- comm := comm }
146+ { hom i := (e i).hom }
148147 inv :=
149148 { hom i := (e i).inv
150149 comm Y q i₁ i₂ f₁ f₂ hf₁ hf₂ := by
@@ -156,10 +155,232 @@ def isoMk {D₁ D₂ : F.DescentData f} (e : ∀ (i : ι), D₁.obj i ≅ D₂.o
156155end DescentData
157156
158157/-- The functor `F.obj (.mk (op S)) ⥤ F.DescentData f`. -/
158+ @[simps]
159159def toDescentData : F.obj (.mk (op S)) ⥤ F.DescentData f where
160160 obj M := .ofObj M
161161 map {M M'} φ := { hom i := (F.map (f i).op.toLoc).toFunctor.map φ }
162162
163+ namespace DescentData
164+
165+ section
166+
167+ variable {F f} {S' : C} {p : S' ⟶ S} {ι' : Type t'} {X' : ι' → C} {f' : ∀ j, X' j ⟶ S'}
168+ {α : ι' → ι} {p' : ∀ j, X' j ⟶ X (α j)} (w : ∀ j, p' j ≫ f (α j) = f' j ≫ p)
169+
170+ /-- Auxiliary definition for `pullFunctor`. -/
171+ def pullFunctorObjHom (D : F.DescentData f)
172+ ⦃Y : C⦄ (q : Y ⟶ S') ⦃j₁ j₂ : ι'⦄ (f₁ : Y ⟶ X' j₁) (f₂ : Y ⟶ X' j₂)
173+ (hf₁ : f₁ ≫ f' j₁ = q := by cat_disch) (hf₂ : f₂ ≫ f' j₂ = q := by cat_disch) :
174+ (F.map f₁.op.toLoc).toFunctor.obj ((F.map (p' j₁).op.toLoc).toFunctor.obj (D.obj (α j₁))) ⟶
175+ (F.map f₂.op.toLoc).toFunctor.obj ((F.map (p' j₂).op.toLoc).toFunctor.obj (D.obj (α j₂))) :=
176+ (F.mapComp (p' j₁).op.toLoc f₁.op.toLoc).inv.toNatTrans.app _ ≫
177+ D.hom (q ≫ p) (f₁ ≫ p' _) (f₂ ≫ p' _) (by simp [w, reassoc_of% hf₁])
178+ (by simp [w, reassoc_of% hf₂]) ≫
179+ (F.mapComp (p' j₂).op.toLoc f₂.op.toLoc).hom.toNatTrans.app _
180+
181+ @[reassoc]
182+ lemma pullFunctorObjHom_eq (D : F.DescentData f)
183+ ⦃Y : C⦄ (q : Y ⟶ S') ⦃j₁ j₂ : ι'⦄ (f₁ : Y ⟶ X' j₁) (f₂ : Y ⟶ X' j₂)
184+ (q' : Y ⟶ S) (f₁' : Y ⟶ X (α j₁)) (f₂' : Y ⟶ X (α j₂))
185+ (hf₁ : f₁ ≫ f' j₁ = q := by cat_disch) (hf₂ : f₂ ≫ f' j₂ = q := by cat_disch)
186+ (hq' : q ≫ p = q' := by cat_disch)
187+ (hf₁' : f₁ ≫ p' j₁ = f₁' := by cat_disch)
188+ (hf₂' : f₂ ≫ p' j₂ = f₂' := by cat_disch) :
189+ pullFunctorObjHom w D q f₁ f₂ =
190+ (F.mapComp' _ _ _).inv.toNatTrans.app _ ≫ D.hom q' f₁' f₂'
191+ (by rw [← hq', ← hf₁', Category.assoc, w, reassoc_of% hf₁])
192+ (by rw [← hq', ← hf₂', Category.assoc, w, reassoc_of% hf₂]) ≫
193+ (F.mapComp' _ _ _).hom.toNatTrans.app _ := by
194+ subst hq' hf₁' hf₂'
195+ simp [mapComp'_eq_mapComp, pullFunctorObjHom]
196+
197+ /-- Auxiliary definition for `pullFunctor`. -/
198+ @[simps]
199+ def pullFunctorObj (D : F.DescentData f) :
200+ F.DescentData f' where
201+ obj j := (F.map (p' _).op.toLoc).toFunctor.obj (D.obj (α j))
202+ hom Y q j₁ j₂ f₁ f₂ hf₁ hf₂ := pullFunctorObjHom w _ _ _ _
203+ pullHom_hom Y' Y g q q' hq j₁ j₂ f₁ f₂ hf₁ hf₂ gf₁ gf₂ hgf₁ hgf₂ := by
204+ rw [pullFunctorObjHom_eq _ _ _ _ _ (q' ≫ p) (gf₁ ≫ p' j₁) (gf₂ ≫ p' j₂),
205+ pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) (f₁ ≫ p' j₁) (f₂ ≫ p' j₂)]
206+ rw [← D.pullHom_hom g (q ≫ p) (q' ≫ p) (by rw [reassoc_of% hq])
207+ (f₁ ≫ p' j₁) (f₂ ≫ p' j₂) (by rw [Category.assoc, w, reassoc_of% hf₁])
208+ (by rw [Category.assoc, w, reassoc_of% hf₂]) (gf₁ ≫ p' j₁) (gf₂ ≫ p' j₂)
209+ (by cat_disch) (by cat_disch)]
210+ dsimp [pullHom]
211+ simp only [Functor.map_comp, Category.assoc]
212+ rw [F.mapComp'₀₁₃_inv_comp_mapComp'₀₂₃_hom_app_assoc _ _ _ _ _ _ _ _ (by cat_disch),
213+ mapComp'₀₂₃_inv_comp_mapComp'₀₁₃_hom_app _ _ _ _ _ _ _ _ _ (by cat_disch)]
214+ hom_self Y q j g hg := by
215+ rw [pullFunctorObjHom_eq _ _ _ _ _ _ _ _ rfl rfl rfl rfl rfl,
216+ D.hom_self _ _ (by cat_disch)]
217+ simp
218+ hom_comp Y q j₁ j₂ j₃ f₁ f₂ f₃ hf₁ hf₂ hf₃ := by
219+ rw [pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) (f₁ ≫ p' j₁) (f₂ ≫ p' j₂),
220+ pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) (f₂ ≫ p' j₂) (f₃ ≫ p' j₃),
221+ pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) (f₁ ≫ p' j₁) (f₃ ≫ p' j₃)]
222+ simp
223+
224+ variable (F)
225+
226+ /-- Given family of morphisms `f : X i ⟶ S` and `f' : X' j ⟶ S'`, and suitable
227+ commutative diagrams `p' j ≫ f (α j) = f' j ≫ p`, this is the
228+ induced functor `F.DescentData f ⥤ F.DescentData f'`. (Up to a (unique) isomorphism,
229+ this functor only depends on `f` and `f'`, see `pullFunctorIso`.) -/
230+ @[simps]
231+ def pullFunctor : F.DescentData f ⥤ F.DescentData f' where
232+ obj D := pullFunctorObj w D
233+ map {D₁ D₂} φ :=
234+ { hom j := (F.map (p' j).op.toLoc).toFunctor.map (φ.hom (α j))
235+ comm Y q j₁ j₂ f₁ f₂ hf₁ hf₂ := by
236+ have := φ.comm (q ≫ p) (f₁ ≫ p' j₁) (f₂ ≫ p' j₂)
237+ (by rw [Category.assoc, w, reassoc_of% hf₁])
238+ (by rw [Category.assoc, w, reassoc_of% hf₂])
239+ dsimp at this ⊢
240+ rw [pullFunctorObjHom_eq_assoc _ _ _ _ _ (q ≫ p) (f₁ ≫ p' j₁) (f₂ ≫ p' j₂),
241+ pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) (f₁ ≫ p' j₁) (f₂ ≫ p' j₂)]
242+ dsimp
243+ rw [mapComp'_inv_naturality_assoc, ← mapComp'_hom_naturality,
244+ reassoc_of% this] }
245+
246+ /-- Given families of morphisms `f : X i ⟶ S` and `f' : X' j ⟶ S'`, suitable
247+ commutative diagrams `w j : p' j ≫ f (α j) = f' j ≫ p`, this is the natural
248+ isomorphism between the descent data relative to `f'` that are obtained either:
249+ * by considering the obvious descent data relative to `f` given by an object `M : F.obj (op S)`,
250+ followed by the application of `pullFunctor F w : F.DescentData f ⥤ F.DescentData f'`;
251+ * by considering the obvious descent data relative to `f'` given by pulling
252+ back the object `M` to `S'`. -/
253+ def toDescentDataCompPullFunctorIso :
254+ F.toDescentData f ⋙ pullFunctor F w ≅ (F.map p.op.toLoc).toFunctor ⋙ F.toDescentData f' :=
255+ NatIso.ofComponents
256+ (fun M ↦ isoMk (fun i ↦ (Cat.Hom.toNatIso
257+ (F.isoMapOfCommSq (CommSq.mk (w i)).op.toLoc)).symm.app M)
258+ (fun Y q i₁ i₂ f₁ f₂ hf₁ hf₂ ↦ by
259+ dsimp
260+ rw [F.isoMapOfCommSq_eq _ _ rfl, F.isoMapOfCommSq_eq _ _ rfl]
261+ dsimp
262+ simp only [Functor.map_comp, Category.assoc]
263+ rw [← F.mapComp'₀₂₃_inv_comp_mapComp'₀₁₃_hom_app_assoc p.op.toLoc
264+ (f' i₁).op.toLoc f₁.op.toLoc _ q.op.toLoc (p.op.toLoc ≫ q.op.toLoc) rfl
265+ (by grind) (by grind) M,
266+ pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) (f₁ ≫ p' i₁) (f₂ ≫ p' i₂),
267+ ← cancel_mono ((F.mapComp' (f' i₂).op.toLoc f₂.op.toLoc q.op.toLoc
268+ (by grind)).inv.toNatTrans.app _)]
269+ dsimp
270+ simp only [Category.assoc,
271+ ← F.mapComp'₀₂₃_inv_comp_mapComp'₀₁₃_hom_app p.op.toLoc
272+ (f' i₂).op.toLoc f₂.op.toLoc _ q.op.toLoc (p.op.toLoc ≫ q.op.toLoc) rfl
273+ (by grind) (by grind) M,
274+ ← F.mapComp'_inv_whiskerRight_mapComp'₀₂₃_inv_app_assoc (f (α i₁)).op.toLoc
275+ (p' i₁).op.toLoc f₁.op.toLoc (p.op.toLoc ≫ (f' i₁).op.toLoc) _
276+ (p.op.toLoc ≫ q.op.toLoc) (by grind) rfl (by grind) M,
277+ F.mapComp'_inv_whiskerRight_mapComp'₀₂₃_inv_app_assoc (f (α i₂)).op.toLoc
278+ (p' i₂).op.toLoc f₂.op.toLoc (p.op.toLoc ≫ (f' i₂).op.toLoc) _
279+ (p.op.toLoc ≫ q.op.toLoc) (by grind) rfl (by grind) M]
280+ simp))
281+ (fun f ↦ by
282+ ext i
283+ exact (F.isoMapOfCommSq (CommSq.mk (w i)).op.toLoc).inv.toNatTrans.naturality f)
284+
285+ /-- Up to a (unique) isomorphism, the functor
286+ `pullFunctor : F.DescentData f ⥤ F.DescentData f'` does not depend
287+ on the auxiliary data. -/
288+ @[simps!]
289+ def pullFunctorIso {β : ι' → ι} {p'' : ∀ j, X' j ⟶ X (β j)}
290+ (w' : ∀ j, p'' j ≫ f (β j) = f' j ≫ p) :
291+ pullFunctor F w ≅ pullFunctor F w' :=
292+ NatIso.ofComponents (fun D ↦ isoMk (fun j ↦ D.iso _ _ _) (by
293+ intro Y q j₁ j₂ f₁ f₂ hf₁ hf₂
294+ dsimp
295+ rw [pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) _ _ rfl (by cat_disch) (by cat_disch),
296+ pullFunctorObjHom_eq _ _ _ _ _ (q ≫ p) _ _ rfl (by cat_disch) (by cat_disch),
297+ map_eq_pullHom_assoc _ _ (f₁ ≫ p' j₁) (f₁ ≫ p'' j₁) (by cat_disch) (by cat_disch),
298+ map_eq_pullHom _ _ (f₂ ≫ p' j₂) (f₂ ≫ p'' j₂) (by cat_disch) (by cat_disch)]
299+ simp only [Cat.Hom.hom_inv_id_toNatTrans_app_assoc, Category.assoc]
300+ rw [pullHom_hom _ _ _ (q ≫ p) (by rw [w, reassoc_of% hf₁]) _ _
301+ rfl (by cat_disch) _ _ rfl rfl, hom_comp_assoc,
302+ pullHom_hom _ _ _ (q ≫ p) (by rw [w, reassoc_of% hf₂]) _ _
303+ rfl (by cat_disch) _ _ rfl rfl, hom_comp_assoc]))
304+ (fun φ ↦ by
305+ ext j
306+ exact φ.comm _ _ _ rfl (by cat_disch))
307+
308+ variable (S) in
309+ /-- The functor `F.DescentData f ⥤ F.DescentData f` corresponding to `pullFunctor`
310+ applied to identity morphisms is isomorphic to the identity functor. -/
311+ @[simps!]
312+ def pullFunctorIdIso :
313+ pullFunctor F (p := 𝟙 S) (p' := fun _ ↦ 𝟙 _) (w := by simp) ≅ 𝟭 (F.DescentData f) :=
314+ NatIso.ofComponents (fun D ↦ isoMk (fun i ↦ (Cat.Hom.toNatIso (F.mapId _)).app _) (by
315+ intro Y q i₁ i₂ f₁ f₂ hf₁ hf₂
316+ dsimp
317+ rw [pullFunctorObjHom_eq_assoc _ _ _ _ _ q f₁ f₂ rfl]
318+ simp [mapComp'_id_comp_inv_app_assoc, mapComp'_id_comp_hom_app, ← Functor.map_comp]))
319+
320+ /-- The composition of two functors `pullFunctor` is isomorphic to `pullFunctor` applied
321+ to the compositions. -/
322+ @[simps!]
323+ def pullFunctorCompIso
324+ {S'' : C} {q : S'' ⟶ S'} {ι'' : Type t''} {X'' : ι'' → C} {f'' : ∀ k, X'' k ⟶ S''}
325+ {β : ι'' → ι'} {q' : ∀ k, X'' k ⟶ X' (β k)} (w' : ∀ k, q' k ≫ f' (β k) = f'' k ≫ q)
326+ (r : S'' ⟶ S) {r' : ∀ k, X'' k ⟶ X (α (β k))}
327+ (hr : q ≫ p = r := by cat_disch) (hr' : ∀ k, q' k ≫ p' (β k) = r' k := by cat_disch) :
328+ pullFunctor F w ⋙ pullFunctor F w' ≅
329+ pullFunctor F (p := r) (α := α ∘ β) (p' := r') (fun k ↦ by
330+ dsimp
331+ rw [← hr', Category.assoc, w, reassoc_of% w', hr]) :=
332+ NatIso.ofComponents
333+ (fun D ↦ isoMk (fun _ ↦ (Cat.Hom.toNatIso (F.mapComp' _ _ _ (by grind))).symm.app _) (by
334+ intro Y s k₁ k₂ f₁ f₂ hf₁ hf₂
335+ dsimp
336+ rw [pullFunctorObjHom_eq _ _ _ _ _ (s ≫ r) _ _ rfl,
337+ pullFunctorObjHom_eq _ _ _ _ _ (s ≫ q) (f₁ ≫ q' k₁) (f₂ ≫ q' k₂)]
338+ dsimp
339+ rw [pullFunctorObjHom_eq _ _ _ _ _ (s ≫ r) (f₁ ≫ r' k₁) (f₂ ≫ r' k₂)
340+ rfl (by simp [w', reassoc_of% hf₁, reassoc_of% hf₂]) (by
341+ simp [reassoc_of% w', reassoc_of% hf₁, hr])]
342+ dsimp
343+ simp only [Category.assoc]
344+ rw [mapComp'_inv_whiskerRight_mapComp'₀₂₃_inv_app_assoc _ _ _ _ _ _ _
345+ (by grind) rfl rfl, mapComp'₀₂₃_hom_app _ _ _ _ _ _ _ _ rfl rfl]))
346+
347+ end
348+
349+ variable {f} in
350+ /-- Up to an equivalence, the category `DescentData` for a pseudofunctor `F` and
351+ a family of morphisms `f : X i ⟶ S` is unchanged when we replace `S` by an isomorphic object,
352+ or when we replace `f` by another family which generate the same sieve. -/
353+ @[simps]
354+ def pullFunctorEquivalence {S' : C} {ι' : Type t'} {X' : ι' → C} {f' : ∀ j, X' j ⟶ S'}
355+ (e : S' ≅ S) {α : ι' → ι} {p' : ∀ j, X' j ⟶ X (α j)}
356+ (w : ∀ j, p' j ≫ f (α j) = f' j ≫ e.hom)
357+ {β : ι → ι'} {q' : ∀ i, X i ⟶ X' (β i)} (w' : ∀ i, q' i ≫ f' (β i) = f i ≫ e.inv) :
358+ F.DescentData f ≌ F.DescentData f' where
359+ functor := pullFunctor F w
360+ inverse := pullFunctor F w'
361+ unitIso :=
362+ (pullFunctorIdIso F S).symm ≪≫ pullFunctorIso _ _ _ ≪≫
363+ (pullFunctorCompIso _ _ _ _ e.inv_hom_id (fun _ ↦ rfl)).symm
364+ counitIso :=
365+ pullFunctorCompIso _ _ _ _ e.hom_inv_id (fun _ ↦ rfl) ≪≫
366+ pullFunctorIso _ _ _ ≪≫ pullFunctorIdIso F S'
367+ functor_unitIso_comp D := by
368+ ext j
369+ dsimp
370+ simp only [Category.id_comp, Functor.map_comp, Category.assoc]
371+ rw [pullFunctorObjHom_eq_assoc _ _ _ _ _ (p' _ ≫ f _) (p' _ ≫ q' _ ≫ p' _) (p' _) (by simp)
372+ (by simp [w', reassoc_of% w]),
373+ map_eq_pullHom_assoc _ (p' j) (p' j) (p' _ ≫ q' _ ≫ p' _) (by simp) (by simp),
374+ D.pullHom_hom _ _ (p' j ≫ f _) (by simp) _ _ (by simp)
375+ (by simp [w, reassoc_of% w']) _ _ (by simp) rfl]
376+ dsimp
377+ rw [← F.mapComp'₀₁₃_hom_comp_whiskerLeft_mapComp'_hom_app_assoc _ _ _ _ _ _ rfl rfl (by simp),
378+ mapComp'_comp_id_hom_app, mapComp'_id_comp_inv_app_assoc, ← Functor.map_comp_assoc,
379+ Cat.Hom.inv_hom_id_toNatTrans_app]
380+ simp [D.hom_self _ _ rfl]
381+
382+ end DescentData
383+
163384end Pseudofunctor
164385
165386end CategoryTheory
0 commit comments