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

tactic: ext
state_before: C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
⊢ η ≫ toPlus J Q = toPlus J P ≫ plusMap J η

tactic: dsimp [toPlus, plusMap]
state_before: case w.h
C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ (η ≫ toPlus J Q).app x✝ = (toPlus J P ≫ plusMap J η).app x✝

tactic: delta Cover.toMultiequalizer
state_before: case w.h
C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫ Cover.toMultiequalizer ⊤ Q ≫ colimit.ι (diagram J Q x✝.unop) ⊤.op =
    (Cover.toMultiequalizer ⊤ P ≫ colimit.ι (diagram J P x✝.unop) ⊤.op) ≫ colimMap (diagramNatTrans J η x✝.unop)

tactic: simp only [ι_colimMap, Category.assoc]
state_before: case w.h
C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (Cover.index ⊤ Q) (Q.obj x✝.unop.op) (fun I => Q.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ Q).R),
              (fun I => Q.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ Q) I =
                (fun I => Q.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ Q) I) ≫
        colimit.ι (diagram J Q x✝.unop) ⊤.op =
    (Multiequalizer.lift (Cover.index ⊤ P) (P.obj x✝.unop.op) (fun I => P.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ P).R),
              (fun I => P.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ P) I =
                (fun I => P.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ P) I) ≫
        colimit.ι (diagram J P x✝.unop) ⊤.op) ≫
      colimMap (diagramNatTrans J η x✝.unop)

tactic: simp_rw [← Category.assoc]
state_before: case w.h
C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (Cover.index ⊤ Q) (Q.obj x✝.unop.op) (fun I => Q.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ Q).R),
              (fun I => Q.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ Q) I =
                (fun I => Q.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ Q) I) ≫
        colimit.ι (diagram J Q x✝.unop) ⊤.op =
    Multiequalizer.lift (Cover.index ⊤ P) (P.obj x✝.unop.op) (fun I => P.map I.f.op)
        (_ :
          ∀ (I : (Cover.index ⊤ P).R),
            (fun I => P.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ P) I) ≫
                MulticospanIndex.fst (Cover.index ⊤ P) I =
              (fun I => P.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ P) I) ≫
                MulticospanIndex.snd (Cover.index ⊤ P) I) ≫
      (diagramNatTrans J η x✝.unop).app ⊤.op ≫ colimit.ι (diagram J Q x✝.unop) ⊤.op

tactic: congr 1
state_before: case w.h
C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ (η.app x✝ ≫
        Multiequalizer.lift (Cover.index ⊤ Q) (Q.obj x✝.unop.op) (fun I => Q.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ Q).R),
              (fun I => Q.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ Q) I =
                (fun I => Q.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ Q) I)) ≫
      colimit.ι (diagram J Q x✝.unop) ⊤.op =
    (Multiequalizer.lift (Cover.index ⊤ P) (P.obj x✝.unop.op) (fun I => P.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ P).R),
              (fun I => P.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ P) I =
                (fun I => P.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ P) I) ≫
        (diagramNatTrans J η x✝.unop).app ⊤.op) ≫
      colimit.ι (diagram J Q x✝.unop) ⊤.op

tactic: exact Multiequalizer.hom_ext _ _ _ (fun I => by dsimp ; simp)
state_before: case w.h.e_a
C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (Cover.index ⊤ Q) (Q.obj x✝.unop.op) (fun I => Q.map I.f.op)
        (_ :
          ∀ (I : (Cover.index ⊤ Q).R),
            (fun I => Q.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ Q) I) ≫
                MulticospanIndex.fst (Cover.index ⊤ Q) I =
              (fun I => Q.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ Q) I) ≫
                MulticospanIndex.snd (Cover.index ⊤ Q) I) =
    Multiequalizer.lift (Cover.index ⊤ P) (P.obj x✝.unop.op) (fun I => P.map I.f.op)
        (_ :
          ∀ (I : (Cover.index ⊤ P).R),
            (fun I => P.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ P) I) ≫
                MulticospanIndex.fst (Cover.index ⊤ P) I =
              (fun I => P.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ P) I) ≫
                MulticospanIndex.snd (Cover.index ⊤ P) I) ≫
      (diagramNatTrans J η x✝.unop).app ⊤.op

tactic: dsimp
state_before: C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
I : (Cover.index ⊤ Q).L
⊢ (η.app x✝ ≫
        Multiequalizer.lift (Cover.index ⊤ Q) (Q.obj x✝.unop.op) (fun I => Q.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ Q).R),
              (fun I => Q.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ Q) I =
                (fun I => Q.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ Q) I)) ≫
      Multiequalizer.ι (Cover.index ⊤ Q) I =
    (Multiequalizer.lift (Cover.index ⊤ P) (P.obj x✝.unop.op) (fun I => P.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ P).R),
              (fun I => P.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ P) I =
                (fun I => P.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ P) I) ≫
        (diagramNatTrans J η x✝.unop).app ⊤.op) ≫
      Multiequalizer.ι (Cover.index ⊤ Q) I

tactic: simp
state_before: C : Type u
inst✝³ : Category C
J : GrothendieckTopology C
D : Type w
inst✝² : Category D
inst✝¹ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : Cover J X), HasMultiequalizer (Cover.index S P)
P✝ : Cᵒᵖ ⥤ D
inst✝ : ∀ (X : C), HasColimitsOfShape (Cover J X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
I : (Cover.index ⊤ Q).L
⊢ (η.app x✝ ≫
        Multiequalizer.lift (Cover.index ⊤ Q) (Q.obj x✝) (fun I => Q.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ Q).R),
              (fun I => Q.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ Q) I =
                (fun I => Q.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ Q) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ Q) I)) ≫
      Multiequalizer.ι (Cover.index ⊤ Q) I =
    (Multiequalizer.lift (Cover.index ⊤ P) (P.obj x✝) (fun I => P.map I.f.op)
          (_ :
            ∀ (I : (Cover.index ⊤ P).R),
              (fun I => P.map I.f.op) (MulticospanIndex.fstTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.fst (Cover.index ⊤ P) I =
                (fun I => P.map I.f.op) (MulticospanIndex.sndTo (Cover.index ⊤ P) I) ≫
                  MulticospanIndex.snd (Cover.index ⊤ P) I) ≫
        Multiequalizer.lift (Cover.index ⊤ Q) (multiequalizer (Cover.index ⊤ P))
          (fun i => Multiequalizer.ι (Cover.index ⊤ P) i ≫ η.app i.Y.op)
          (_ :
            ∀ (i : (Cover.index ⊤.op.unop Q).R),
              (fun i => Multiequalizer.ι (Cover.index ⊤.op.unop P) i ≫ η.app i.Y.op)
                    (MulticospanIndex.fstTo (Cover.index ⊤.op.unop Q) i) ≫
                  MulticospanIndex.fst (Cover.index ⊤.op.unop Q) i =
                (fun i => Multiequalizer.ι (Cover.index ⊤.op.unop P) i ≫ η.app i.Y.op)
                    (MulticospanIndex.sndTo (Cover.index ⊤.op.unop Q) i) ≫
                  MulticospanIndex.snd (Cover.index ⊤.op.unop Q) i)) ≫
      Multiequalizer.ι (Cover.index ⊤ Q) I