Skip to content

Commit 46e9020

Browse files
joelriougoliath-klein
authored andcommitted
feat(CategoryTheory/Sites): functoriality of descent data (leanprover-community#30190)
Given a pseudofunctor `F` from `LocallyDiscrete Cᵒᵖ` to `Cat`, we show that up to an equivalence, the category `F.DescentData f` is unchanged when we replace `S` by an isomorphic object, or the family `f i : X i ⟶ S` by another family which generates the same sieve (see `Pseudofunctor.DescentData.pullFunctorEquivalence`). Co-authored-by: Christian Merten [christian@merten.dev](mailto:christian@merten.dev)
1 parent ed69853 commit 46e9020

File tree

3 files changed

+264
-8
lines changed

3 files changed

+264
-8
lines changed

Mathlib/CategoryTheory/Bicategory/LocallyDiscrete.lean

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ Authors: Yuma Mizuno, Calle Sönne
55
-/
66
module
77

8+
public import Mathlib.CategoryTheory.CommSq
89
public import Mathlib.CategoryTheory.Discrete.Basic
910
public import Mathlib.CategoryTheory.Bicategory.Strict.Basic
1011

@@ -156,4 +157,10 @@ lemma CategoryTheory.LocallyDiscrete.eqToHom_toLoc {C : Type u} [Category.{v} C]
156157
(h : a = b) : (eqToHom h).toLoc = eqToHom (congrArg LocallyDiscrete.mk h) := by
157158
subst h; rfl
158159

160+
lemma CategoryTheory.CommSq.toLoc {C : Type*} [Category C] {X₁ X₂ X₃ X₄ : C}
161+
{t : X₁ ⟶ X₂} {l : X₁ ⟶ X₃} {r : X₂ ⟶ X₄} {b : X₃ ⟶ X₄}
162+
(h : CommSq t l r b) :
163+
CommSq t.toLoc l.toLoc r.toLoc b.toLoc :=
164+
by simp only [← Quiver.Hom.comp_toLoc, h.w]⟩
165+
159166
end

Mathlib/CategoryTheory/Category/Cat.lean

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,34 @@ lemma isoMk_toNatIso {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) :
180180
lemma toNatIso_isoMk {C D : Type u} [Category.{v} C] [Category.{v} D] {F G : C ⥤ D} (e : F ≅ G) :
181181
Hom.toNatIso (isoMk e) = e := rfl
182182

183+
instance {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) :
184+
IsIso e.hom.toNatTrans :=
185+
(toNatIso e).isIso_hom
186+
187+
instance {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) :
188+
IsIso e.inv.toNatTrans :=
189+
(toNatIso e).isIso_inv
190+
191+
@[reassoc (attr := simp)]
192+
lemma hom_inv_id_toNatTrans {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) :
193+
e.hom.toNatTrans ≫ e.inv.toNatTrans = 𝟙 _ :=
194+
(toNatIso e).hom_inv_id
195+
196+
@[reassoc (attr := simp)]
197+
lemma inv_hom_id_toNatTrans {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) :
198+
e.inv.toNatTrans ≫ e.hom.toNatTrans = 𝟙 _ :=
199+
(toNatIso e).inv_hom_id
200+
201+
@[reassoc (attr := simp)]
202+
lemma hom_inv_id_toNatTrans_app {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) (A : X) :
203+
e.hom.toNatTrans.app A ≫ e.inv.toNatTrans.app A = 𝟙 _ :=
204+
(toNatIso e).hom_inv_id_app A
205+
206+
@[reassoc (attr := simp)]
207+
lemma inv_hom_id_toNatTrans_app {X Y : Cat.{v, u}} {F G : X ⟶ Y} (e : F ≅ G) (A : X) :
208+
e.inv.toNatTrans.app A ≫ e.hom.toNatTrans.app A = 𝟙 _ :=
209+
(toNatIso e).inv_hom_id_app A
210+
183211
end Hom
184212

185213
end

Mathlib/CategoryTheory/Sites/Descent/DescentData.lean

Lines changed: 229 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ and a family of maps `f i : X i ⟶ S` in the category `C`,
1515
we define the category `F.DescentData f` of objects over the `X i`
1616
equipped 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

3035
namespace 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
156155
end DescentData
157156

158157
/-- The functor `F.obj (.mk (op S)) ⥤ F.DescentData f`. -/
158+
@[simps]
159159
def 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+
163384
end Pseudofunctor
164385

165386
end CategoryTheory

0 commit comments

Comments
 (0)