File: Mathlib/CategoryTheory/Idempotents/Basic.lean

full_name: CategoryTheory.IsIdempotentComplete
code: /-- A category is idempotent complete iff all idempotent endomorphisms `p`
split as a composition `p = e ≫ i` with `i ≫ e = 𝟙 _` -/
class IsIdempotentComplete : Prop where
  /-- A category is idempotent complete iff all idempotent endomorphisms `p`
    split as a composition `p = e ≫ i` with `i ≫ e = 𝟙 _` -/
  idempotents_split :
    ∀ (X : C) (p : X ⟶ X), p ≫ p = p → ∃ (Y : C) (i : Y ⟶ X) (e : X ⟶ Y), i ≫ e = 𝟙 Y ∧ e ≫ i = p
goal: Prop

full_name: CategoryTheory.IsIdempotentComplete.idempotents_split
code: /-- A category is idempotent complete iff all idempotent endomorphisms `p`
split as a composition `p = e ≫ i` with `i ≫ e = 𝟙 _` -/
class IsIdempotentComplete : Prop where
  /-- A category is idempotent complete iff all idempotent endomorphisms `p`
    split as a composition `p = e ≫ i` with `i ≫ e = 𝟙 _` -/
  idempotents_split :
    ∀ (X : C) (p : X ⟶ X), p ≫ p = p → ∃ (Y : C) (i : Y ⟶ X) (e : X ⟶ Y), i ≫ e = 𝟙 Y ∧ e ≫ i = p
goal: p ≫ p = p → ∃ Y i e, i ≫ e = 𝟙 Y ∧ e ≫ i = p

full_name: CategoryTheory.Idempotents.isIdempotentComplete_iff_hasEqualizer_of_id_and_idempotent
code: /-- A category is idempotent complete iff for all idempotent endomorphisms,
the equalizer of the identity and this idempotent exists. -/
theorem isIdempotentComplete_iff_hasEqualizer_of_id_and_idempotent :
    IsIdempotentComplete C ↔ ∀ (X : C) (p : X ⟶ X), p ≫ p = p → HasEqualizer (𝟙 X) p 
goal: CategoryTheory.IsIdempotentComplete C ↔ ∀ (X : C) (p : X ⟶ X), p ≫ p = p → CategoryTheory.Limits.HasEqualizer (𝟙 X) p

full_name: CategoryTheory.Idempotents.idem_of_id_sub_idem
code: /-- In a preadditive category, when `p : X ⟶ X` is idempotent,
then `𝟙 X - p` is also idempotent. -/
theorem idem_of_id_sub_idem [Preadditive C] {X : C} (p : X ⟶ X) (hp : p ≫ p = p) :
    (𝟙 _ - p) ≫ (𝟙 _ - p) = 𝟙 _ - p 
goal: (𝟙 X - p) ≫ (𝟙 X - p) = 𝟙 X - p

full_name: CategoryTheory.Idempotents.isIdempotentComplete_iff_idempotents_have_kernels
code: /-- A preadditive category is pseudoabelian iff all idempotent endomorphisms have a kernel. -/
theorem isIdempotentComplete_iff_idempotents_have_kernels [Preadditive C] :
    IsIdempotentComplete C ↔ ∀ (X : C) (p : X ⟶ X), p ≫ p = p → HasKernel p 
goal: CategoryTheory.IsIdempotentComplete C ↔ ∀ (X : C) (p : X ⟶ X), p ≫ p = p → CategoryTheory.Limits.HasKernel p

full_name: CategoryTheory.Idempotents.isIdempotentComplete_of_abelian
code: /-- An abelian category is idempotent complete. -/
instance (priority := 100) isIdempotentComplete_of_abelian (D : Type*) [Category D] [Abelian D] :
    IsIdempotentComplete D 
goal: CategoryTheory.IsIdempotentComplete D

full_name: CategoryTheory.Idempotents.split_imp_of_iso
code: theorem split_imp_of_iso {X X' : C} (φ : X ≅ X') (p : X ⟶ X) (p' : X' ⟶ X')
    (hpp' : p ≫ φ.hom = φ.hom ≫ p')
    (h : ∃ (Y : C) (i : Y ⟶ X) (e : X ⟶ Y), i ≫ e = 𝟙 Y ∧ e ≫ i = p) :
    ∃ (Y' : C) (i' : Y' ⟶ X') (e' : X' ⟶ Y'), i' ≫ e' = 𝟙 Y' ∧ e' ≫ i' = p' 
goal: ∃ Y' i' e', i' ≫ e' = 𝟙 Y' ∧ e' ≫ i' = p'

full_name: CategoryTheory.Idempotents.split_iff_of_iso
code: theorem split_iff_of_iso {X X' : C} (φ : X ≅ X') (p : X ⟶ X) (p' : X' ⟶ X')
    (hpp' : p ≫ φ.hom = φ.hom ≫ p') :
    (∃ (Y : C) (i : Y ⟶ X) (e : X ⟶ Y), i ≫ e = 𝟙 Y ∧ e ≫ i = p) ↔
      ∃ (Y' : C) (i' : Y' ⟶ X') (e' : X' ⟶ Y'), i' ≫ e' = 𝟙 Y' ∧ e' ≫ i' = p' 
goal: (∃ Y i e, i ≫ e = 𝟙 Y ∧ e ≫ i = p) ↔ ∃ Y' i' e', i' ≫ e' = 𝟙 Y' ∧ e' ≫ i' = p'

full_name: CategoryTheory.Idempotents.Equivalence.isIdempotentComplete
code: theorem Equivalence.isIdempotentComplete {D : Type*} [Category D] (ε : C ≌ D)
    (h : IsIdempotentComplete C) : IsIdempotentComplete D 
goal: CategoryTheory.IsIdempotentComplete D

full_name: CategoryTheory.Idempotents.isIdempotentComplete_iff_of_equivalence
code: /-- If `C` and `D` are equivalent categories, that `C` is idempotent complete iff `D` is. -/
theorem isIdempotentComplete_iff_of_equivalence {D : Type*} [Category D] (ε : C ≌ D) :
    IsIdempotentComplete C ↔ IsIdempotentComplete D 
goal: CategoryTheory.IsIdempotentComplete C ↔ CategoryTheory.IsIdempotentComplete D

full_name: CategoryTheory.Idempotents.isIdempotentComplete_of_isIdempotentComplete_opposite
code: theorem isIdempotentComplete_of_isIdempotentComplete_opposite (h : IsIdempotentComplete Cᵒᵖ) :
    IsIdempotentComplete C 
goal: CategoryTheory.IsIdempotentComplete C

full_name: CategoryTheory.Idempotents.isIdempotentComplete_iff_opposite
code: theorem isIdempotentComplete_iff_opposite : IsIdempotentComplete Cᵒᵖ ↔ IsIdempotentComplete C 
goal: CategoryTheory.IsIdempotentComplete Cᵒᵖ ↔ CategoryTheory.IsIdempotentComplete C

full_name: CategoryTheory.Idempotents.instIsIdempotentCompleteOpposite
code: instance [IsIdempotentComplete C] : IsIdempotentComplete Cᵒᵖ 
goal: CategoryTheory.IsIdempotentComplete Cᵒᵖ