Theorem: SimplicialObject.Splitting.comp_PInfty_eq_zero_iff
File: Mathlib/AlgebraicTopology/DoldKan/SplitSimplicialObject.lean

tactic: constructor
state_before: C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
⊢ f ≫ PInfty.f n = 0 ↔ f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
state_after: case mp
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
⊢ f ≫ PInfty.f n = 0 → f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0

case mpr
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0 → f ≫ PInfty.f n = 0

tactic: intro h
state_before: case mp
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
⊢ f ≫ PInfty.f n = 0 → f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
state_after: case mp
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ PInfty.f n = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0

tactic: rcases n with _|n
state_before: case mp
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ PInfty.f n = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
state_after: case mp.zero
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
f : Z ⟶ X _[0]
h : f ≫ PInfty.f 0 = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [0] }) = 0

case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0

tactic: dsimp at h
state_before: case mp.zero
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
f : Z ⟶ X _[0]
h : f ≫ PInfty.f 0 = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [0] }) = 0
state_after: case mp.zero
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
f : Z ⟶ X _[0]
h : f ≫ 𝟙 (X _[0]) = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [0] }) = 0

tactic: rw [comp_id] at h
state_before: case mp.zero
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
f : Z ⟶ X _[0]
h : f ≫ 𝟙 (X _[0]) = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [0] }) = 0
state_after: case mp.zero
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
f : Z ⟶ X _[0]
h : f = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [0] }) = 0

tactic: rw [h, zero_comp]
state_before: case mp.zero
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
f : Z ⟶ X _[0]
h : f = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [0] }) = 0
state_after: no goals

tactic: have h' := f ≫= PInfty_f_add_QInfty_f (n + 1)
state_before: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0
state_after: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ (PInfty.f (n + 1) + QInfty.f (n + 1)) = f ≫ 𝟙 (K[X].X (n + 1))
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0

tactic: dsimp at h'
state_before: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ (PInfty.f (n + 1) + QInfty.f (n + 1)) = f ≫ 𝟙 (K[X].X (n + 1))
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0
state_after: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ (PInfty.f (n + 1) + QInfty.f (n + 1)) = f ≫ 𝟙 (X _[n + 1])
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0

tactic: rw [comp_id, comp_add, h, zero_add] at h'
state_before: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ (PInfty.f (n + 1) + QInfty.f (n + 1)) = f ≫ 𝟙 (X _[n + 1])
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0
state_after: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ QInfty.f (n + 1) = f
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0

tactic: rw [← h', assoc, QInfty_f, decomposition_Q, Preadditive.sum_comp, Preadditive.comp_sum,
  Finset.sum_eq_zero]
state_before: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ QInfty.f (n + 1) = f
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0
state_after: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ QInfty.f (n + 1) = f
⊢ ∀ x ∈ Finset.filter (fun i => ↑i < n + 1) Finset.univ,
    f ≫ ((P ↑x).f (n + 1) ≫ X.δ x.rev.succ ≫ X.σ x.rev) ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0

tactic: intro i _
state_before: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ QInfty.f (n + 1) = f
⊢ ∀ x ∈ Finset.filter (fun i => ↑i < n + 1) Finset.univ,
    f ≫ ((P ↑x).f (n + 1) ≫ X.δ x.rev.succ ≫ X.σ x.rev) ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0
state_after: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ QInfty.f (n + 1) = f
i : Fin (n + 1)
a✝ : i ∈ Finset.filter (fun i => ↑i < n + 1) Finset.univ
⊢ f ≫ ((P ↑i).f (n + 1) ≫ X.δ i.rev.succ ≫ X.σ i.rev) ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0

tactic: simp only [assoc, σ_comp_πSummand_id_eq_zero, comp_zero]
state_before: case mp.succ
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n + 1]
h : f ≫ PInfty.f (n + 1) = 0
h' : f ≫ QInfty.f (n + 1) = f
i : Fin (n + 1)
a✝ : i ∈ Finset.filter (fun i => ↑i < n + 1) Finset.univ
⊢ f ≫ ((P ↑i).f (n + 1) ≫ X.δ i.rev.succ ≫ X.σ i.rev) ≫ s.πSummand (IndexSet.id { unop := [n + 1] }) = 0
state_after: no goals

tactic: intro h
state_before: case mpr
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
⊢ f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0 → f ≫ PInfty.f n = 0
state_after: case mpr
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
⊢ f ≫ PInfty.f n = 0

tactic: rw [← comp_id f, assoc, s.decomposition_id, Preadditive.sum_comp, Preadditive.comp_sum,
  Fintype.sum_eq_zero]
state_before: case mpr
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
⊢ f ≫ PInfty.f n = 0
state_after: case mpr.h
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
⊢ ∀ (a : IndexSet { unop := [n] }), f ≫ (s.πSummand a ≫ (s.cofan { unop := [n] }).inj a) ≫ PInfty.f n = 0

tactic: intro A
state_before: case mpr.h
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
⊢ ∀ (a : IndexSet { unop := [n] }), f ≫ (s.πSummand a ≫ (s.cofan { unop := [n] }).inj a) ≫ PInfty.f n = 0
state_after: case mpr.h
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0

tactic: by_cases hA : A.EqId
state_before: case mpr.h
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0
state_after: case pos
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
hA : A.EqId
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0

case neg
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
hA : ¬A.EqId
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0

tactic: dsimp at hA
state_before: case pos
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
hA : A.EqId
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0
state_after: case pos
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
hA : A = IndexSet.id { unop := [n] }
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0

tactic: subst hA
state_before: case pos
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
hA : A = IndexSet.id { unop := [n] }
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0
state_after: case pos
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
⊢ f ≫
      (s.πSummand (IndexSet.id { unop := [n] }) ≫ (s.cofan { unop := [n] }).inj (IndexSet.id { unop := [n] })) ≫
        PInfty.f n =
    0

tactic: rw [assoc, reassoc_of% h, zero_comp]
state_before: case pos
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
⊢ f ≫
      (s.πSummand (IndexSet.id { unop := [n] }) ≫ (s.cofan { unop := [n] }).inj (IndexSet.id { unop := [n] })) ≫
        PInfty.f n =
    0
state_after: no goals

tactic: simp only [assoc, s.cofan_inj_comp_PInfty_eq_zero A hA, comp_zero]
state_before: case neg
C : Type u_1
inst✝¹ : Category.{u_2, u_1} C
X : SimplicialObject C
s : Splitting X
inst✝ : Preadditive C
Z : C
n : ℕ
f : Z ⟶ X _[n]
h : f ≫ s.πSummand (IndexSet.id { unop := [n] }) = 0
A : IndexSet { unop := [n] }
hA : ¬A.EqId
⊢ f ≫ (s.πSummand A ≫ (s.cofan { unop := [n] }).inj A) ≫ PInfty.f n = 0
state_after: no goals