Theorem: PresheafOfModules.Sheafify.app_eq_of_isLocallyInjective
File: Mathlib/Algebra/Category/ModuleCat/Presheaf/Sheafify.lean

tactic: apply hA _ (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve (F := M₀.presheaf) m₀ m₀')
state_before: C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ (φ.app { unop := Y }) (r₀ • m₀) = (φ.app { unop := Y }) (r₀' • m₀')
state_after: case x
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀' ∈ J.sieves { unop := Y }.unop

case a
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ ∀ (Y_1 : C) (f : Y_1 ⟶ { unop := Y }.unop),
    (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀').arrows f →
      (A.map f.op) ((φ.app { unop := Y }) (r₀ • m₀)) = (A.map f.op) ((φ.app { unop := Y }) (r₀' • m₀'))

tactic: apply J.intersection_covering
state_before: case x
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀' ∈ J.sieves { unop := Y }.unop
state_after: case x.rj
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ Presheaf.equalizerSieve r₀ r₀' ∈ J.sieves { unop := Y }.unop

case x.sj
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ Presheaf.equalizerSieve m₀ m₀' ∈ J.sieves { unop := Y }.unop

tactic: exact Presheaf.equalizerSieve_mem J α _ _ hr₀
state_before: case x.rj
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ Presheaf.equalizerSieve r₀ r₀' ∈ J.sieves { unop := Y }.unop
state_after: no goals

tactic: exact Presheaf.equalizerSieve_mem J φ _ _ hm₀
state_before: case x.sj
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ Presheaf.equalizerSieve m₀ m₀' ∈ J.sieves { unop := Y }.unop
state_after: no goals

tactic: intro Z g hg
state_before: case a
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
⊢ ∀ (Y_1 : C) (f : Y_1 ⟶ { unop := Y }.unop),
    (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀').arrows f →
      (A.map f.op) ((φ.app { unop := Y }) (r₀ • m₀)) = (A.map f.op) ((φ.app { unop := Y }) (r₀' • m₀'))
state_after: case a
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
Z : C
g : Z ⟶ { unop := Y }.unop
hg : (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀').arrows g
⊢ (A.map g.op) ((φ.app { unop := Y }) (r₀ • m₀)) = (A.map g.op) ((φ.app { unop := Y }) (r₀' • m₀'))

tactic: erw [← NatTrans.naturality_apply, ← NatTrans.naturality_apply, M₀.map_smul, M₀.map_smul,
  hg.1, hg.2]
state_before: case a
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
Z : C
g : Z ⟶ { unop := Y }.unop
hg : (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀').arrows g
⊢ (A.map g.op) ((φ.app { unop := Y }) (r₀ • m₀)) = (A.map g.op) ((φ.app { unop := Y }) (r₀' • m₀'))
state_after: case a
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
Z : C
g : Z ⟶ { unop := Y }.unop
hg : (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀').arrows g
⊢ (φ.app { unop := Z }) ((R₀.map g.op) r₀' • (M₀.presheaf.map g.op) m₀') =
    (φ.app { unop := Z }) ((R₀.map g.op) r₀' • (M₀.presheaf.map g.op) m₀')

tactic: rfl
state_before: case a
C : Type u₁
inst✝² : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ R : Cᵒᵖ ⥤ RingCat
α : R₀ ⟶ R
inst✝¹ : Presheaf.IsLocallyInjective J α
M₀ : PresheafOfModules R₀
A : Cᵒᵖ ⥤ AddCommGrp
φ : M₀.presheaf ⟶ A
inst✝ : Presheaf.IsLocallyInjective J φ
hA : Presheaf.IsSeparated J A
X : C
r : ↑(R.obj { unop := X })
m : ↑(A.obj { unop := X })
P : Presieve X
r₀✝ : FamilyOfElements (R₀ ⋙ forget RingCat) P
m₀✝ : FamilyOfElements (M₀.presheaf ⋙ forget AddCommGrp) P
hr₀✝ : (r₀✝.map (whiskerRight α (forget RingCat))).IsAmalgamation r
hm₀✝ : (m₀✝.map (whiskerRight φ (forget AddCommGrp))).IsAmalgamation m
Y : C
r₀ r₀' : ↑(R₀.obj { unop := Y })
m₀ m₀' : ↑(M₀.presheaf.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (α.app { unop := Y }) r₀'
hm₀ : (φ.app { unop := Y }) m₀ = (φ.app { unop := Y }) m₀'
Z : C
g : Z ⟶ { unop := Y }.unop
hg : (Presheaf.equalizerSieve r₀ r₀' ⊓ Presheaf.equalizerSieve m₀ m₀').arrows g
⊢ (φ.app { unop := Z }) ((R₀.map g.op) r₀' • (M₀.presheaf.map g.op) m₀') =
    (φ.app { unop := Z }) ((R₀.map g.op) r₀' • (M₀.presheaf.map g.op) m₀')
state_after: no goals