Theorem: CategoryTheory.GrothendieckTopology.diagramPullback_app
File: Mathlib/CategoryTheory/Sites/Plus.lean

Proof steps:
state_before: C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝¹ : Category.{max v u, w} D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
P : Cᵒᵖ ⥤ D
X Y : C
f✝ : X ⟶ Y
S T : (J.Cover Y)ᵒᵖ
f : S ⟶ T
I : ((unop ((J.pullback f✝).op.obj T)).index P).L
⊢ ((J.diagram P Y).map f ≫
        (fun S =>
            Multiequalizer.lift ((unop ((J.pullback f✝).op.obj S)).index P) ((J.diagram P Y).obj S)
              (fun I => Multiequalizer.ι ((unop S).index P) (Cover.Arrow.base I)) ⋯)
          T) ≫
      Multiequalizer.ι ((unop ((J.pullback f✝).op.obj T)).index P) I =
    ((fun S =>
            Multiequalizer.lift ((unop ((J.pullback f✝).op.obj S)).index P) ((J.diagram P Y).obj S)
              (fun I => Multiequalizer.ι ((unop S).index P) (Cover.Arrow.base I)) ⋯)
          S ≫
        ((J.pullback f✝).op ⋙ J.diagram P X).map f) ≫
      Multiequalizer.ι ((unop ((J.pullback f✝).op.obj T)).index P) I
state_after: C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝¹ : Category.{max v u, w} D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
P : Cᵒᵖ ⥤ D
X Y : C
f✝ : X ⟶ Y
S T : (J.Cover Y)ᵒᵖ
f : S ⟶ T
I : ((unop ((J.pullback f✝).op.obj T)).index P).L
⊢ (Multiequalizer.lift ((unop T).index P) (multiequalizer ((unop S).index P))
          (fun I => Multiequalizer.ι ((unop S).index P) (I.map f.unop)) ⋯ ≫
        Multiequalizer.lift (((unop T).pullback f✝).index P) (multiequalizer ((unop T).index P))
          (fun I => Multiequalizer.ι ((unop T).index P) I.base) ⋯) ≫
      Multiequalizer.ι (((unop T).pullback f✝).index P) I =
    (Multiequalizer.lift (((unop S).pullback f✝).index P) (multiequalizer ((unop S).index P))
          (fun I => Multiequalizer.ι ((unop S).index P) I.base) ⋯ ≫
        Multiequalizer.lift (((unop T).pullback f✝).index P) (multiequalizer (((unop S).pullback f✝).index P))
          (fun I => Multiequalizer.ι (((unop S).pullback f✝).index P) (I.map ((J.pullback f✝).map f.unop))) ⋯) ≫
      Multiequalizer.ι (((unop T).pullback f✝).index P) I
tactic: dsimp
state_before: C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝¹ : Category.{max v u, w} D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
P : Cᵒᵖ ⥤ D
X Y : C
f✝ : X ⟶ Y
S T : (J.Cover Y)ᵒᵖ
f : S ⟶ T
I : ((unop ((J.pullback f✝).op.obj T)).index P).L
⊢ (Multiequalizer.lift ((unop T).index P) (multiequalizer ((unop S).index P))
          (fun I => Multiequalizer.ι ((unop S).index P) (I.map f.unop)) ⋯ ≫
        Multiequalizer.lift (((unop T).pullback f✝).index P) (multiequalizer ((unop T).index P))
          (fun I => Multiequalizer.ι ((unop T).index P) I.base) ⋯) ≫
      Multiequalizer.ι (((unop T).pullback f✝).index P) I =
    (Multiequalizer.lift (((unop S).pullback f✝).index P) (multiequalizer ((unop S).index P))
          (fun I => Multiequalizer.ι ((unop S).index P) I.base) ⋯ ≫
        Multiequalizer.lift (((unop T).pullback f✝).index P) (multiequalizer (((unop S).pullback f✝).index P))
          (fun I => Multiequalizer.ι (((unop S).pullback f✝).index P) (I.map ((J.pullback f✝).map f.unop))) ⋯) ≫
      Multiequalizer.ι (((unop T).pullback f✝).index P) I
state_after: C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝¹ : Category.{max v u, w} D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
P : Cᵒᵖ ⥤ D
X Y : C
f✝ : X ⟶ Y
S T : (J.Cover Y)ᵒᵖ
f : S ⟶ T
I : ((unop ((J.pullback f✝).op.obj T)).index P).L
⊢ Multiequalizer.ι ((unop S).index P) ((Cover.Arrow.base I).map f.unop) =
    Multiequalizer.ι ((unop S).index P) (Cover.Arrow.map I ((J.pullback f✝).map f.unop)).base
tactic: simp
state_before: C : Type u
inst✝² : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝¹ : Category.{max v u, w} D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
P : Cᵒᵖ ⥤ D
X Y : C
f✝ : X ⟶ Y
S T : (J.Cover Y)ᵒᵖ
f : S ⟶ T
I : ((unop ((J.pullback f✝).op.obj T)).index P).L
⊢ Multiequalizer.ι ((unop S).index P) ((Cover.Arrow.base I).map f.unop) =
    Multiequalizer.ι ((unop S).index P) (Cover.Arrow.map I ((J.pullback f✝).map f.unop)).base
state_after: no goals
tactic: rfl