scicraft/LeanCat huggingface dataset:
Domain: Category | Level: High | Tags: Cocompletion
Reference: Proposition 3.2, Chen Ruiyuan 2021, On sifted colimits in the presence of pullbacks, arXiv:2109.12708

Definition: A category is called sifted if the category of cocones over any finite discrete family of objects in it is connected.


Notation: $\mathrm{Rec}(\mathcal{C})$ := free cocompletion of $\mathcal{C}$ under reflexive coequalizers.


Theorem: For a sifted category with pullbacks $\mathcal C$, $\mathrm{Rec}(\mathcal C)$ is filtered.


Reference: Proposition 3.2, Chen Ruiyuan 2021, On sifted colimits in the presence of pullbacks, arXiv:2109.12708

Lean 4 formal statement:
import Mathlib

namespace CAT_statement_S_0075

open CategoryTheory Limits

universe u v

namespace CategoryTheory.Limits
open Limits Functor
variable {C : Type u} [Category.{v} C]

variable (C)  in

abbrev Psh (C : Type u) [Category.{v} C] : Type (max u (v + 1)) :=
  Cᵒᵖ ⥤ Type v


inductive RecObjectPresentation : Psh C → Type (max u (v + 1))
  | ofYoneda (X : C) :
      RecObjectPresentation ((yoneda : C ⥤ Psh C).obj X)
  | iso {A B : Psh C} (P : RecObjectPresentation A) (i : A ≅ B) :
      RecObjectPresentation B
  | reflexiveCoeq {A B : Psh C}
      (PA : RecObjectPresentation A) (PB : RecObjectPresentation B)
      (f g : A ⟶ B) [IsReflexivePair f g] [HasCoequalizer f g] :
      RecObjectPresentation (coequalizer f g)


structure IsRecObject (A : Psh C) : Prop where
  mk' :: nonempty_presentation : Nonempty (RecObjectPresentation  A)

theorem IsRecObject.mk (A : Psh C) (P : RecObjectPresentation A) :
    IsRecObject  A :=
  ⟨⟨P⟩⟩


theorem isRecObject_yoneda (X : C) :
    IsRecObject (C := C) ((yoneda : C ⥤ Psh C).obj X) :=
  ⟨⟨RecObjectPresentation.ofYoneda (C := C) X⟩⟩


theorem isRecObject_coequalizer
    {A B : Psh C} (hA : IsRecObject (C := C) A) (hB : IsRecObject (C := C) B)
    (f g : A ⟶ B) [IsReflexivePair f g] :
    IsRecObject (C := C) (coequalizer f g) := by
  classical
  rcases hA.nonempty_presentation with ⟨PA⟩
  rcases hB.nonempty_presentation with ⟨PB⟩
  letI : HasCoequalizer f g := by infer_instance
  exact ⟨⟨RecObjectPresentation.reflexiveCoeq (C := C) PA PB f g⟩⟩

end CategoryTheory.Limits

namespace CategoryTheory

open Limits

variable {C : Type u} [Category.{v} C]

variable (C) [LocallySmall C] in

def Rec : Type (max u (v + 1)) :=
  ShrinkHoms (ObjectProperty.FullSubcategory (IsRecObject (C := C)))

noncomputable instance : Category.{max u v} (Rec C) :=
  inferInstanceAs <| Category.{max u v}
    (ShrinkHoms (ObjectProperty.FullSubcategory (IsRecObject (C := C))))


noncomputable def Rec.equivalence :
    Rec C ≌ ObjectProperty.FullSubcategory (IsRecObject (C := C)) :=
  (ShrinkHoms.equivalence _).symm

theorem sifted_with_pullbacks_Rec_is_filtered {C : Type u} [Category.{v} C]
    [IsSifted C] [HasPullbacks C] :
    IsFiltered (Rec C) := by
  sorry

end CategoryTheory

end CAT_statement_S_0075
Domain: Category | Level: High | Tags: Cocompletion
Reference: Jiří Adámek, Liang-Ting Chen, Stefan Milius, and Henning Urbat, Reiterman's Theorem on Finite Algebras for a Monad, arXiv:2101.00942

Theorem: Let $\mathcal Set^{fin}$ be the category of finite sets and functions. Its pro-completion is the category
$$ \mathrm{Pro}(\mathcal Set^{fin}) = \mathcal Stone$$
of Stone spaces, i.e. compact topological spaces in which distinct elements can be separated by
clopen subsets. Morphisms are the continuous functions. 


Reference: Jiří Adámek, Liang-Ting Chen, Stefan Milius, and Henning Urbat, Reiterman's Theorem on Finite Algebras for a Monad, arXiv:2101.00942

Lean 4 formal statement:
import Mathlib

open CategoryTheory

universe v u

abbrev Pro (C : Type u) [Category.{v} C] : Type (max u (v + 1)) := (Ind (Cᵒᵖ))ᵒᵖ

theorem pro_fintypecat_equiv_profinite : Nonempty ((Pro (FintypeCat)) ≌ Profinite) := by
  sorry
Domain: Category | Level: Easy | Tags: Abelian

Theorem: Let $\mathcal{A}$ be an additive category.
    Let $x,y,z$ be objects in $\mathcal{A}$.
    Then the composition $\hom_{\mathcal{A}}(y,z)\times \hom_{\mathcal{A}}(x,y)\to \hom_{\mathcal{A}}(x,z)$ is bilinear map.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

variable {C : Type u} [Category.{v} C] [Preadditive C]

structure IsBilinear {X Y Z : C} (f : (Y ⟶ Z) → ((X ⟶ Y) → (X ⟶ Z))) : Prop where
  map_add_left : ∀ (a b : Y ⟶ Z) (g : X ⟶ Y),
    f (a + b) g = f a g + f b g

  map_add_right : ∀ (a : Y ⟶ Z) (g h : X ⟶ Y), f a (g + h) = f a g + f a h

  map_zero_left : ∀ (g : X ⟶ Y), f 0 g = 0

  map_zero_right : ∀ (a : Y ⟶ Z), f a 0 = 0


theorem compIsBilinear {X Y Z : C} :
    IsBilinear (fun (g : Y ⟶ Z) => (fun (f : (X ⟶ Y)) => f ≫ g)) := sorry
Domain: Category | Level: Easy | Tags: Abelian

Theorem: Let $\mathcal{A}$ be an abelian category and let $f$ be a morphism in $\mathcal{A}$.
    Then $f$ is an isomorphism if and only if $f$ is monic and epic.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

variable {C : Type*} [Category C] [Abelian C]

theorem isIso_iff_mono_and_epi {X Y : C} (f : X ⟶ Y) :
    IsIso f ↔ (Mono f ∧ Epi f) := by
  sorry
Domain: Category | Level: Easy | Tags: Abelian

Theorem: Let $\mathcal{A}$ be an abelian category and let $f$ be a morphism in $\mathcal{A}$.
    Then $f$ is monic if and only if $\ker(f)=0$.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits Category

variable {C : Type*} [Category C] [Abelian C]

theorem mono_iff_isZero_kernel {X Y : C} (f : X ⟶ Y) :
    Mono f ↔ IsZero (kernel f) := by
  sorry
Domain: Category | Level: Easy | Tags: Abelian

Theorem: $\mathbb{k}$ is the unique (up to isomorphism) simple object in $\mathrm{Vect}_{\mathbb{k}}$.

Lean 4 formal statement:
import Mathlib

open Module

variable (𝕜 : Type u) [Field 𝕜]

instance isSimpleModule_self : IsSimpleModule 𝕜 𝕜 := by
  constructor
  intro N
  have : IsSimpleOrder (Submodule 𝕜 𝕜) := by infer_instance
  exact eq_bot_or_eq_top N

theorem unique_simple_object (M : Type v) [AddCommGroup M] [Module 𝕜 M] [IsSimpleModule 𝕜 M] :
    Nonempty (M ≃ₗ[𝕜] 𝕜) := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Theorem: $\mathbb{Z}_p$ is simple object in $\mathcal{A}\mathrm{b}$ when $p$ is prime number.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

variable (p : ℕ) [Fact p.Prime]

theorem ZMod_simple : CategoryTheory.Simple (ModuleCat.of ℤ (ZMod p)) := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Theorem: $\mathcal{G}\mathrm{rp}$ is not an additive category.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits


def IsAdditiveCategory (C : Type u) [Category.{v} C] : Prop :=
  ∃ (_ : Preadditive C), HasZeroObject C ∧ HasFiniteBiproducts C

theorem Grp_not_is_additive : IsEmpty (IsAdditiveCategory Grp.{u}) := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Definition: A functor is called $\textbf{left exact}$ if it preserves all finite limits.


Theorem: Let $\mathcal{A}$ and $\mathcal{B}$ be abelian categories and $F:\mathcal{A}\to\mathcal{B}$ be a functor. Then $F$ is left exact if and only if $F$ is additive and $F$ maps each exact sequence $0\to x\to y\to z$ to an exact sequence $0\to F(x)\to F(y)\to F(z)$.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Functor Limits ShortComplex

variable {C D : Type*} [Category C] [Category D]
variable [Abelian C] [Abelian D]

theorem preservesFiniteLimits_tfae
    (F : C ⥤ D) [F.Additive] : List.TFAE
    [
      ∀ (S : ShortComplex C), S.ShortExact → (S.map F).Exact ∧ Mono (F.map S.f),
      ∀ (S : ShortComplex C), S.Exact ∧ Mono S.f → (S.map F).Exact ∧ Mono (F.map S.f),
      ∀ ⦃X Y : C⦄ (f : X ⟶ Y), PreservesLimit (parallelPair f 0) F,
      PreservesFiniteLimits F
    ] := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Theorem: Let $\mathcal{A}$ be an abelian category and let $P\in\mathcal{A}$.
    Then $\hom_{\mathcal{A}}(P,-):\mathcal{A}\to \mathcal{A}\mathrm{b}$ is right exact if and only if $\hom_{\mathcal{A}}(P,-):\mathcal{A}\to \mathcal{A}\mathrm{b}$ preserves epimorphism.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits Opposite

variable {A : Type u} [Category.{v} A] [Abelian A]

theorem hom_rightExact_iff_preserves_epi (P : A) :
    PreservesFiniteColimits (preadditiveCoyoneda.obj (op P)) ↔ 
    Functor.PreservesEpimorphisms (preadditiveCoyoneda.obj (op P)) := by
  sorry
Domain: Category | Level: High | Tags: Abelian

Definition: An Abelian category $\mathcal A$ is called $\textbf{semisimple}$ if any short exact sequence in $\mathcal A$ is splittable.


Theorem: Let $\mathcal{A}$ be an abelian category.
    Then the followings are equivalent:
    \begin{enumerate}
        \item $\mathcal{A}$ is semisimple;
        \item any obejct in $\mathcal{A}$ is injective;
        \item any object in $\mathcal{A}$ is projective.
    \end{enumerate}

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits

variable {A : Type u} [Category.{v} A] [Abelian A]

def IsSemisimple (A : Type u) [Category.{v} A] [Abelian A] : Prop :=
  ∀ (S : ShortComplex A), S.ShortExact → Nonempty S.Splitting

theorem isSemisimple_iff_injective_iff_projective :
    (IsSemisimple A ↔ ∀ (X : A), Injective X) ∧ 
    (IsSemisimple A ↔ ∀ (X : A), Projective X) := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Theorem: Let $\mathcal{A}$ be an abelian category.
    If $x,y$ are simple objects in $\mathcal{A}$. Then each non-zero $f:x\to y$ are isomorphism.
    In particular, if $x$ is simple, then $\hom_{\mathcal{A}}(x,x)$ is a division ring; if $x\neq y$ ,then $\hom_{\mathcal{A}}(x,y)=0$.

Lean 4 formal statement:
import Mathlib

open CategoryTheory


variable {𝒜 : Type*} [Category 𝒜] [Abelian 𝒜]


theorem simple_objects_nonzero_morphisms_iso
    {x y : 𝒜} [Simple x] [Simple y] (f : x ⟶ y) (h : f ≠ 0) :
    IsIso f := by
  sorry


theorem simple_object_end_is_division_ring
    (x : 𝒜) [Simple x] :
    Nonempty (DivisionRing (CategoryTheory.End x)) := by
  sorry


theorem simple_objects_hom_zero_of_ne
    {x y : 𝒜} [Simple x] [Simple y] (hxy : IsEmpty (x ≅ y)) :
    ∀ f : x ⟶ y, f = 0 := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Definition: Let $\mathcal C$ be a category with zero morphisms. An object $c\in\mathcal C$ is called $\textbf{mono-simple}$ if it has no proper subobjects. An object $c\in\mathcal C$ is called $\textbf{epi-simple}$ if it has no proper quotient objects.

Theorem: Let $\mathcal{A}$ be a pre-additive category in which all monomorphisms and epimorphisms split. Suppose $x \in \mathcal{A}$ is an object such that $\hom_{\mathcal{A}}(x,x)$ is a division ring. Then $x$ is both mono-simple and epi-simple.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

class IsSplitMonoCategory (A : Type*) [Category A] where
  splitMonoOfMono {X Y : A} (f : X ⟶ Y) [Mono f] : Nonempty (SplitMono f)

class IsSplitEpiCategory (A : Type*) [Category A] where
  splitEpiOfEpi {X Y : A} (f : X ⟶ Y) [Epi f] : Nonempty (SplitEpi f)

variable {A : Type*} [Category A] [Preadditive A] [IsSplitMonoCategory A] [IsSplitEpiCategory A]

theorem schur_simple_monosimple_and_episimple
    (x : A) [NoZeroDivisors (End x)] :
    (∀ (y : A) (f : y ⟶ x) [Mono f], f = 0 ∨ IsIso f) ∧
    (∀ (y : A) (g : x ⟶ y) [Epi g], g = 0 ∨ IsIso g) := by
  sorry
Domain: Category | Level: Medium | Tags: Abelian

Definition: A category is called $\textbf{normal}$ if each monomorphism is a kernel.

Definition: A category is called $\textbf{conormal}$ if each epimorphism is a cokernel.

Definition: A category is called $\textbf{binormal}$ if it is both normal and conormal.

Definition: Let $\mathcal C$ be a category.
An object $c\in\mathcal C$ is called $\textbf{mono-simple}$ if it has no proper subobjects.
An object $c\in\mathcal C$ is called $\textbf{epi-simple}$ if it has no proper quotient objects.


Theorem: Let $\mathcal{A}$ be a binormal category.
    Then an object is mono-simple if and only if it is epi-simple.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

variable {A : Type*} [Category A] [Limits.HasZeroMorphisms A]
  [IsNormalMonoCategory A]
  [IsNormalEpiCategory A]

  [Limits.HasKernels A]
  [Limits.HasCokernels A]

theorem binormal_mono_simple_iff_epi_simple (x : A) :
    (∀ (y : A) (f : y ⟶ x) [Mono f], f = 0 ∨ IsIso f) ↔
    (∀ (y : A) (g : x ⟶ y) [Epi g], g = 0 ∨ IsIso g) := by
    sorry
Domain: Category | Level: Easy | Tags: Monad

Theorem: For any monad $(T,\mu,\eta)$ on a category $\mathcal{C}$ and let $\mathcal{C}^T$ be its Elienberg-Moore category.
    Let $U:\mathcal{C}^T\to\mathcal{C}$ be the forgetful functor, then it admits a left adjoint.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

variable {C : Type u₁} [Category.{v₁} C]


theorem monad_forget_has_left_adjoint (T : Monad C) :
    T.forget.IsRightAdjoint := by
  sorry
Domain: Category | Level: Medium | Tags: Monad

Theorem: Let $R$ be a ring. The forgetful functor from the category $\mathcal{M}\mathrm{od}_R$ of $R$-modules to the category $\mathcal{A}\mathrm{b}$ of abelian groups creates all colimits that $\mathcal{A}\mathrm{b}$ admits.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits

variable {R : Type u} [CommRing R]


theorem ModuleCat.forgetCreatesColimits :
    Nonempty (CreatesColimits (forget₂ (ModuleCat R) AddCommGrp)) := by
    sorry
Domain: Category | Level: Medium | Tags: Monad

Theorem: Suppose $\mathcal{C}$ is cocomplete and $G :\mathcal{D} \to \mathcal{C}$ is monadic.
    Then $\mathcal{D}$ is cocomplete if and only if $\mathcal{D}$ has coequalizers.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits

universe uC uD vC vD w w'

variable {C : Type uC} [Category.{vC} C]
variable {D : Type uD} [Category.{vD} D]
variable (G : D ⥤ C)

theorem cocomplete_iff_hasCoequalizers_of_monadic
  [HasColimitsOfSize.{w, w'} C] [MonadicRightAdjoint G] :
    HasColimitsOfSize.{w, w'} D ↔ HasCoequalizers D := by
  sorry
Domain: Category | Level: Easy | Tags: Monad
Reference: Exercise 20F(b), Adámek, J., Herrlich, H. and Strecker, G., 1990. Abstract and concrete categories. Wiley-Interscience.

Theorem: Let $\mathcal{B}$ be a category and $\mathcal{C}$ be a full reflective subcategory of $\mathcal{B}$. Then the monad associated to the inclusion functor $U : \mathcal{C} \to \mathcal{B}$ is idempotent.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Functor

namespace CAT_statement_S_0094

variable {C : Type*} [Category C]
variable {B : Type*} [Category B]

noncomputable def monadOfRightAdjoint (U : Functor C B) [IsRightAdjoint U] : Monad B :=
  (Adjunction.ofIsRightAdjoint U).toMonad

def IsIsoClosed (U : Functor C B) := ∀ (x : C) (y : B) (f : U.obj x ⟶ y) [IsIso f], ∃ (z : C), y = U.obj z

variable {U : Functor C B} [Full U] [Faithful U] [IsRightAdjoint U]
  {h_inj : Function.Injective U.obj}
  {h_iso_closed : IsIsoClosed U}


theorem monad_idempotent_of_full_reflective_embedding :
    let T : Monad B := monadOfRightAdjoint U
    IsIso T.μ := by
  sorry

end CAT_statement_S_0094
Domain: Category | Level: Medium | Tags: Monad

Theorem: If $\mathcal{D}$ admits coequalizers, a functor $G : \mathcal{D} \to \mathcal{C}$ is monadic if $G$ has a left adjoint, conservative and preserves coequalizers.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits

universe u₁ u₂ v₁

variable {C : Type u₁} {D : Type u₂} [Category.{v₁} C] [Category.{v₁} D]
variable {G : D ⥤ C} {F : C ⥤ D} (adjFG : F ⊣ G)
variable [HasCoequalizers D]
variable [G.ReflectsIsomorphisms]
variable [PreservesColimitsOfShape WalkingParallelPair G]


theorem monadicOfConservativePreservesCoequalizers :
    Nonempty (MonadicRightAdjoint G) := by
    sorry
Domain: Category | Level: Medium | Tags: Monad

Theorem: Consider the adjunction $-\otimes_{\mathbb{Z}}R:\mathcal{A}\mathrm{b}\to \mathcal{A}\mathrm{b}_R$ and $U:\mathcal{A}\mathrm{b}_R\to \mathcal{A}\mathrm{b}$. We obtain a monad $T$.
    The $T$-modules are right $R$-modules.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

namespace CAT_statement_S_0096

universe u v


variable (R : Type u) [CommRing R]


abbrev intToR : ℤ →+* R := Int.castRingHom R

noncomputable abbrev U : ModuleCat.{max u v} R ⥤ ModuleCat.{max u v} ℤ :=
  ModuleCat.restrictScalars (intToR R)

noncomputable abbrev F : ModuleCat.{max u v} ℤ ⥤ ModuleCat.{max u v} R :=
  ModuleCat.extendScalars (intToR R)


noncomputable abbrev adj : F (R := R) ⊣ U (R := R) :=
  ModuleCat.extendRestrictScalarsAdj (intToR R)


noncomputable abbrev T : Monad (ModuleCat.{max u v} ℤ) :=
  (adj (R := R)).toMonad

theorem t_algebra_equiv_modulecat :
    Nonempty (Monad.Algebra (T (R := R)) ≌ ModuleCat.{max u v} R) := by
  sorry

end CAT_statement_S_0096
Domain: Category | Level: Medium | Tags: Monad

Theorem: Let $\mathcal{C}$, $\mathcal{D}$ be categories and $F : \mathcal{C}\to \mathcal{D}$ be a left adjoint functor to $G: \mathcal{D} \to \mathcal{C}$.
    Denote the induced monad of the adjunction $F \dashv G$ by $T := GF$. 
    Let $K : \mathcal{D} \to \mathcal{C}^T$ be the comparison functor. 
    If $\mathcal{D}$ admits coequalizers, then $K$ has a left adjoint.

Lean 4 formal statement:
import Mathlib

open CategoryTheory Monad

universe u₁ u₂ v₁

variable {C : Type u₁} [Category.{v₁} C] {D : Type u₂} [Category.{v₁} D]
variable (F : C ⥤ D) (G : D ⥤ C) (adj : F ⊣ G)

theorem comparison_adjunction
    [∀ (A : adj.toMonad.Algebra), Limits.HasCoequalizer (F.map A.a) (adj.counit.app (F.obj A.A))] :
    ∃ K : adj.toMonad.Algebra ⥤ D, Nonempty (K ⊣ comparison adj) := by
    sorry
Domain: Category | Level: Medium | Tags: Monad
Reference: Exercise 20F(c), Adámek, J., Herrlich, H. and Strecker, G., 1990. Abstract and concrete categories. Wiley-Interscience.

Theorem: The monad associated with the forgetful functor $\mathcal{T}\mathrm{op}\to \mathcal{S}\mathrm{et}$ is idempotent.

Lean 4 formal statement:
import Mathlib

open CategoryTheory

theorem monad_Top_idempotent : IsIso TopCat.adj₁.toMonad.μ := by
  sorry
Domain: Category | Level: High | Tags: Monad

Theorem: Let $\mathcal{C}$, $\mathcal{D}$ be categories and $F : \mathcal{C} \to \mathcal{D}$ be a left adjoint functor to $G: \mathcal{D}\to \mathcal{C}$. 
    Denote the induced monad of the adjunction $F \dashv G$ by $T$. The following statements are equivalent:
    \begin{enumerate}
        \item The comparison functor $K : \mathcal{D}\to\mathcal{C}^T$ is fully faithful.
        \item For every $d\in \mathcal{D}$, the counit $\epsilon_d : FG(d)\to d$ is a coequalizer of 
        \begin{align*}
            \xymatrix{
                FGFG(d)\ar@<0.5ex>[r]^{\epsilon_{FG(d)}}\ar@<-0.5ex>[r]_{FG(\epsilon_d)}& FG(d)
            }
        \end{align*}
        \item The functor $G$ reflects split epimorphisms to regular epimorphisms
    \end{enumerate}

Lean 4 formal statement:
import Mathlib

open CategoryTheory Limits

universe v u u'

namespace CAT_statement_S0100

variable {C : Type u} [Category.{v} C]
variable {D : Type u'} [Category.{v} D]

variable (F : C ⥤ D) (G : D ⥤ C)
variable (adj : F ⊣ G)

abbrev FG : D ⥤ D := G ⋙ F

abbrev K : D ⥤ (adj.toMonad).Algebra :=
  Monad.comparison adj

abbrev epsFG (d : D) :
    (FG (F := F) (G := G)).obj ((FG (F := F) (G := G)).obj d)
      ⟶ (FG (F := F) (G := G)).obj d :=
  adj.counit.app ((FG (F := F) (G := G)).obj d)

abbrev FGeps (d : D) :
    (FG (F := F) (G := G)).obj ((FG (F := F) (G := G)).obj d)
      ⟶ (FG (F := F) (G := G)).obj d :=
  (FG (F := F) (G := G)).map (adj.counit.app d)

def counitCofork (d : D) :
    Cofork (epsFG (F := F) (G := G) adj d) (FGeps (F := F) (G := G) adj d) :=
  Cofork.ofπ (adj.counit.app d) (by

    simp [epsFG, FGeps]
  )


def cond1 : Prop :=
  (K (F := F) (G := G) adj).Full ∧ (K (F := F) (G := G) adj).Faithful


def cond2 : Prop :=
  ∀ d : D, Nonempty (IsColimit (counitCofork (F := F) (G := G) adj d))


def IsRegularEpi' {X Y : D} (f : X ⟶ Y) : Prop :=
  Nonempty (RegularEpi f)


def ReflectsSplitEpiToRegularEpi' (G : D ⥤ C) : Prop :=
  ∀ {X Y : D} (f : X ⟶ Y), IsSplitEpi (G.map f) → IsRegularEpi' (D := D) f

def cond3 : Prop :=
  ReflectsSplitEpiToRegularEpi' (G := G)


theorem K_fullyFaithful_tfae :
    List.TFAE
      [cond1 (F := F) (G := G) adj,
       cond2 (F := F) (G := G) adj,
       cond3 (G := G)] := by
  sorry

end CAT_statement_S0100