Theorem: PresheafOfModules.limitBundledCore_obj
File: Mathlib/Algebra/Category/ModuleCat/Presheaf/Limits.lean

Proof steps:
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ (fun {X Y} f =>
        limMap (whiskerLeft F (restriction R f)) ≫
          (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv)
      (𝟙 X) =
    (ModuleCat.restrictScalarsId' (R.map (𝟙 X)) ⋯).inv.app ((fun X => limit (F ⋙ evaluation R X)) X)
state_after: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ limMap (whiskerLeft F (restriction R (𝟙 X))) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).inv =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv
tactic: dsimp
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ limMap (whiskerLeft F (restriction R (𝟙 X))) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).inv =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv
state_after: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ limMap (whiskerLeft F (restriction R (𝟙 X))) =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom
tactic: rw [← cancel_mono (preservesLimitIso _ _).hom, assoc, Iso.inv_hom_id, comp_id]
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ limMap (whiskerLeft F (restriction R (𝟙 X))) =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ ∀ (j : J),
    limMap (whiskerLeft F (restriction R (𝟙 X))) ≫
        limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j =
      ((ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
          (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom) ≫
        limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j
tactic: apply limit.hom_ext
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
⊢ ∀ (j : J),
    limMap (whiskerLeft F (restriction R (𝟙 X))) ≫
        limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j =
      ((ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
          (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom) ≫
        limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limMap (whiskerLeft F (restriction R (𝟙 X))) ≫
      limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j =
    ((ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
        (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom) ≫
      limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j
tactic: intro j
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limMap (whiskerLeft F (restriction R (𝟙 X))) ≫
      limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j =
    ((ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
        (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom) ≫
      limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫ restrictionApp (𝟙 X) (F.obj j) =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom ≫
        limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j
tactic: simp only [limMap_π, Functor.comp_obj, evaluation_obj, whiskerLeft_app,
      restriction_app, assoc]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫ restrictionApp (𝟙 X) (F.obj j) =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (𝟙 X))) (F ⋙ evaluation R X)).hom ≫
        limit.π (F ⋙ evaluation R X ⋙ ModuleCat.restrictScalars (R.map (𝟙 X))) j
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫ restrictionApp (𝟙 X) (F.obj j) =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
      (ModuleCat.restrictScalars (R.map (𝟙 X))).map (limit.π (F ⋙ evaluation R X) j)
tactic: erw [preservesLimitsIso_hom_π]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫ restrictionApp (𝟙 X) (F.obj j) =
    (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ (limit (F ⋙ evaluation R X))).inv ≫
      (ModuleCat.restrictScalars (R.map (𝟙 X))).map (limit.π (F ⋙ evaluation R X) j)
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫ (ModuleCat.restrictScalarsId' (R.map (𝟙 X)) ⋯).inv.app ((F.obj j).obj X) =
    limit.π (F ⋙ evaluation R X) j ≫ (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ ((F ⋙ evaluation R X).obj j)).inv
tactic: rw [← ModuleCat.restrictScalarsId'App_inv_naturality, restrictionApp_id]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X : Cᵒᵖ
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫ (ModuleCat.restrictScalarsId' (R.map (𝟙 X)) ⋯).inv.app ((F.obj j).obj X) =
    limit.π (F ⋙ evaluation R X) j ≫ (ModuleCat.restrictScalarsId'App (R.map (𝟙 X)) ⋯ ((F ⋙ evaluation R X).obj j)).inv
state_after: no goals
tactic: dsimp
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ (fun {X Y} f =>
        limMap (whiskerLeft F (restriction R f)) ≫
          (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv)
      (f ≫ g) =
    (fun {X Y} f =>
          limMap (whiskerLeft F (restriction R f)) ≫
            (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv)
        f ≫
      (ModuleCat.restrictScalars (R.map f)).map
          ((fun {X Y} f =>
              limMap (whiskerLeft F (restriction R f)) ≫
                (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv)
            g) ≫
        (ModuleCat.restrictScalarsComp' (R.map f) (R.map g) (R.map (f ≫ g)) ⋯).inv.app
          ((fun X => limit (F ⋙ evaluation R X)) Z)
state_after: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ limMap (whiskerLeft F (restriction R (f ≫ g))) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).inv =
    (limMap (whiskerLeft F (restriction R f)) ≫
        (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv) ≫
      (ModuleCat.restrictScalars (R.map f)).map
          (limMap (whiskerLeft F (restriction R g)) ≫
            (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
        (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv
tactic: dsimp
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ limMap (whiskerLeft F (restriction R (f ≫ g))) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).inv =
    (limMap (whiskerLeft F (restriction R f)) ≫
        (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv) ≫
      (ModuleCat.restrictScalars (R.map f)).map
          (limMap (whiskerLeft F (restriction R g)) ≫
            (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
        (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv
state_after: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ limMap (whiskerLeft F (restriction R (f ≫ g))) =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map
            (limMap (whiskerLeft F (restriction R g)) ≫
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv ≫
            (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom
tactic: rw [← cancel_mono (preservesLimitIso _ _).hom, assoc, assoc, assoc, assoc, Iso.inv_hom_id,
      comp_id]
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ limMap (whiskerLeft F (restriction R (f ≫ g))) =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map
            (limMap (whiskerLeft F (restriction R g)) ≫
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv ≫
            (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ ∀ (j : J),
    limMap (whiskerLeft F (restriction R (f ≫ g))) ≫
        limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j =
      (limMap (whiskerLeft F (restriction R f)) ≫
          (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
            (ModuleCat.restrictScalars (R.map f)).map
                (limMap (whiskerLeft F (restriction R g)) ≫
                  (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
              (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯
                    (limit (F ⋙ evaluation R Z))).inv ≫
                (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom) ≫
        limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j
tactic: apply limit.hom_ext
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
⊢ ∀ (j : J),
    limMap (whiskerLeft F (restriction R (f ≫ g))) ≫
        limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j =
      (limMap (whiskerLeft F (restriction R f)) ≫
          (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
            (ModuleCat.restrictScalars (R.map f)).map
                (limMap (whiskerLeft F (restriction R g)) ≫
                  (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
              (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯
                    (limit (F ⋙ evaluation R Z))).inv ≫
                (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom) ≫
        limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limMap (whiskerLeft F (restriction R (f ≫ g))) ≫
      limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j =
    (limMap (whiskerLeft F (restriction R f)) ≫
        (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (limMap (whiskerLeft F (restriction R g)) ≫
                (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
            (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv ≫
              (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom) ≫
      limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j
tactic: intro j
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limMap (whiskerLeft F (restriction R (f ≫ g))) ≫
      limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j =
    (limMap (whiskerLeft F (restriction R f)) ≫
        (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (limMap (whiskerLeft F (restriction R g)) ≫
                (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv) ≫
            (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv ≫
              (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom) ≫
      limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp' (R.map f) (R.map g) (R.map (f ≫ g)) ⋯).inv.app ((F.obj j).obj Z) =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limMap (whiskerLeft F (restriction R g))) ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv ≫
            (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv ≫
              (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom ≫
                limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j
tactic: simp only [Functor.comp_obj, evaluation_obj, limMap_π, whiskerLeft_app, restriction_app,
      Functor.map_comp, assoc, restrictionApp_comp]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp' (R.map f) (R.map g) (R.map (f ≫ g)) ⋯).inv.app ((F.obj j).obj Z) =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limMap (whiskerLeft F (restriction R g))) ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv ≫
            (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ (limit (F ⋙ evaluation R Z))).inv ≫
              (preservesLimitIso (ModuleCat.restrictScalars (R.map (f ≫ g))) (F ⋙ evaluation R Z)).hom ≫
                limit.π (F ⋙ evaluation R Z ⋙ ModuleCat.restrictScalars (R.map (f ≫ g))) j
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp' (R.map f) (R.map g) (R.map (f ≫ g)) ⋯).inv.app ((F.obj j).obj Z) =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limMap (whiskerLeft F (restriction R g))) ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv ≫
            (ModuleCat.restrictScalars (R.map f)).map
                ((ModuleCat.restrictScalars (R.map g)).map (limit.π (F ⋙ evaluation R Z) j)) ≫
              (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F ⋙ evaluation R Z).obj j)).inv
tactic: erw [preservesLimitsIso_hom_π, ← ModuleCat.restrictScalarsComp'App_inv_naturality]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp' (R.map f) (R.map g) (R.map (f ≫ g)) ⋯).inv.app ((F.obj j).obj Z) =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limMap (whiskerLeft F (restriction R g))) ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv ≫
            (ModuleCat.restrictScalars (R.map f)).map
                ((ModuleCat.restrictScalars (R.map g)).map (limit.π (F ⋙ evaluation R Z) j)) ≫
              (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F ⋙ evaluation R Z).obj j)).inv
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limMap (whiskerLeft F (restriction R g))) ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv ≫
            (ModuleCat.restrictScalars (R.map f)).map
                ((ModuleCat.restrictScalars (R.map g)).map (limit.π (F ⋙ evaluation R Z) j)) ≫
              (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
tactic: dsimp
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limMap (whiskerLeft F (restriction R g))) ≫
          (ModuleCat.restrictScalars (R.map f)).map
              (preservesLimitIso (ModuleCat.restrictScalars (R.map g)) (F ⋙ evaluation R Z)).inv ≫
            (ModuleCat.restrictScalars (R.map f)).map
                ((ModuleCat.restrictScalars (R.map g)).map (limit.π (F ⋙ evaluation R Z) j)) ≫
              (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map
            (limMap (whiskerLeft F (restriction R g)) ≫
              limit.π ((F ⋙ evaluation R Z) ⋙ ModuleCat.restrictScalars (R.map g)) j) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
tactic: rw [← Functor.map_comp_assoc, ← Functor.map_comp_assoc, assoc,
      preservesLimitsIso_inv_π]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map
            (limMap (whiskerLeft F (restriction R g)) ≫
              limit.π ((F ⋙ evaluation R Z) ⋙ ModuleCat.restrictScalars (R.map g)) j) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map
            (limit.π (F ⋙ evaluation R Y) j ≫ (whiskerLeft F (restriction R g)).app j) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
tactic: erw [limMap_π]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map
            (limit.π (F ⋙ evaluation R Y) j ≫ (whiskerLeft F (restriction R g)).app j) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limit.π (F ⋙ evaluation R Y) j ≫ restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
tactic: dsimp
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      (preservesLimitIso (ModuleCat.restrictScalars (R.map f)) (F ⋙ evaluation R Y)).inv ≫
        (ModuleCat.restrictScalars (R.map f)).map (limit.π (F ⋙ evaluation R Y) j ≫ restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      limit.π ((F ⋙ evaluation R Y) ⋙ ModuleCat.restrictScalars (R.map f)) j ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
tactic: simp only [Functor.map_comp, assoc, preservesLimitsIso_inv_π_assoc]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limMap (whiskerLeft F (restriction R f)) ≫
      limit.π ((F ⋙ evaluation R Y) ⋙ ModuleCat.restrictScalars (R.map f)) j ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
state_after: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limit.π (F ⋙ evaluation R X) j ≫
      (whiskerLeft F (restriction R f)).app j ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
tactic: erw [limMap_π_assoc]
state_before: case w
C : Type u₁
inst✝² : Category.{v₁, u₁} C
R : Cᵒᵖ ⥤ RingCat
J : Type u₂
inst✝¹ : Category.{v₂, u₂} J
F : J ⥤ PresheafOfModules R
inst✝ : ∀ (X : Cᵒᵖ), Small.{v, max u₂ v} ↑((F ⋙ evaluation R X) ⋙ forget (ModuleCat ↑(R.obj X))).sections
X Y Z : Cᵒᵖ
f : X ⟶ Y
g : Y ⟶ Z
j : J
⊢ limit.π (F ⋙ evaluation R X) j ≫
      restrictionApp f (F.obj j) ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv =
    limit.π (F ⋙ evaluation R X) j ≫
      (whiskerLeft F (restriction R f)).app j ≫
        (ModuleCat.restrictScalars (R.map f)).map (restrictionApp g (F.obj j)) ≫
          (ModuleCat.restrictScalarsComp'App (R.map f) (R.map g) (R.map (f ≫ g)) ⋯ ((F.obj j).obj Z)).inv
state_after: no goals
tactic: dsimp