Theorem: CategoryTheory.GrothendieckTopology.Plus.toPlus_mk
File: Mathlib/CategoryTheory/Sites/ConcreteSheafification.lean

tactic: dsimp [mk, toPlus]
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
⊢ ((J.toPlus P).app { unop := X }) x = mk (Meq.mk S x)
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
⊢ (⊤.toMultiequalizer P ≫ colimit.ι (J.diagram P X) { unop := ⊤ }) x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: let e : S ⟶ ⊤ := homOfLE (OrderTop.le_top _)
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
⊢ (⊤.toMultiequalizer P ≫ colimit.ι (J.diagram P X) { unop := ⊤ }) x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (⊤.toMultiequalizer P ≫ colimit.ι (J.diagram P X) { unop := ⊤ }) x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: rw [← colimit.w _ e.op]
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (⊤.toMultiequalizer P ≫ colimit.ι (J.diagram P X) { unop := ⊤ }) x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (⊤.toMultiequalizer P ≫ (J.diagram P X).map e.op ≫ colimit.ι (J.diagram P X) { unop := S }) x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: delta Cover.toMultiequalizer
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (⊤.toMultiequalizer P ≫ (J.diagram P X).map e.op ≫ colimit.ι (J.diagram P X) { unop := S }) x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯ ≫
        (J.diagram P X).map e.op ≫ colimit.ι (J.diagram P X) { unop := S })
      x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: erw [comp_apply, comp_apply]
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯ ≫
        (J.diagram P X).map e.op ≫ colimit.ι (J.diagram P X) { unop := S })
      x =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (colimit.ι (J.diagram P X) { unop := S })
      (((J.diagram P X).map e.op)
        ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x)) =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: apply congr_arg
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (colimit.ι (J.diagram P X) { unop := S })
      (((J.diagram P X).map e.op)
        ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x)) =
    (colimit.ι (J.diagram P X) { unop := S }) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: case h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ ((J.diagram P X).map e.op) ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x) =
    (Meq.equiv P S).symm (Meq.mk S x)

tactic: dsimp [diagram]
state_before: case h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ ((J.diagram P X).map e.op) ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x) =
    (Meq.equiv P S).symm (Meq.mk S x)
state_after: case h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (Multiequalizer.lift (S.index P) (multiequalizer (⊤.index P)) (fun I => Multiequalizer.ι (⊤.index P) (I.map e)) ⋯)
      ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x) =
    (Meq.equiv P S).symm (Meq.mk S x)

tactic: apply Concrete.multiequalizer_ext
state_before: case h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ (Multiequalizer.lift (S.index P) (multiequalizer (⊤.index P)) (fun I => Multiequalizer.ι (⊤.index P) (I.map e)) ⋯)
      ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x) =
    (Meq.equiv P S).symm (Meq.mk S x)
state_after: case h.h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ ∀ (t : (S.index P).L),
    (Multiequalizer.ι (S.index P) t)
        ((Multiequalizer.lift (S.index P) (multiequalizer (⊤.index P)) (fun I => Multiequalizer.ι (⊤.index P) (I.map e))
            ⋯)
          ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x)) =
      (Multiequalizer.ι (S.index P) t) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: intro i
state_before: case h.h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
⊢ ∀ (t : (S.index P).L),
    (Multiequalizer.ι (S.index P) t)
        ((Multiequalizer.lift (S.index P) (multiequalizer (⊤.index P)) (fun I => Multiequalizer.ι (⊤.index P) (I.map e))
            ⋯)
          ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x)) =
      (Multiequalizer.ι (S.index P) t) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: case h.h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
i : (S.index P).L
⊢ (Multiequalizer.ι (S.index P) i)
      ((Multiequalizer.lift (S.index P) (multiequalizer (⊤.index P)) (fun I => Multiequalizer.ι (⊤.index P) (I.map e))
          ⋯)
        ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x)) =
    (Multiequalizer.ι (S.index P) i) ((Meq.equiv P S).symm (Meq.mk S x))

tactic: simp only [← comp_apply, Category.assoc, Multiequalizer.lift_ι, Category.comp_id,
  Meq.equiv_symm_eq_apply]
state_before: case h.h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
i : (S.index P).L
⊢ (Multiequalizer.ι (S.index P) i)
      ((Multiequalizer.lift (S.index P) (multiequalizer (⊤.index P)) (fun I => Multiequalizer.ι (⊤.index P) (I.map e))
          ⋯)
        ((Multiequalizer.lift (⊤.index P) (P.obj { unop := X }) (fun I => P.map I.f.op) ⋯) x)) =
    (Multiequalizer.ι (S.index P) i) ((Meq.equiv P S).symm (Meq.mk S x))
state_after: case h.h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
i : (S.index P).L
⊢ (P.map (Cover.Arrow.map i e).f.op) x = ↑(Meq.mk S x) i

tactic: rfl
state_before: case h.h
C : Type u
inst✝⁵ : Category.{v, u} C
J : GrothendieckTopology C
D : Type w
inst✝⁴ : Category.{max v u, w} D
inst✝³ : ConcreteCategory D
inst✝² : PreservesLimits (forget D)
inst✝¹ : ∀ (X : C), HasColimitsOfShape (J.Cover X)ᵒᵖ D
inst✝ : ∀ (P : Cᵒᵖ ⥤ D) (X : C) (S : J.Cover X), HasMultiequalizer (S.index P)
X : C
P : Cᵒᵖ ⥤ D
S : J.Cover X
x : (forget D).obj (P.obj { unop := X })
e : S ⟶ ⊤ := homOfLE ⋯
i : (S.index P).L
⊢ (P.map (Cover.Arrow.map i e).f.op) x = ↑(Meq.mk S x) i
state_after: no goals