Theorem: CategoryTheory.Functor.exact_tfae
File: Mathlib/Algebra/Homology/ShortComplex/ExactFunctor.lean

Proof steps:
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
state_after: case tfae_1_to_3
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
⊢ (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology

C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
tactic: tfae_have 1 → 3
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
state_after: case tfae_2_to_1
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
⊢ (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact

C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
tactic: tfae_have 2 → 1
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
state_after: case tfae_3_to_4
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
⊢ Nonempty F.PreservesHomology → Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)

C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
tfae_3_to_4 : Nonempty F.PreservesHomology → Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
tactic: tfae_have 3 → 4
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
tfae_3_to_4 : Nonempty F.PreservesHomology → Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
state_after: case tfae_4_to_2
C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
tfae_3_to_4 : Nonempty F.PreservesHomology → Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)
⊢ Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F) →
    ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact

C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
tfae_3_to_4 : Nonempty F.PreservesHomology → Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)
tfae_4_to_2 :
  Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F) →
    ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
tactic: tfae_have 4 → 2
state_before: C : Type u_1
D : Type u_2
inst✝⁴ : Category.{u_3, u_1} C
inst✝³ : Category.{u_4, u_2} D
inst✝² : Abelian C
inst✝¹ : Abelian D
F : C ⥤ D
inst✝ : F.Additive
tfae_1_to_3 : (∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact) → Nonempty F.PreservesHomology
tfae_2_to_1 :
  (∀ (S : ShortComplex C), S.Exact → (S.map F).Exact) → ∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact
tfae_3_to_4 : Nonempty F.PreservesHomology → Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)
tfae_4_to_2 :
  Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F) →
    ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact
⊢ [∀ (S : ShortComplex C), S.ShortExact → (S.map F).ShortExact, ∀ (S : ShortComplex C), S.Exact → (S.map F).Exact,
      Nonempty F.PreservesHomology, Nonempty (PreservesFiniteLimits F) ∧ Nonempty (PreservesFiniteColimits F)].TFAE
state_after: no goals
tactic: tfae_finish