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

tactic: let S := Presheaf.imageSieve α (R.val.map π r) ⊓ Presheaf.imageSieve φ (A.val.map π m)
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
⊢ (A.val.map π) (smul α φ r m) = smul α φ ((R.val.map π) r) ((A.val.map π) m)
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ (A.val.map π) (smul α φ r m) = smul α φ ((R.val.map π) r) ((A.val.map π) m)

tactic: have hS : S ∈ J Y.unop := by
  apply J.intersection_covering
  all_goals apply Presheaf.imageSieve_mem
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ (A.val.map π) (smul α φ r m) = smul α φ ((R.val.map π) r) ((A.val.map π) m)
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y.unop
⊢ (A.val.map π) (smul α φ r m) = smul α φ ((R.val.map π) r) ((A.val.map π) m)

tactic: apply A.isSeparated _ _ hS
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y.unop
⊢ (A.val.map π) (smul α φ r m) = smul α φ ((R.val.map π) r) ((A.val.map π) m)
state_after: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y.unop
⊢ ∀ (Y_1 : C) (f : Y_1 ⟶ Y.unop),
    S.arrows f →
      (A.val.map f.op) ((A.val.map π) (smul α φ r m)) = (A.val.map f.op) (smul α φ ((R.val.map π) r) ((A.val.map π) m))

tactic: rintro Y f ⟨⟨r₀, hr₀⟩, ⟨m₀, hm₀⟩⟩
state_before: case a
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y.unop
⊢ ∀ (Y_1 : C) (f : Y_1 ⟶ Y.unop),
    S.arrows f →
      (A.val.map f.op) ((A.val.map π) (smul α φ r m)) = (A.val.map f.op) (smul α φ ((R.val.map π) r) ((A.val.map π) m))
state_after: case a.intro.intro.intro
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y✝ : Cᵒᵖ
π : X ⟶ Y✝
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y✝.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y✝.unop
Y : C
f : Y ⟶ Y✝.unop
r₀ : (forget RingCat).obj (R₀.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (R.val.map f.op) ((R.val.map π) r)
m₀ : (forget AddCommGrp).obj (M₀.presheaf.obj { unop := Y })
hm₀ : (φ.app { unop := Y }) m₀ = (A.val.map f.op) ((A.val.map π) m)
⊢ (A.val.map f.op) ((A.val.map π) (smul α φ r m)) = (A.val.map f.op) (smul α φ ((R.val.map π) r) ((A.val.map π) m))

tactic: erw [← comp_apply, ← Functor.map_comp,
  map_smul_eq α φ r m (π ≫ f.op) r₀ (by rw [hr₀, Functor.map_comp, comp_apply]) m₀
    (by erw [hm₀, Functor.map_comp, comp_apply]; rfl),
  map_smul_eq α φ (R.val.map π r) (A.val.map π m) f.op r₀ hr₀ m₀ hm₀]
state_before: case a.intro.intro.intro
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y✝ : Cᵒᵖ
π : X ⟶ Y✝
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y✝.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y✝.unop
Y : C
f : Y ⟶ Y✝.unop
r₀ : (forget RingCat).obj (R₀.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (R.val.map f.op) ((R.val.map π) r)
m₀ : (forget AddCommGrp).obj (M₀.presheaf.obj { unop := Y })
hm₀ : (φ.app { unop := Y }) m₀ = (A.val.map f.op) ((A.val.map π) m)
⊢ (A.val.map f.op) ((A.val.map π) (smul α φ r m)) = (A.val.map f.op) (smul α φ ((R.val.map π) r) ((A.val.map π) m))
state_after: no goals

tactic: apply J.intersection_covering
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ S ∈ J.sieves Y.unop
state_after: case rj
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ Presheaf.imageSieve α ((R.val.map π) r) ∈ J.sieves Y.unop

case sj
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ Presheaf.imageSieve φ ((A.val.map π) m) ∈ J.sieves Y.unop

tactic: all_goals apply Presheaf.imageSieve_mem
state_before: case rj
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ Presheaf.imageSieve α ((R.val.map π) r) ∈ J.sieves Y.unop

case sj
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ Presheaf.imageSieve φ ((A.val.map π) m) ∈ J.sieves Y.unop
state_after: no goals

tactic: apply Presheaf.imageSieve_mem
state_before: case sj
C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y : Cᵒᵖ
π : X ⟶ Y
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
⊢ Presheaf.imageSieve φ ((A.val.map π) m) ∈ J.sieves Y.unop
state_after: no goals

tactic: rw [hr₀, Functor.map_comp, comp_apply]
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y✝ : Cᵒᵖ
π : X ⟶ Y✝
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y✝.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y✝.unop
Y : C
f : Y ⟶ Y✝.unop
r₀ : (forget RingCat).obj (R₀.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (R.val.map f.op) ((R.val.map π) r)
m₀ : (forget AddCommGrp).obj (M₀.presheaf.obj { unop := Y })
hm₀ : (φ.app { unop := Y }) m₀ = (A.val.map f.op) ((A.val.map π) m)
⊢ (α.app { unop := Y }) r₀ = (R.val.map (π ≫ f.op)) r
state_after: no goals

tactic: erw [hm₀, Functor.map_comp, comp_apply]
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y✝ : Cᵒᵖ
π : X ⟶ Y✝
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y✝.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y✝.unop
Y : C
f : Y ⟶ Y✝.unop
r₀ : (forget RingCat).obj (R₀.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (R.val.map f.op) ((R.val.map π) r)
m₀ : (forget AddCommGrp).obj (M₀.presheaf.obj { unop := Y })
hm₀ : (φ.app { unop := Y }) m₀ = (A.val.map f.op) ((A.val.map π) m)
⊢ (φ.app { unop := Y }) m₀ = (A.val.map (π ≫ f.op)) m
state_after: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y✝ : Cᵒᵖ
π : X ⟶ Y✝
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y✝.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y✝.unop
Y : C
f : Y ⟶ Y✝.unop
r₀ : (forget RingCat).obj (R₀.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (R.val.map f.op) ((R.val.map π) r)
m₀ : (forget AddCommGrp).obj (M₀.presheaf.obj { unop := Y })
hm₀ : (φ.app { unop := Y }) m₀ = (A.val.map f.op) ((A.val.map π) m)
⊢ (A.val.map f.op) ((A.val.map π) m) = (A.val.map f.op) ((A.val.map π) m)

tactic: rfl
state_before: C : Type u₁
inst✝⁴ : Category.{v₁, u₁} C
J : GrothendieckTopology C
R₀ : Cᵒᵖ ⥤ RingCat
R : Sheaf J RingCat
α : R₀ ⟶ R.val
inst✝³ : Presheaf.IsLocallyInjective J α
inst✝² : Presheaf.IsLocallySurjective J α
M₀ : PresheafOfModules R₀
A : Sheaf J AddCommGrp
φ : M₀.presheaf ⟶ A.val
inst✝¹ : Presheaf.IsLocallyInjective J φ
inst✝ : Presheaf.IsLocallySurjective J φ
X Y✝ : Cᵒᵖ
π : X ⟶ Y✝
r r' : ↑(R.val.obj X)
m m' : ↑(A.val.obj X)
S : Sieve Y✝.unop := Presheaf.imageSieve α ((R.val.map π) r) ⊓ Presheaf.imageSieve φ ((A.val.map π) m)
hS : S ∈ J.sieves Y✝.unop
Y : C
f : Y ⟶ Y✝.unop
r₀ : (forget RingCat).obj (R₀.obj { unop := Y })
hr₀ : (α.app { unop := Y }) r₀ = (R.val.map f.op) ((R.val.map π) r)
m₀ : (forget AddCommGrp).obj (M₀.presheaf.obj { unop := Y })
hm₀ : (φ.app { unop := Y }) m₀ = (A.val.map f.op) ((A.val.map π) m)
⊢ (A.val.map f.op) ((A.val.map π) m) = (A.val.map f.op) ((A.val.map π) m)
state_after: no goals