Theorem: CategoryTheory.ShortComplex.SnakeInput.δ_apply
File: Mathlib/Algebra/Homology/ShortComplex/ConcreteCategory.lean

tactic: have := (forget₂ C Ab).preservesFiniteLimitsOfPreservesHomology
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this : PreservesFiniteLimits (forget₂ C Ab)
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: have : PreservesFiniteLimits (forget C) := by
  have : forget₂ C Ab ⋙ forget Ab = forget C := HasForget₂.forget_comp
  simpa only [← this] using compPreservesFiniteLimits _ _
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this : PreservesFiniteLimits (forget₂ C Ab)
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: have eq := congr_fun ((forget C).congr_map D.snd_δ)
  (Limits.Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: have eq₁ := Concrete.pullbackMk_fst D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
eq₁ : pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: have eq₂ := Concrete.pullbackMk_snd D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
eq₁ : pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
eq₁ : pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: dsimp [DFunLike.coe] at eq₁ eq₂
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
eq₁ : pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: rw [Functor.map_comp, types_comp_apply, FunctorToTypes.map_comp_apply] at eq
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map (pullback.snd ≫ D.δ) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) =
    (forget C).map (D.φ₁ ≫ D.v₂₃.τ₁) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ ((forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)) =
    (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: rw [eq₂] at eq
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ ((forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)) =
    (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁

tactic: refine eq.trans (congr_arg ((forget C).map D.v₂₃.τ₁) ?_)
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ D.δ x₃ = D.v₂₃.τ₁ x₁
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₁

tactic: apply (Preadditive.mono_iff_injective' D.L₂.f).1 inferInstance
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₁
state_after: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.L₂.f ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)) = (forget C).map D.L₂.f x₁

tactic: rw [← FunctorToTypes.map_comp_apply, φ₁_L₂_f]
state_before: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.L₂.f ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂)) = (forget C).map D.L₂.f x₁
state_after: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.φ₂ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = (forget C).map D.L₂.f x₁

tactic: dsimp [φ₂]
state_before: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.φ₂ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = (forget C).map D.L₂.f x₁
state_after: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map (pullback.fst ≫ D.v₁₂.τ₂) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = (forget C).map D.L₂.f x₁

tactic: rw [Functor.map_comp, types_comp_apply, eq₁]
state_before: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map (pullback.fst ≫ D.v₁₂.τ₂) (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = (forget C).map D.L₂.f x₁
state_after: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.v₁₂.τ₂ x₂ = (forget C).map D.L₂.f x₁

tactic: exact h₁.symm
state_before: case a
C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : PreservesFiniteLimits (forget C)
eq :
  (forget C).map D.δ x₃ = (forget C).map D.v₂₃.τ₁ ((forget C).map D.φ₁ (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂))
eq₁ : (forget C).map pullback.fst (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₂
eq₂ : (forget C).map pullback.snd (Concrete.pullbackMk D.L₁.g D.v₀₁.τ₃ x₂ x₃ h₂) = x₃
⊢ (forget C).map D.v₁₂.τ₂ x₂ = (forget C).map D.L₂.f x₁
state_after: no goals

tactic: have : forget₂ C Ab ⋙ forget Ab = forget C := HasForget₂.forget_comp
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this : PreservesFiniteLimits (forget₂ C Ab)
⊢ PreservesFiniteLimits (forget C)
state_after: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : forget₂ C Ab ⋙ forget Ab = forget C
⊢ PreservesFiniteLimits (forget C)

tactic: simpa only [← this] using compPreservesFiniteLimits _ _
state_before: C : Type u
inst✝⁵ : Category.{v, u} C
inst✝⁴ : ConcreteCategory C
inst✝³ : HasForget₂ C Ab
inst✝² : Abelian C
inst✝¹ : (forget₂ C Ab).Additive
inst✝ : (forget₂ C Ab).PreservesHomology
D : SnakeInput C
x₃ : (forget C).obj D.L₀.X₃
x₂ : (forget C).obj D.L₁.X₂
x₁ : (forget C).obj D.L₂.X₁
h₂ : D.L₁.g x₂ = D.v₀₁.τ₃ x₃
h₁ : D.L₂.f x₁ = D.v₁₂.τ₂ x₂
this✝ : PreservesFiniteLimits (forget₂ C Ab)
this : forget₂ C Ab ⋙ forget Ab = forget C
⊢ PreservesFiniteLimits (forget C)
state_after: no goals