File: Mathlib/CategoryTheory/Preadditive/Injective.lean

full_name: CategoryTheory.Injective
code: /--
An object `J` is injective iff every morphism into `J` can be obtained by extending a monomorphism.
-/
class Injective (J : C) : Prop where
  factors : ∀ {X Y : C} (g : X ⟶ J) (f : X ⟶ Y) [Mono f], ∃ h : Y ⟶ J, f ≫ h = g
goal: Prop

full_name: CategoryTheory.Injective.factors
code: /--
An object `J` is injective iff every morphism into `J` can be obtained by extending a monomorphism.
-/
class Injective (J : C) : Prop where
  factors : ∀ {X Y : C} (g : X ⟶ J) (f : X ⟶ Y) [Mono f], ∃ h : Y ⟶ J, f ≫ h = g
goal: ∃ h, f ≫ h = g

full_name: CategoryTheory.Limits.IsZero.injective
code: lemma Limits.IsZero.injective {X : C} (h : IsZero X) : Injective X 
goal: CategoryTheory.Injective X

full_name: CategoryTheory.InjectivePresentation.mono
code: /-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
to some injective object `J`.
-/
structure InjectivePresentation (X : C) where
  J : C
  injective : Injective J := by infer_instance
  f : X ⟶ J
  mono : Mono f := by infer_instance
goal: CategoryTheory.Mono self.f

full_name: CategoryTheory.InjectivePresentation.f
code: /-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
to some injective object `J`.
-/
structure InjectivePresentation (X : C) where
  J : C
  injective : Injective J := by infer_instance
  f : X ⟶ J
  mono : Mono f := by infer_instance
goal: X ⟶ self.J

full_name: CategoryTheory.InjectivePresentation
code: /-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
to some injective object `J`.
-/
structure InjectivePresentation (X : C) where
  J : C
  injective : Injective J := by infer_instance
  f : X ⟶ J
  mono : Mono f := by infer_instance
goal: Type (max u₁ v₁)

full_name: CategoryTheory.InjectivePresentation.injective
code: /-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
to some injective object `J`.
-/
structure InjectivePresentation (X : C) where
  J : C
  injective : Injective J := by infer_instance
  f : X ⟶ J
  mono : Mono f := by infer_instance
goal: CategoryTheory.Injective self.J

full_name: CategoryTheory.InjectivePresentation.J
code: /-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
to some injective object `J`.
-/
structure InjectivePresentation (X : C) where
  J : C
  injective : Injective J := by infer_instance
  f : X ⟶ J
  mono : Mono f := by infer_instance
goal: C

full_name: CategoryTheory.EnoughInjectives
code: /-- A category "has enough injectives" if every object has an injective presentation,
i.e. if for every object `X` there is an injective object `J` and a monomorphism `X ↪ J`. -/
class EnoughInjectives : Prop where
  presentation : ∀ X : C, Nonempty (InjectivePresentation X)
goal: Prop

full_name: CategoryTheory.EnoughInjectives.presentation
code: /-- A category "has enough injectives" if every object has an injective presentation,
i.e. if for every object `X` there is an injective object `J` and a monomorphism `X ↪ J`. -/
class EnoughInjectives : Prop where
  presentation : ∀ X : C, Nonempty (InjectivePresentation X)
goal: Nonempty (CategoryTheory.InjectivePresentation X)

full_name: CategoryTheory.Injective.factorThru
code: /--
Let `J` be injective and `g` a morphism into `J`, then `g` can be factored through any monomorphism.
-/
def factorThru {J X Y : C} [Injective J] (g : X ⟶ J) (f : X ⟶ Y) [Mono f] : Y ⟶ J 
goal: Y ⟶ J

full_name: CategoryTheory.Injective.comp_factorThru
code: @[simp]
theorem comp_factorThru {J X Y : C} [Injective J] (g : X ⟶ J) (f : X ⟶ Y) [Mono f] :
    f ≫ factorThru g f = g 
goal: f ≫ CategoryTheory.Injective.factorThru g f = g

full_name: CategoryTheory.Injective.zero_injective
code: instance zero_injective [HasZeroObject C] : Injective (0 : C) 
goal: CategoryTheory.Injective 0

full_name: CategoryTheory.Injective.of_iso
code: theorem of_iso {P Q : C} (i : P ≅ Q) (hP : Injective P) : Injective Q 
goal: CategoryTheory.Injective Q

full_name: CategoryTheory.Injective.iso_iff
code: theorem iso_iff {P Q : C} (i : P ≅ Q) : Injective P ↔ Injective Q 
goal: CategoryTheory.Injective P ↔ CategoryTheory.Injective Q

full_name: CategoryTheory.Injective.instOfNonempty
code: /-- The axiom of choice says that every nonempty type is an injective object in `Type`. -/
instance (X : Type u₁) [Nonempty X] : Injective X 
goal: CategoryTheory.Injective X

full_name: CategoryTheory.Injective.Type.enoughInjectives
code: instance Type.enoughInjectives : EnoughInjectives (Type u₁) 
goal: CategoryTheory.EnoughInjectives (Type u₁)

full_name: CategoryTheory.Injective.instProd
code: instance {P Q : C} [HasBinaryProduct P Q] [Injective P] [Injective Q] : Injective (P ⨯ Q) 
goal: CategoryTheory.Injective (P ⨯ Q)

full_name: CategoryTheory.Injective.instPiObj
code: instance {β : Type v} (c : β → C) [HasProduct c] [∀ b, Injective (c b)] : Injective (∏ᶜ c) 
goal: CategoryTheory.Injective (∏ᶜ c)

full_name: CategoryTheory.Injective.instBiprod
code: instance {P Q : C} [HasZeroMorphisms C] [HasBinaryBiproduct P Q] [Injective P] [Injective Q] :
    Injective (P ⊞ Q) 
goal: CategoryTheory.Injective (P ⊞ Q)

full_name: CategoryTheory.Injective.instBiproduct
code: instance {β : Type v} (c : β → C) [HasZeroMorphisms C] [HasBiproduct c] [∀ b, Injective (c b)] :
    Injective (⨁ c) 
goal: CategoryTheory.Injective (⨁ c)

full_name: CategoryTheory.Injective.instUnopOfProjectiveOpposite
code: instance {P : Cᵒᵖ} [Projective P] : Injective no_index (unop P) 
goal: CategoryTheory.Injective (Opposite.unop P)

full_name: CategoryTheory.Injective.instProjectiveUnopOfOpposite
code: instance {J : Cᵒᵖ} [Injective J] : Projective no_index (unop J) 
goal: CategoryTheory.Projective (Opposite.unop J)

full_name: CategoryTheory.Injective.instProjectiveOppositeOp
code: instance {J : C} [Injective J] : Projective (op J) 
goal: CategoryTheory.Projective (Opposite.op J)

full_name: CategoryTheory.Injective.instOppositeOpOfProjective
code: instance {P : C} [Projective P] : Injective (op P) 
goal: CategoryTheory.Injective (Opposite.op P)

full_name: CategoryTheory.Injective.injective_iff_projective_op
code: theorem injective_iff_projective_op {J : C} : Injective J ↔ Projective (op J) 
goal: CategoryTheory.Injective J ↔ CategoryTheory.Projective (Opposite.op J)

full_name: CategoryTheory.Injective.projective_iff_injective_op
code: theorem projective_iff_injective_op {P : C} : Projective P ↔ Injective (op P) 
goal: CategoryTheory.Projective P ↔ CategoryTheory.Injective (Opposite.op P)

full_name: CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_obj
code: theorem injective_iff_preservesEpimorphisms_yoneda_obj (J : C) :
    Injective J ↔ (yoneda.obj J).PreservesEpimorphisms 
goal: CategoryTheory.Injective J ↔ (CategoryTheory.yoneda.obj J).PreservesEpimorphisms

full_name: CategoryTheory.Injective.injective_of_adjoint
code: theorem injective_of_adjoint (adj : L ⊣ R) (J : D) [Injective J] : Injective <| R.obj J 
goal: CategoryTheory.Injective (R.obj J)

full_name: CategoryTheory.Injective.under
code: /-- `Injective.under X` provides an arbitrarily chosen injective object equipped with
a monomorphism `Injective.ι : X ⟶ Injective.under X`.
-/
def under (X : C) : C 
goal: C

full_name: CategoryTheory.Injective.injective_under
code: instance injective_under (X : C) : Injective (under X) 
goal: CategoryTheory.Injective (CategoryTheory.Injective.under X)

full_name: CategoryTheory.Injective.ι
code: /-- The monomorphism `Injective.ι : X ⟶ Injective.under X`
from the arbitrarily chosen injective object under `X`.
-/
def ι (X : C) : X ⟶ under X 
goal: X ⟶ CategoryTheory.Injective.under X

full_name: CategoryTheory.Injective.ι_mono
code: instance ι_mono (X : C) : Mono (ι X) 
goal: CategoryTheory.Mono (CategoryTheory.Injective.ι X)

full_name: CategoryTheory.Injective.syzygies
code: /-- When `C` has enough injectives, the object `Injective.syzygies f` is
an arbitrarily chosen injective object under `cokernel f`.
-/
def syzygies : C 
goal: C

full_name: CategoryTheory.Injective.instSyzygies
code: instance : Injective <| syzygies f 
goal: CategoryTheory.Injective (CategoryTheory.Injective.syzygies f)

full_name: CategoryTheory.Injective.d
code: /-- When `C` has enough injective,
`Injective.d f : Y ⟶ syzygies f` is the composition
`cokernel.π f ≫ ι (cokernel f)`.

(When `C` is abelian, we have `exact f (injective.d f)`.)
-/
abbrev d : Y ⟶ syzygies f 
goal: Y ⟶ CategoryTheory.Injective.syzygies f

full_name: CategoryTheory.Injective.instEnoughProjectivesOppositeOfEnoughInjectives
code: instance [EnoughInjectives C] : EnoughProjectives Cᵒᵖ 
goal: CategoryTheory.EnoughProjectives Cᵒᵖ

full_name: CategoryTheory.Injective.instEnoughInjectivesOppositeOfEnoughProjectives
code: instance [EnoughProjectives C] : EnoughInjectives Cᵒᵖ 
goal: CategoryTheory.EnoughInjectives Cᵒᵖ

full_name: CategoryTheory.Injective.enoughProjectives_of_enoughInjectives_op
code: theorem enoughProjectives_of_enoughInjectives_op [EnoughInjectives Cᵒᵖ] : EnoughProjectives C 
goal: CategoryTheory.EnoughProjectives C

full_name: CategoryTheory.Injective.enoughInjectives_of_enoughProjectives_op
code: theorem enoughInjectives_of_enoughProjectives_op [EnoughProjectives Cᵒᵖ] : EnoughInjectives C 
goal: CategoryTheory.EnoughInjectives C

full_name: CategoryTheory.Adjunction.map_injective
code: theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : Injective I) :
    Injective (G.obj I) 
goal: CategoryTheory.Injective (G.obj I)

full_name: CategoryTheory.Adjunction.injective_of_map_injective
code: theorem injective_of_map_injective (adj : F ⊣ G) [G.Full] [G.Faithful] (I : D)
    (hI : Injective (G.obj I)) : Injective I 
goal: CategoryTheory.Injective I

full_name: CategoryTheory.Adjunction.mapInjectivePresentation
code: /-- Given an adjunction `F ⊣ G` such that `F` preserves monos, `G` maps an injective presentation
of `X` to an injective presentation of `G(X)`. -/
def mapInjectivePresentation (adj : F ⊣ G) [F.PreservesMonomorphisms] (X : D)
    (I : InjectivePresentation X) : InjectivePresentation (G.obj X) 
goal: CategoryTheory.InjectivePresentation (G.obj X)

full_name: CategoryTheory.Adjunction.injectivePresentationOfMap
code: /-- Given an adjunction `F ⊣ G` such that `F` preserves monomorphisms and is faithful,
  then any injective presentation of `F(X)` can be pulled back to an injective presentation of `X`.
  This is similar to `mapInjectivePresentation`. -/
def injectivePresentationOfMap (adj : F ⊣ G)
    [F.PreservesMonomorphisms] [F.ReflectsMonomorphisms] (X : C)
    (I : InjectivePresentation <| F.obj X) :
    InjectivePresentation X 
goal: CategoryTheory.InjectivePresentation X

full_name: CategoryTheory.EnoughInjectives.of_adjunction
code: /--
[Lemma 3.8](https://ncatlab.org/nlab/show/injective+object#preservation_of_injective_objects)
-/
lemma EnoughInjectives.of_adjunction {C : Type u₁} {D : Type u₂}
    [Category.{v₁} C] [Category.{v₂} D]
    {L : C ⥤ D} {R : D ⥤ C} (adj : L ⊣ R) [L.PreservesMonomorphisms] [L.ReflectsMonomorphisms]
    [EnoughInjectives D] : EnoughInjectives C 
goal: CategoryTheory.EnoughInjectives C

full_name: CategoryTheory.EnoughInjectives.of_equivalence
code: /-- An equivalence of categories transfers enough injectives. -/
lemma EnoughInjectives.of_equivalence {C : Type u₁} {D : Type u₂}
    [Category.{v₁} C] [Category.{v₂} D]
    (e : C ⥤ D) [e.IsEquivalence] [EnoughInjectives D] : EnoughInjectives C 
goal: CategoryTheory.EnoughInjectives C

full_name: CategoryTheory.Equivalence.map_injective_iff
code: theorem map_injective_iff (P : C) : Injective (F.functor.obj P) ↔ Injective P 
goal: CategoryTheory.Injective (F.functor.obj P) ↔ CategoryTheory.Injective P

full_name: CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation
code: /-- Given an equivalence of categories `F`, an injective presentation of `F(X)` induces an
injective presentation of `X.` -/
def injectivePresentationOfMapInjectivePresentation (X : C)
    (I : InjectivePresentation (F.functor.obj X)) : InjectivePresentation X 
goal: CategoryTheory.InjectivePresentation X

full_name: CategoryTheory.Equivalence.enoughInjectives_iff
code: theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D 
goal: CategoryTheory.EnoughInjectives C ↔ CategoryTheory.EnoughInjectives D