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

tactic: ext
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
⊢ η ≫ J.toPlus Q = J.toPlus P ≫ J.plusMap η
state_after: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ (η ≫ J.toPlus Q).app x✝ = (J.toPlus P ≫ J.plusMap η).app x✝

tactic: dsimp [toPlus, plusMap]
state_before: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ (η ≫ J.toPlus Q).app x✝ = (J.toPlus P ≫ J.plusMap η).app x✝
state_after: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫ ⊤.toMultiequalizer Q ≫ colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    (⊤.toMultiequalizer P ≫ colimit.ι (J.diagram P x✝.unop) { unop := ⊤ }) ≫ colimMap (J.diagramNatTrans η x✝.unop)

tactic: delta Cover.toMultiequalizer
state_before: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫ ⊤.toMultiequalizer Q ≫ colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    (⊤.toMultiequalizer P ≫ colimit.ι (J.diagram P x✝.unop) { unop := ⊤ }) ≫ colimMap (J.diagramNatTrans η x✝.unop)
state_after: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯ ≫
        colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    (Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
        colimit.ι (J.diagram P x✝.unop) { unop := ⊤ }) ≫
      colimMap (J.diagramNatTrans η x✝.unop)

tactic: simp only [ι_colimMap, Category.assoc]
state_before: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯ ≫
        colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    (Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
        colimit.ι (J.diagram P x✝.unop) { unop := ⊤ }) ≫
      colimMap (J.diagramNatTrans η x✝.unop)
state_after: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯ ≫
        colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
      (J.diagramNatTrans η x✝.unop).app { unop := ⊤ } ≫ colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ }

tactic: simp_rw [← Category.assoc]
state_before: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫
      Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯ ≫
        colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
      (J.diagramNatTrans η x✝.unop).app { unop := ⊤ } ≫ colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ }
state_after: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ (η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯) ≫
      colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    (Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
        (J.diagramNatTrans η x✝.unop).app { unop := ⊤ }) ≫
      colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ }

tactic: congr 1
state_before: case w.h
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ (η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯) ≫
      colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ } =
    (Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
        (J.diagramNatTrans η x✝.unop).app { unop := ⊤ }) ≫
      colimit.ι (J.diagram Q x✝.unop) { unop := ⊤ }
state_after: case w.h.e_a
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯ =
    Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
      (J.diagramNatTrans η x✝.unop).app { unop := ⊤ }

tactic: exact Multiequalizer.hom_ext _ _ _ (fun I => by dsimp; simp)
state_before: case w.h.e_a
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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
⊢ η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯ =
    Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
      (J.diagramNatTrans η x✝.unop).app { unop := ⊤ }
state_after: no goals

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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
I : (⊤.index Q).L
⊢ (η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj { unop := x✝.unop }) (fun I => Q.map I.f.op) ⋯) ≫
      Multiequalizer.ι (⊤.index Q) I =
    (Multiequalizer.lift (⊤.index P) (P.obj { unop := x✝.unop }) (fun I => P.map I.f.op) ⋯ ≫
        (J.diagramNatTrans η x✝.unop).app { unop := ⊤ }) ≫
      Multiequalizer.ι (⊤.index Q) 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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
I : (⊤.index Q).L
⊢ (η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj x✝) (fun I => Q.map I.f.op) ⋯) ≫ Multiequalizer.ι (⊤.index Q) I =
    (Multiequalizer.lift (⊤.index P) (P.obj x✝) (fun I => P.map I.f.op) ⋯ ≫
        Multiequalizer.lift (⊤.index Q) (multiequalizer (⊤.index P))
          (fun i => Multiequalizer.ι (⊤.index P) i ≫ η.app { unop := i.Y }) ⋯) ≫
      Multiequalizer.ι (⊤.index Q) I

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
inst✝ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
P Q : Cᵒᵖ ⥤ D
η : P ⟶ Q
x✝ : Cᵒᵖ
I : (⊤.index Q).L
⊢ (η.app x✝ ≫ Multiequalizer.lift (⊤.index Q) (Q.obj x✝) (fun I => Q.map I.f.op) ⋯) ≫ Multiequalizer.ι (⊤.index Q) I =
    (Multiequalizer.lift (⊤.index P) (P.obj x✝) (fun I => P.map I.f.op) ⋯ ≫
        Multiequalizer.lift (⊤.index Q) (multiequalizer (⊤.index P))
          (fun i => Multiequalizer.ι (⊤.index P) i ≫ η.app { unop := i.Y }) ⋯) ≫
      Multiequalizer.ι (⊤.index Q) I
state_after: no goals