category_theory.preadditive.injective
⟷
Mathlib.CategoryTheory.Preadditive.Injective
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(last sync)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -365,8 +365,8 @@ theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : I
-/
#print CategoryTheory.Adjunction.injective_of_map_injective /-
-theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
- (hI : Injective (G.obj I)) : Injective I :=
+theorem injective_of_map_injective (adj : F ⊣ G) [CategoryTheory.Functor.Full G]
+ [CategoryTheory.Functor.Faithful G] (I : D) (hI : Injective (G.obj I)) : Injective I :=
⟨fun X Y f g => by
intro
haveI : PreservesLimitsOfSize.{0, 0} G := adj.right_adjoint_preserves_limits
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -127,7 +127,7 @@ instance (X : Type u₁) [Nonempty X] : Injective X
ext y
change dite _ _ _ = _
split_ifs
- · rw [mono_iff_injective] at mono
+ · rw [mono_iff_injective] at mono
rw [mono (Classical.choose_spec h)]
· exact False.elim (h ⟨y, rfl⟩)⟩
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -120,7 +120,10 @@ theorem iso_iff {P Q : C} (i : P ≅ Q) : Injective P ↔ Injective Q :=
/-- The axiom of choice says that every nonempty type is an injective object in `Type`. -/
instance (X : Type u₁) [Nonempty X] : Injective X
where Factors Y Z g f mono :=
- ⟨fun z => by classical, by
+ ⟨fun z => by
+ classical exact
+ if h : z ∈ Set.range f then g (Classical.choose h) else Nonempty.some inferInstance,
+ by
ext y
change dite _ _ _ = _
split_ifs
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -120,10 +120,7 @@ theorem iso_iff {P Q : C} (i : P ≅ Q) : Injective P ↔ Injective Q :=
/-- The axiom of choice says that every nonempty type is an injective object in `Type`. -/
instance (X : Type u₁) [Nonempty X] : Injective X
where Factors Y Z g f mono :=
- ⟨fun z => by
- classical exact
- if h : z ∈ Set.range f then g (Classical.choose h) else Nonempty.some inferInstance,
- by
+ ⟨fun z => by classical, by
ext y
change dite _ _ _ = _
split_ifs
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,7 +3,7 @@ Copyright (c) 2022 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang, Kevin Buzzard
-/
-import Mathbin.CategoryTheory.Preadditive.Projective
+import CategoryTheory.Preadditive.Projective
#align_import category_theory.preadditive.injective from "leanprover-community/mathlib"@"a2706b55e8d7f7e9b1f93143f0b88f2e34a11eea"
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,14 +2,11 @@
Copyright (c) 2022 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang, Kevin Buzzard
-
-! This file was ported from Lean 3 source module category_theory.preadditive.injective
-! leanprover-community/mathlib commit a2706b55e8d7f7e9b1f93143f0b88f2e34a11eea
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.CategoryTheory.Preadditive.Projective
+#align_import category_theory.preadditive.injective from "leanprover-community/mathlib"@"a2706b55e8d7f7e9b1f93143f0b88f2e34a11eea"
+
/-!
# Injective objects and categories with enough injectives
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -206,12 +206,14 @@ theorem projective_iff_injective_op {P : C} : Projective P ↔ Injective (op P)
#align category_theory.injective.projective_iff_injective_op CategoryTheory.Injective.projective_iff_injective_op
-/
+#print CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_obj /-
theorem injective_iff_preservesEpimorphisms_yoneda_obj (J : C) :
Injective J ↔ (yoneda.obj J).PreservesEpimorphisms :=
by
rw [injective_iff_projective_op, projective.projective_iff_preserves_epimorphisms_coyoneda_obj]
exact functor.preserves_epimorphisms.iso_iff (coyoneda.obj_op_op _)
#align category_theory.injective.injective_iff_preserves_epimorphisms_yoneda_obj CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_obj
+-/
section Adjunction
@@ -221,11 +223,13 @@ variable {D : Type u₂} [Category.{v₂} D]
variable {L : C ⥤ D} {R : D ⥤ C} [PreservesMonomorphisms L]
+#print CategoryTheory.Injective.injective_of_adjoint /-
theorem injective_of_adjoint (adj : L ⊣ R) (J : D) [Injective J] : Injective <| R.obj J :=
⟨fun A A' g f im =>
⟨adj.hom_equiv _ _ (factor_thru ((adj.hom_equiv A J).symm g) (L.map f)),
(adj.hom_equiv _ _).symm.Injective (by simp)⟩⟩
#align category_theory.injective.injective_of_adjoint CategoryTheory.Injective.injective_of_adjoint
+-/
end Adjunction
@@ -351,6 +355,7 @@ namespace Adjunction
variable {D : Type _} [Category D] {F : C ⥤ D} {G : D ⥤ C}
+#print CategoryTheory.Adjunction.map_injective /-
theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : Injective I) :
Injective (G.obj I) :=
⟨fun X Y f g => by
@@ -360,7 +365,9 @@ theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : I
rw [← unit_naturality_assoc, ← G.map_comp, h]
simp⟩
#align category_theory.adjunction.map_injective CategoryTheory.Adjunction.map_injective
+-/
+#print CategoryTheory.Adjunction.injective_of_map_injective /-
theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
(hI : Injective (G.obj I)) : Injective I :=
⟨fun X Y f g => by
@@ -371,7 +378,9 @@ theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
refine' faithful.map_injective G _
simpa⟩
#align category_theory.adjunction.injective_of_map_injective CategoryTheory.Adjunction.injective_of_map_injective
+-/
+#print CategoryTheory.Adjunction.mapInjectivePresentation /-
/-- 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)
@@ -383,6 +392,7 @@ def mapInjectivePresentation (adj : F ⊣ G) [F.PreservesMonomorphisms] (X : D)
Mono := by
haveI : PreservesLimitsOfSize.{0, 0} G := adj.right_adjoint_preserves_limits <;> infer_instance
#align category_theory.adjunction.map_injective_presentation CategoryTheory.Adjunction.mapInjectivePresentation
+-/
end Adjunction
@@ -390,6 +400,7 @@ namespace Equivalence
variable {D : Type _} [Category D] (F : C ≌ D)
+#print CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation /-
/-- Given an equivalence of categories `F`, an injective presentation of `F(X)` induces an
injective presentation of `X.` -/
def injectivePresentationOfMapInjectivePresentation (X : C)
@@ -400,7 +411,9 @@ def injectivePresentationOfMapInjectivePresentation (X : C)
f := F.Unit.app _ ≫ F.inverse.map I.f
Mono := mono_comp _ _
#align category_theory.equivalence.injective_presentation_of_map_injective_presentation CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation
+-/
+#print CategoryTheory.Equivalence.enoughInjectives_iff /-
theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D :=
by
constructor
@@ -414,6 +427,7 @@ theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInject
F.injective_presentation_of_map_injective_presentation X
(Nonempty.some (H.presentation (F.functor.obj X)))
#align category_theory.equivalence.enough_injectives_iff CategoryTheory.Equivalence.enoughInjectives_iff
+-/
end Equivalence
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -125,7 +125,7 @@ instance (X : Type u₁) [Nonempty X] : Injective X
where Factors Y Z g f mono :=
⟨fun z => by
classical exact
- if h : z ∈ Set.range f then g (Classical.choose h) else Nonempty.some inferInstance,
+ if h : z ∈ Set.range f then g (Classical.choose h) else Nonempty.some inferInstance,
by
ext y
change dite _ _ _ = _
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -130,7 +130,7 @@ instance (X : Type u₁) [Nonempty X] : Injective X
ext y
change dite _ _ _ = _
split_ifs
- · rw [mono_iff_injective] at mono
+ · rw [mono_iff_injective] at mono
rw [mono (Classical.choose_spec h)]
· exact False.elim (h ⟨y, rfl⟩)⟩
@@ -272,7 +272,8 @@ variable [HasZeroMorphisms C] {X Y : C} (f : X ⟶ Y) [HasCokernel f]
an arbitrarily chosen injective object under `cokernel f`.
-/
def syzygies : C :=
- under (cokernel f)deriving Injective
+ under (cokernel f)
+deriving Injective
#align category_theory.injective.syzygies CategoryTheory.Injective.syzygies
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -93,7 +93,7 @@ theorem comp_factorThru {J X Y : C} [Injective J] (g : X ⟶ J) (f : X ⟶ Y) [M
section
-open ZeroObject
+open scoped ZeroObject
#print CategoryTheory.Injective.zero_injective /-
instance zero_injective [HasZeroObject C] [HasZeroMorphisms C] : Injective (0 : C)
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -206,12 +206,6 @@ theorem projective_iff_injective_op {P : C} : Projective P ↔ Injective (op P)
#align category_theory.injective.projective_iff_injective_op CategoryTheory.Injective.projective_iff_injective_op
-/
-/- warning: category_theory.injective.injective_iff_preserves_epimorphisms_yoneda_obj -> CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_obj is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] (J : C), Iff (CategoryTheory.Injective.{u1, u2} C _inst_1 J) (CategoryTheory.Functor.PreservesEpimorphisms.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1} (CategoryTheory.Functor.obj.{u1, max u2 u1, u2, max u1 u2 (succ u1)} C _inst_1 (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Functor.category.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.yoneda.{u1, u2} C _inst_1) J))
-but is expected to have type
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] (J : C), Iff (CategoryTheory.Injective.{u1, u2} C _inst_1 J) (CategoryTheory.Functor.PreservesEpimorphisms.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1} (Prefunctor.obj.{succ u1, max (succ u1) (succ u2), u2, max (succ u1) u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_1)) (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.CategoryStruct.toQuiver.{max u2 u1, max u2 (succ u1)} (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Category.toCategoryStruct.{max u2 u1, max u2 (succ u1)} (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Functor.category.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}))) (CategoryTheory.Functor.toPrefunctor.{u1, max u2 u1, u2, max u2 (succ u1)} C _inst_1 (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Functor.category.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.yoneda.{u1, u2} C _inst_1)) J))
-Case conversion may be inaccurate. Consider using '#align category_theory.injective.injective_iff_preserves_epimorphisms_yoneda_obj CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_objₓ'. -/
theorem injective_iff_preservesEpimorphisms_yoneda_obj (J : C) :
Injective J ↔ (yoneda.obj J).PreservesEpimorphisms :=
by
@@ -227,12 +221,6 @@ variable {D : Type u₂} [Category.{v₂} D]
variable {L : C ⥤ D} {R : D ⥤ C} [PreservesMonomorphisms L]
-/- warning: category_theory.injective.injective_of_adjoint -> CategoryTheory.Injective.injective_of_adjoint is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} C] {D : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} D] {L : CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2} {R : CategoryTheory.Functor.{u2, u1, u4, u3} D _inst_2 C _inst_1} [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u2, u3, u4} C _inst_1 D _inst_2 L], (CategoryTheory.Adjunction.{u1, u2, u3, u4} C _inst_1 D _inst_2 L R) -> (forall (J : D) [_inst_4 : CategoryTheory.Injective.{u2, u4} D _inst_2 J], CategoryTheory.Injective.{u1, u3} C _inst_1 (CategoryTheory.Functor.obj.{u2, u1, u4, u3} D _inst_2 C _inst_1 R J))
-but is expected to have type
- forall {C : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} C] {D : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} D] {L : CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2} {R : CategoryTheory.Functor.{u2, u1, u4, u3} D _inst_2 C _inst_1} [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u2, u3, u4} C _inst_1 D _inst_2 L], (CategoryTheory.Adjunction.{u1, u2, u3, u4} C _inst_1 D _inst_2 L R) -> (forall (J : D) [_inst_4 : CategoryTheory.Injective.{u2, u4} D _inst_2 J], CategoryTheory.Injective.{u1, u3} C _inst_1 (Prefunctor.obj.{succ u2, succ u1, u4, u3} D (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} D (CategoryTheory.Category.toCategoryStruct.{u2, u4} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} C (CategoryTheory.Category.toCategoryStruct.{u1, u3} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u2, u1, u4, u3} D _inst_2 C _inst_1 R) J))
-Case conversion may be inaccurate. Consider using '#align category_theory.injective.injective_of_adjoint CategoryTheory.Injective.injective_of_adjointₓ'. -/
theorem injective_of_adjoint (adj : L ⊣ R) (J : D) [Injective J] : Injective <| R.obj J :=
⟨fun A A' g f im =>
⟨adj.hom_equiv _ _ (factor_thru ((adj.hom_equiv A J).symm g) (L.map f)),
@@ -362,12 +350,6 @@ namespace Adjunction
variable {D : Type _} [Category D] {F : C ⥤ D} {G : D ⥤ C}
-/- warning: category_theory.adjunction.map_injective -> CategoryTheory.Adjunction.map_injective is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u4, u2, u3} C _inst_1 D _inst_2 F] (I : D), (CategoryTheory.Injective.{u4, u3} D _inst_2 I) -> (CategoryTheory.Injective.{u1, u2} C _inst_1 (CategoryTheory.Functor.obj.{u4, u1, u3, u2} D _inst_2 C _inst_1 G I)))
-but is expected to have type
- forall {C : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u3, u4} C] {D : Type.{u1}} [_inst_2 : CategoryTheory.Category.{u2, u1} D] {F : CategoryTheory.Functor.{u3, u2, u4, u1} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u2, u3, u1, u4} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u3, u2, u4, u1} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u3, u2, u4, u1} C _inst_1 D _inst_2 F] (I : D), (CategoryTheory.Injective.{u2, u1} D _inst_2 I) -> (CategoryTheory.Injective.{u3, u4} C _inst_1 (Prefunctor.obj.{succ u2, succ u3, u1, u4} D (CategoryTheory.CategoryStruct.toQuiver.{u2, u1} D (CategoryTheory.Category.toCategoryStruct.{u2, u1} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u4} C (CategoryTheory.Category.toCategoryStruct.{u3, u4} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u2, u3, u1, u4} D _inst_2 C _inst_1 G) I)))
-Case conversion may be inaccurate. Consider using '#align category_theory.adjunction.map_injective CategoryTheory.Adjunction.map_injectiveₓ'. -/
theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : Injective I) :
Injective (G.obj I) :=
⟨fun X Y f g => by
@@ -378,12 +360,6 @@ theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : I
simp⟩
#align category_theory.adjunction.map_injective CategoryTheory.Adjunction.map_injective
-/- warning: category_theory.adjunction.injective_of_map_injective -> CategoryTheory.Adjunction.injective_of_map_injective is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Full.{u4, u1, u3, u2} D _inst_2 C _inst_1 G] [_inst_4 : CategoryTheory.Faithful.{u4, u1, u3, u2} D _inst_2 C _inst_1 G] (I : D), (CategoryTheory.Injective.{u1, u2} C _inst_1 (CategoryTheory.Functor.obj.{u4, u1, u3, u2} D _inst_2 C _inst_1 G I)) -> (CategoryTheory.Injective.{u4, u3} D _inst_2 I))
-but is expected to have type
- forall {C : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u3, u4} C] {D : Type.{u1}} [_inst_2 : CategoryTheory.Category.{u2, u1} D] {F : CategoryTheory.Functor.{u3, u2, u4, u1} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u2, u3, u1, u4} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u3, u2, u4, u1} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Full.{u2, u3, u1, u4} D _inst_2 C _inst_1 G] [_inst_4 : CategoryTheory.Faithful.{u2, u3, u1, u4} D _inst_2 C _inst_1 G] (I : D), (CategoryTheory.Injective.{u3, u4} C _inst_1 (Prefunctor.obj.{succ u2, succ u3, u1, u4} D (CategoryTheory.CategoryStruct.toQuiver.{u2, u1} D (CategoryTheory.Category.toCategoryStruct.{u2, u1} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u4} C (CategoryTheory.Category.toCategoryStruct.{u3, u4} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u2, u3, u1, u4} D _inst_2 C _inst_1 G) I)) -> (CategoryTheory.Injective.{u2, u1} D _inst_2 I))
-Case conversion may be inaccurate. Consider using '#align category_theory.adjunction.injective_of_map_injective CategoryTheory.Adjunction.injective_of_map_injectiveₓ'. -/
theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
(hI : Injective (G.obj I)) : Injective I :=
⟨fun X Y f g => by
@@ -395,12 +371,6 @@ theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
simpa⟩
#align category_theory.adjunction.injective_of_map_injective CategoryTheory.Adjunction.injective_of_map_injective
-/- warning: category_theory.adjunction.map_injective_presentation -> CategoryTheory.Adjunction.mapInjectivePresentation is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u4, u2, u3} C _inst_1 D _inst_2 F] (X : D), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 X) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 (CategoryTheory.Functor.obj.{u4, u1, u3, u2} D _inst_2 C _inst_1 G X)))
-but is expected to have type
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u4, u2, u3} C _inst_1 D _inst_2 F] (X : D), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 X) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 (Prefunctor.obj.{succ u4, succ u1, u3, u2} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u3} D (CategoryTheory.Category.toCategoryStruct.{u4, u3} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u4, u1, u3, u2} D _inst_2 C _inst_1 G) X)))
-Case conversion may be inaccurate. Consider using '#align category_theory.adjunction.map_injective_presentation CategoryTheory.Adjunction.mapInjectivePresentationₓ'. -/
/-- 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)
@@ -419,12 +389,6 @@ namespace Equivalence
variable {D : Type _} [Category D] (F : C ≌ D)
-/- warning: category_theory.equivalence.injective_presentation_of_map_injective_presentation -> CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] (F : CategoryTheory.Equivalence.{u1, u4, u2, u3} C _inst_1 D _inst_2) (X : C), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 (CategoryTheory.Functor.obj.{u1, u4, u2, u3} C _inst_1 D _inst_2 (CategoryTheory.Equivalence.functor.{u1, u4, u2, u3} C _inst_1 D _inst_2 F) X)) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 X)
-but is expected to have type
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] (F : CategoryTheory.Equivalence.{u1, u4, u2, u3} C D _inst_1 _inst_2) (X : C), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 (Prefunctor.obj.{succ u1, succ u4, u2, u3} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u3} D (CategoryTheory.Category.toCategoryStruct.{u4, u3} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u4, u2, u3} C _inst_1 D _inst_2 (CategoryTheory.Equivalence.functor.{u1, u4, u2, u3} C D _inst_1 _inst_2 F)) X)) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 X)
-Case conversion may be inaccurate. Consider using '#align category_theory.equivalence.injective_presentation_of_map_injective_presentation CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentationₓ'. -/
/-- Given an equivalence of categories `F`, an injective presentation of `F(X)` induces an
injective presentation of `X.` -/
def injectivePresentationOfMapInjectivePresentation (X : C)
@@ -436,12 +400,6 @@ def injectivePresentationOfMapInjectivePresentation (X : C)
Mono := mono_comp _ _
#align category_theory.equivalence.injective_presentation_of_map_injective_presentation CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation
-/- warning: category_theory.equivalence.enough_injectives_iff -> CategoryTheory.Equivalence.enoughInjectives_iff is a dubious translation:
-lean 3 declaration is
- forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D], (CategoryTheory.Equivalence.{u1, u4, u2, u3} C _inst_1 D _inst_2) -> (Iff (CategoryTheory.EnoughInjectives.{u1, u2} C _inst_1) (CategoryTheory.EnoughInjectives.{u4, u3} D _inst_2))
-but is expected to have type
- forall {C : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u3, u4} C] {D : Type.{u1}} [_inst_2 : CategoryTheory.Category.{u2, u1} D], (CategoryTheory.Equivalence.{u3, u2, u4, u1} C D _inst_1 _inst_2) -> (Iff (CategoryTheory.EnoughInjectives.{u3, u4} C _inst_1) (CategoryTheory.EnoughInjectives.{u2, u1} D _inst_2))
-Case conversion may be inaccurate. Consider using '#align category_theory.equivalence.enough_injectives_iff CategoryTheory.Equivalence.enoughInjectives_iffₓ'. -/
theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D :=
by
constructor
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -141,9 +141,7 @@ instance Type.enoughInjectives : EnoughInjectives (Type u₁)
{ j := WithBot X
Injective := inferInstance
f := Option.some
- Mono := by
- rw [mono_iff_injective]
- exact Option.some_injective X }
+ Mono := by rw [mono_iff_injective]; exact Option.some_injective X }
#align category_theory.injective.Type.enough_injectives CategoryTheory.Injective.Type.enoughInjectives
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/28b2a92f2996d28e580450863c130955de0ed398
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang, Kevin Buzzard
! This file was ported from Lean 3 source module category_theory.preadditive.injective
-! leanprover-community/mathlib commit 3974a774a707e2e06046a14c0eaef4654584fada
+! leanprover-community/mathlib commit a2706b55e8d7f7e9b1f93143f0b88f2e34a11eea
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -13,6 +13,9 @@ import Mathbin.CategoryTheory.Preadditive.Projective
/-!
# Injective objects and categories with enough injectives
+> THIS FILE IS SYNCHRONIZED WITH MATHLIB4.
+> Any changes to this file require a corresponding PR to mathlib4.
+
An object `J` is injective iff every morphism into `J` can be obtained by extending a monomorphism.
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/d4437c68c8d350fc9d4e95e1e174409db35e30d7
@@ -31,15 +31,18 @@ namespace CategoryTheory
variable {C : Type u₁} [Category.{v₁} C]
+#print CategoryTheory.Injective /-
/--
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
#align category_theory.injective CategoryTheory.Injective
+-/
section
+#print CategoryTheory.InjectivePresentation /-
/-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
to some injective object `J`.
-/
@@ -50,44 +53,54 @@ structure InjectivePresentation (X : C) where
f : X ⟶ J
Mono : Mono f := by infer_instance
#align category_theory.injective_presentation CategoryTheory.InjectivePresentation
+-/
attribute [instance] injective_presentation.injective injective_presentation.mono
variable (C)
+#print CategoryTheory.EnoughInjectives /-
/-- 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)
#align category_theory.enough_injectives CategoryTheory.EnoughInjectives
+-/
end
namespace Injective
+#print CategoryTheory.Injective.factorThru /-
/--
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 :=
(Injective.factors g f).some
#align category_theory.injective.factor_thru CategoryTheory.Injective.factorThru
+-/
+#print CategoryTheory.Injective.comp_factorThru /-
@[simp]
theorem comp_factorThru {J X Y : C} [Injective J] (g : X ⟶ J) (f : X ⟶ Y) [Mono f] :
f ≫ factorThru g f = g :=
(Injective.factors g f).choose_spec
#align category_theory.injective.comp_factor_thru CategoryTheory.Injective.comp_factorThru
+-/
section
open ZeroObject
+#print CategoryTheory.Injective.zero_injective /-
instance zero_injective [HasZeroObject C] [HasZeroMorphisms C] : Injective (0 : C)
where Factors X Y g f mono := ⟨0, by ext⟩
#align category_theory.injective.zero_injective CategoryTheory.Injective.zero_injective
+-/
end
+#print CategoryTheory.Injective.of_iso /-
theorem of_iso {P Q : C} (i : P ≅ Q) (hP : Injective P) : Injective Q :=
{
Factors := fun X Y g f mono =>
@@ -96,10 +109,13 @@ theorem of_iso {P Q : C} (i : P ≅ Q) (hP : Injective P) : Injective Q :=
refine' ⟨h ≫ i.hom, _⟩
rw [← category.assoc, h_eq, category.assoc, iso.inv_hom_id, category.comp_id] }
#align category_theory.injective.of_iso CategoryTheory.Injective.of_iso
+-/
+#print CategoryTheory.Injective.iso_iff /-
theorem iso_iff {P Q : C} (i : P ≅ Q) : Injective P ↔ Injective Q :=
⟨of_iso i, of_iso i.symm⟩
#align category_theory.injective.iso_iff CategoryTheory.Injective.iso_iff
+-/
/-- The axiom of choice says that every nonempty type is an injective object in `Type`. -/
instance (X : Type u₁) [Nonempty X] : Injective X
@@ -115,6 +131,7 @@ instance (X : Type u₁) [Nonempty X] : Injective X
rw [mono (Classical.choose_spec h)]
· exact False.elim (h ⟨y, rfl⟩)⟩
+#print CategoryTheory.Injective.Type.enoughInjectives /-
instance Type.enoughInjectives : EnoughInjectives (Type u₁)
where presentation X :=
Nonempty.intro
@@ -125,6 +142,7 @@ instance Type.enoughInjectives : EnoughInjectives (Type u₁)
rw [mono_iff_injective]
exact Option.some_injective X }
#align category_theory.injective.Type.enough_injectives CategoryTheory.Injective.Type.enoughInjectives
+-/
instance {P Q : C} [HasBinaryProduct P Q] [Injective P] [Injective Q] : Injective (P ⨯ Q)
where Factors X Y g f mono := by
@@ -175,14 +193,24 @@ instance {P : C} [Projective P] : Injective (op P)
where Factors X Y g f mono :=
⟨(@projective.factor_thru C _ P _ _ _ g.unop f.unop _).op, Quiver.Hom.unop_inj (by simp)⟩
+#print CategoryTheory.Injective.injective_iff_projective_op /-
theorem injective_iff_projective_op {J : C} : Injective J ↔ Projective (op J) :=
⟨fun h => inferInstance, fun h => show Injective (unop (op J)) from inferInstance⟩
#align category_theory.injective.injective_iff_projective_op CategoryTheory.Injective.injective_iff_projective_op
+-/
+#print CategoryTheory.Injective.projective_iff_injective_op /-
theorem projective_iff_injective_op {P : C} : Projective P ↔ Injective (op P) :=
⟨fun h => inferInstance, fun h => show Projective (unop (op P)) from inferInstance⟩
#align category_theory.injective.projective_iff_injective_op CategoryTheory.Injective.projective_iff_injective_op
+-/
+/- warning: category_theory.injective.injective_iff_preserves_epimorphisms_yoneda_obj -> CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_obj is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] (J : C), Iff (CategoryTheory.Injective.{u1, u2} C _inst_1 J) (CategoryTheory.Functor.PreservesEpimorphisms.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1} (CategoryTheory.Functor.obj.{u1, max u2 u1, u2, max u1 u2 (succ u1)} C _inst_1 (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Functor.category.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.yoneda.{u1, u2} C _inst_1) J))
+but is expected to have type
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] (J : C), Iff (CategoryTheory.Injective.{u1, u2} C _inst_1 J) (CategoryTheory.Functor.PreservesEpimorphisms.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1} (Prefunctor.obj.{succ u1, max (succ u1) (succ u2), u2, max (succ u1) u2} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_1)) (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.CategoryStruct.toQuiver.{max u2 u1, max u2 (succ u1)} (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Category.toCategoryStruct.{max u2 u1, max u2 (succ u1)} (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Functor.category.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}))) (CategoryTheory.Functor.toPrefunctor.{u1, max u2 u1, u2, max u2 (succ u1)} C _inst_1 (CategoryTheory.Functor.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.Functor.category.{u1, u1, u2, succ u1} (Opposite.{succ u2} C) (CategoryTheory.Category.opposite.{u1, u2} C _inst_1) Type.{u1} CategoryTheory.types.{u1}) (CategoryTheory.yoneda.{u1, u2} C _inst_1)) J))
+Case conversion may be inaccurate. Consider using '#align category_theory.injective.injective_iff_preserves_epimorphisms_yoneda_obj CategoryTheory.Injective.injective_iff_preservesEpimorphisms_yoneda_objₓ'. -/
theorem injective_iff_preservesEpimorphisms_yoneda_obj (J : C) :
Injective J ↔ (yoneda.obj J).PreservesEpimorphisms :=
by
@@ -198,6 +226,12 @@ variable {D : Type u₂} [Category.{v₂} D]
variable {L : C ⥤ D} {R : D ⥤ C} [PreservesMonomorphisms L]
+/- warning: category_theory.injective.injective_of_adjoint -> CategoryTheory.Injective.injective_of_adjoint is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} C] {D : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} D] {L : CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2} {R : CategoryTheory.Functor.{u2, u1, u4, u3} D _inst_2 C _inst_1} [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u2, u3, u4} C _inst_1 D _inst_2 L], (CategoryTheory.Adjunction.{u1, u2, u3, u4} C _inst_1 D _inst_2 L R) -> (forall (J : D) [_inst_4 : CategoryTheory.Injective.{u2, u4} D _inst_2 J], CategoryTheory.Injective.{u1, u3} C _inst_1 (CategoryTheory.Functor.obj.{u2, u1, u4, u3} D _inst_2 C _inst_1 R J))
+but is expected to have type
+ forall {C : Type.{u3}} [_inst_1 : CategoryTheory.Category.{u1, u3} C] {D : Type.{u4}} [_inst_2 : CategoryTheory.Category.{u2, u4} D] {L : CategoryTheory.Functor.{u1, u2, u3, u4} C _inst_1 D _inst_2} {R : CategoryTheory.Functor.{u2, u1, u4, u3} D _inst_2 C _inst_1} [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u2, u3, u4} C _inst_1 D _inst_2 L], (CategoryTheory.Adjunction.{u1, u2, u3, u4} C _inst_1 D _inst_2 L R) -> (forall (J : D) [_inst_4 : CategoryTheory.Injective.{u2, u4} D _inst_2 J], CategoryTheory.Injective.{u1, u3} C _inst_1 (Prefunctor.obj.{succ u2, succ u1, u4, u3} D (CategoryTheory.CategoryStruct.toQuiver.{u2, u4} D (CategoryTheory.Category.toCategoryStruct.{u2, u4} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u1, u3} C (CategoryTheory.Category.toCategoryStruct.{u1, u3} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u2, u1, u4, u3} D _inst_2 C _inst_1 R) J))
+Case conversion may be inaccurate. Consider using '#align category_theory.injective.injective_of_adjoint CategoryTheory.Injective.injective_of_adjointₓ'. -/
theorem injective_of_adjoint (adj : L ⊣ R) (J : D) [Injective J] : Injective <| R.obj J :=
⟨fun A A' g f im =>
⟨adj.hom_equiv _ _ (factor_thru ((adj.hom_equiv A J).symm g) (L.map f)),
@@ -210,39 +244,50 @@ section EnoughInjectives
variable [EnoughInjectives C]
+#print CategoryTheory.Injective.under /-
/-- `injective.under X` provides an arbitrarily chosen injective object equipped with
an monomorphism `injective.ι : X ⟶ injective.under X`.
-/
def under (X : C) : C :=
(EnoughInjectives.presentation X).some.j
#align category_theory.injective.under CategoryTheory.Injective.under
+-/
+#print CategoryTheory.Injective.injective_under /-
instance injective_under (X : C) : Injective (under X) :=
(EnoughInjectives.presentation X).some.Injective
#align category_theory.injective.injective_under CategoryTheory.Injective.injective_under
+-/
+#print CategoryTheory.Injective.ι /-
/-- The monomorphism `injective.ι : X ⟶ injective.under X`
from the arbitrarily chosen injective object under `X`.
-/
def ι (X : C) : X ⟶ under X :=
(EnoughInjectives.presentation X).some.f
#align category_theory.injective.ι CategoryTheory.Injective.ι
+-/
+#print CategoryTheory.Injective.ι_mono /-
instance ι_mono (X : C) : Mono (ι X) :=
(EnoughInjectives.presentation X).some.Mono
#align category_theory.injective.ι_mono CategoryTheory.Injective.ι_mono
+-/
section
variable [HasZeroMorphisms C] {X Y : C} (f : X ⟶ Y) [HasCokernel f]
+#print CategoryTheory.Injective.syzygies /-
/-- When `C` has enough injectives, the object `injective.syzygies f` is
an arbitrarily chosen injective object under `cokernel f`.
-/
def syzygies : C :=
under (cokernel f)deriving Injective
#align category_theory.injective.syzygies CategoryTheory.Injective.syzygies
+-/
+#print CategoryTheory.Injective.d /-
/-- When `C` has enough injective,
`injective.d f : Y ⟶ syzygies f` is the composition
`cokernel.π f ≫ ι (cokernel f)`.
@@ -252,6 +297,7 @@ def syzygies : C :=
abbrev d : Y ⟶ syzygies f :=
cokernel.π f ≫ ι (cokernel f)
#align category_theory.injective.d CategoryTheory.Injective.d
+-/
end
@@ -263,13 +309,17 @@ instance [EnoughInjectives C] : EnoughProjectives Cᵒᵖ :=
instance [EnoughProjectives C] : EnoughInjectives Cᵒᵖ :=
⟨fun X => ⟨⟨_, inferInstance, (Projective.π (unop X)).op, inferInstance⟩⟩⟩
+#print CategoryTheory.Injective.enoughProjectives_of_enoughInjectives_op /-
theorem enoughProjectives_of_enoughInjectives_op [EnoughInjectives Cᵒᵖ] : EnoughProjectives C :=
⟨fun X => ⟨⟨_, inferInstance, (Injective.ι (op X)).unop, inferInstance⟩⟩⟩
#align category_theory.injective.enough_projectives_of_enough_injectives_op CategoryTheory.Injective.enoughProjectives_of_enoughInjectives_op
+-/
+#print CategoryTheory.Injective.enoughInjectives_of_enoughProjectives_op /-
theorem enoughInjectives_of_enoughProjectives_op [EnoughProjectives Cᵒᵖ] : EnoughInjectives C :=
⟨fun X => ⟨⟨_, inferInstance, (Projective.π (op X)).unop, inferInstance⟩⟩⟩
#align category_theory.injective.enough_injectives_of_enough_projectives_op CategoryTheory.Injective.enoughInjectives_of_enoughProjectives_op
+-/
open Injective
@@ -277,6 +327,7 @@ section
variable [HasZeroMorphisms C] [HasImages Cᵒᵖ] [HasEqualizers Cᵒᵖ]
+#print CategoryTheory.Injective.Exact.desc /-
/-- Given a pair of exact morphism `f : Q ⟶ R` and `g : R ⟶ S` and a map `h : R ⟶ J` to an injective
object `J` such that `f ≫ h = 0`, then `g` descents to a map `S ⟶ J`. See below:
@@ -292,12 +343,15 @@ def Exact.desc {J Q R S : C} [Injective J] (h : R ⟶ J) (f : Q ⟶ R) (g : R
(hgf : Exact g.op f.op) (w : f ≫ h = 0) : S ⟶ J :=
(Exact.lift h.op g.op f.op hgf (congr_arg Quiver.Hom.op w)).unop
#align category_theory.injective.exact.desc CategoryTheory.Injective.Exact.desc
+-/
+#print CategoryTheory.Injective.Exact.comp_desc /-
@[simp]
theorem Exact.comp_desc {J Q R S : C} [Injective J] (h : R ⟶ J) (f : Q ⟶ R) (g : R ⟶ S)
(hgf : Exact g.op f.op) (w : f ≫ h = 0) : g ≫ Exact.desc h f g hgf w = h := by
convert congr_arg Quiver.Hom.unop (exact.lift_comp h.op g.op f.op hgf (congr_arg Quiver.Hom.op w))
#align category_theory.injective.exact.comp_desc CategoryTheory.Injective.Exact.comp_desc
+-/
end
@@ -307,6 +361,12 @@ namespace Adjunction
variable {D : Type _} [Category D] {F : C ⥤ D} {G : D ⥤ C}
+/- warning: category_theory.adjunction.map_injective -> CategoryTheory.Adjunction.map_injective is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u4, u2, u3} C _inst_1 D _inst_2 F] (I : D), (CategoryTheory.Injective.{u4, u3} D _inst_2 I) -> (CategoryTheory.Injective.{u1, u2} C _inst_1 (CategoryTheory.Functor.obj.{u4, u1, u3, u2} D _inst_2 C _inst_1 G I)))
+but is expected to have type
+ forall {C : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u3, u4} C] {D : Type.{u1}} [_inst_2 : CategoryTheory.Category.{u2, u1} D] {F : CategoryTheory.Functor.{u3, u2, u4, u1} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u2, u3, u1, u4} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u3, u2, u4, u1} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u3, u2, u4, u1} C _inst_1 D _inst_2 F] (I : D), (CategoryTheory.Injective.{u2, u1} D _inst_2 I) -> (CategoryTheory.Injective.{u3, u4} C _inst_1 (Prefunctor.obj.{succ u2, succ u3, u1, u4} D (CategoryTheory.CategoryStruct.toQuiver.{u2, u1} D (CategoryTheory.Category.toCategoryStruct.{u2, u1} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u4} C (CategoryTheory.Category.toCategoryStruct.{u3, u4} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u2, u3, u1, u4} D _inst_2 C _inst_1 G) I)))
+Case conversion may be inaccurate. Consider using '#align category_theory.adjunction.map_injective CategoryTheory.Adjunction.map_injectiveₓ'. -/
theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : Injective I) :
Injective (G.obj I) :=
⟨fun X Y f g => by
@@ -317,6 +377,12 @@ theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : I
simp⟩
#align category_theory.adjunction.map_injective CategoryTheory.Adjunction.map_injective
+/- warning: category_theory.adjunction.injective_of_map_injective -> CategoryTheory.Adjunction.injective_of_map_injective is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Full.{u4, u1, u3, u2} D _inst_2 C _inst_1 G] [_inst_4 : CategoryTheory.Faithful.{u4, u1, u3, u2} D _inst_2 C _inst_1 G] (I : D), (CategoryTheory.Injective.{u1, u2} C _inst_1 (CategoryTheory.Functor.obj.{u4, u1, u3, u2} D _inst_2 C _inst_1 G I)) -> (CategoryTheory.Injective.{u4, u3} D _inst_2 I))
+but is expected to have type
+ forall {C : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u3, u4} C] {D : Type.{u1}} [_inst_2 : CategoryTheory.Category.{u2, u1} D] {F : CategoryTheory.Functor.{u3, u2, u4, u1} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u2, u3, u1, u4} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u3, u2, u4, u1} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Full.{u2, u3, u1, u4} D _inst_2 C _inst_1 G] [_inst_4 : CategoryTheory.Faithful.{u2, u3, u1, u4} D _inst_2 C _inst_1 G] (I : D), (CategoryTheory.Injective.{u3, u4} C _inst_1 (Prefunctor.obj.{succ u2, succ u3, u1, u4} D (CategoryTheory.CategoryStruct.toQuiver.{u2, u1} D (CategoryTheory.Category.toCategoryStruct.{u2, u1} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u3, u4} C (CategoryTheory.Category.toCategoryStruct.{u3, u4} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u2, u3, u1, u4} D _inst_2 C _inst_1 G) I)) -> (CategoryTheory.Injective.{u2, u1} D _inst_2 I))
+Case conversion may be inaccurate. Consider using '#align category_theory.adjunction.injective_of_map_injective CategoryTheory.Adjunction.injective_of_map_injectiveₓ'. -/
theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
(hI : Injective (G.obj I)) : Injective I :=
⟨fun X Y f g => by
@@ -328,6 +394,12 @@ theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
simpa⟩
#align category_theory.adjunction.injective_of_map_injective CategoryTheory.Adjunction.injective_of_map_injective
+/- warning: category_theory.adjunction.map_injective_presentation -> CategoryTheory.Adjunction.mapInjectivePresentation is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u4, u2, u3} C _inst_1 D _inst_2 F] (X : D), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 X) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 (CategoryTheory.Functor.obj.{u4, u1, u3, u2} D _inst_2 C _inst_1 G X)))
+but is expected to have type
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] {F : CategoryTheory.Functor.{u1, u4, u2, u3} C _inst_1 D _inst_2} {G : CategoryTheory.Functor.{u4, u1, u3, u2} D _inst_2 C _inst_1}, (CategoryTheory.Adjunction.{u1, u4, u2, u3} C _inst_1 D _inst_2 F G) -> (forall [_inst_3 : CategoryTheory.Functor.PreservesMonomorphisms.{u1, u4, u2, u3} C _inst_1 D _inst_2 F] (X : D), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 X) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 (Prefunctor.obj.{succ u4, succ u1, u3, u2} D (CategoryTheory.CategoryStruct.toQuiver.{u4, u3} D (CategoryTheory.Category.toCategoryStruct.{u4, u3} D _inst_2)) C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_1)) (CategoryTheory.Functor.toPrefunctor.{u4, u1, u3, u2} D _inst_2 C _inst_1 G) X)))
+Case conversion may be inaccurate. Consider using '#align category_theory.adjunction.map_injective_presentation CategoryTheory.Adjunction.mapInjectivePresentationₓ'. -/
/-- 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)
@@ -346,6 +418,12 @@ namespace Equivalence
variable {D : Type _} [Category D] (F : C ≌ D)
+/- warning: category_theory.equivalence.injective_presentation_of_map_injective_presentation -> CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] (F : CategoryTheory.Equivalence.{u1, u4, u2, u3} C _inst_1 D _inst_2) (X : C), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 (CategoryTheory.Functor.obj.{u1, u4, u2, u3} C _inst_1 D _inst_2 (CategoryTheory.Equivalence.functor.{u1, u4, u2, u3} C _inst_1 D _inst_2 F) X)) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 X)
+but is expected to have type
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D] (F : CategoryTheory.Equivalence.{u1, u4, u2, u3} C D _inst_1 _inst_2) (X : C), (CategoryTheory.InjectivePresentation.{u4, u3} D _inst_2 (Prefunctor.obj.{succ u1, succ u4, u2, u3} C (CategoryTheory.CategoryStruct.toQuiver.{u1, u2} C (CategoryTheory.Category.toCategoryStruct.{u1, u2} C _inst_1)) D (CategoryTheory.CategoryStruct.toQuiver.{u4, u3} D (CategoryTheory.Category.toCategoryStruct.{u4, u3} D _inst_2)) (CategoryTheory.Functor.toPrefunctor.{u1, u4, u2, u3} C _inst_1 D _inst_2 (CategoryTheory.Equivalence.functor.{u1, u4, u2, u3} C D _inst_1 _inst_2 F)) X)) -> (CategoryTheory.InjectivePresentation.{u1, u2} C _inst_1 X)
+Case conversion may be inaccurate. Consider using '#align category_theory.equivalence.injective_presentation_of_map_injective_presentation CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentationₓ'. -/
/-- Given an equivalence of categories `F`, an injective presentation of `F(X)` induces an
injective presentation of `X.` -/
def injectivePresentationOfMapInjectivePresentation (X : C)
@@ -357,6 +435,12 @@ def injectivePresentationOfMapInjectivePresentation (X : C)
Mono := mono_comp _ _
#align category_theory.equivalence.injective_presentation_of_map_injective_presentation CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation
+/- warning: category_theory.equivalence.enough_injectives_iff -> CategoryTheory.Equivalence.enoughInjectives_iff is a dubious translation:
+lean 3 declaration is
+ forall {C : Type.{u2}} [_inst_1 : CategoryTheory.Category.{u1, u2} C] {D : Type.{u3}} [_inst_2 : CategoryTheory.Category.{u4, u3} D], (CategoryTheory.Equivalence.{u1, u4, u2, u3} C _inst_1 D _inst_2) -> (Iff (CategoryTheory.EnoughInjectives.{u1, u2} C _inst_1) (CategoryTheory.EnoughInjectives.{u4, u3} D _inst_2))
+but is expected to have type
+ forall {C : Type.{u4}} [_inst_1 : CategoryTheory.Category.{u3, u4} C] {D : Type.{u1}} [_inst_2 : CategoryTheory.Category.{u2, u1} D], (CategoryTheory.Equivalence.{u3, u2, u4, u1} C D _inst_1 _inst_2) -> (Iff (CategoryTheory.EnoughInjectives.{u3, u4} C _inst_1) (CategoryTheory.EnoughInjectives.{u2, u1} D _inst_2))
+Case conversion may be inaccurate. Consider using '#align category_theory.equivalence.enough_injectives_iff CategoryTheory.Equivalence.enoughInjectives_iffₓ'. -/
theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D :=
by
constructor
mathlib commit https://github.com/leanprover-community/mathlib/commit/a4f99eae998680d3a2c240da4a2b16354c85ee49
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang, Kevin Buzzard
! This file was ported from Lean 3 source module category_theory.preadditive.injective
-! leanprover-community/mathlib commit f8d8465c3c392a93b9ed226956e26dee00975946
+! leanprover-community/mathlib commit 3974a774a707e2e06046a14c0eaef4654584fada
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -321,7 +321,7 @@ theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
(hI : Injective (G.obj I)) : Injective I :=
⟨fun X Y f g => by
intro
- haveI := adj.right_adjoint_preserves_limits
+ haveI : PreservesLimitsOfSize.{0, 0} G := adj.right_adjoint_preserves_limits
rcases hI.factors (G.map f) (G.map g) with ⟨⟩
use inv (adj.counit.app _) ≫ F.map w ≫ adj.counit.app _
refine' faithful.map_injective G _
@@ -336,7 +336,8 @@ def mapInjectivePresentation (adj : F ⊣ G) [F.PreservesMonomorphisms] (X : D)
j := G.obj I.j
Injective := adj.map_injective _ I.Injective
f := G.map I.f
- Mono := by haveI := adj.right_adjoint_preserves_limits <;> infer_instance
+ Mono := by
+ haveI : PreservesLimitsOfSize.{0, 0} G := adj.right_adjoint_preserves_limits <;> infer_instance
#align category_theory.adjunction.map_injective_presentation CategoryTheory.Adjunction.mapInjectivePresentation
end Adjunction
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce11c3c2a285bbe6937e26d9792fda4e51f3fe1a
@@ -4,14 +4,11 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang, Kevin Buzzard
! This file was ported from Lean 3 source module category_theory.preadditive.injective
-! leanprover-community/mathlib commit 956af7c76589f444f2e1313911bad16366ea476d
+! leanprover-community/mathlib commit f8d8465c3c392a93b9ed226956e26dee00975946
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
-import Mathbin.Algebra.Homology.Exact
-import Mathbin.CategoryTheory.Types
import Mathbin.CategoryTheory.Preadditive.Projective
-import Mathbin.CategoryTheory.Limits.Shapes.Biproducts
/-!
# Injective objects and categories with enough injectives
@@ -209,36 +206,6 @@ theorem injective_of_adjoint (adj : L ⊣ R) (J : D) [Injective J] : Injective <
end Adjunction
-section Preadditive
-
-variable [Preadditive C]
-
-theorem injective_iff_preservesEpimorphisms_preadditiveYoneda_obj (J : C) :
- Injective J ↔ (preadditiveYoneda.obj J).PreservesEpimorphisms :=
- by
- rw [injective_iff_preserves_epimorphisms_yoneda_obj]
- refine' ⟨fun h : (preadditive_yoneda.obj J ⋙ forget _).PreservesEpimorphisms => _, _⟩
- ·
- exact
- functor.preserves_epimorphisms_of_preserves_of_reflects (preadditive_yoneda.obj J) (forget _)
- · intro
- exact (inferInstance : (preadditive_yoneda.obj J ⋙ forget _).PreservesEpimorphisms)
-#align category_theory.injective.injective_iff_preserves_epimorphisms_preadditive_yoneda_obj CategoryTheory.Injective.injective_iff_preservesEpimorphisms_preadditiveYoneda_obj
-
-theorem injective_iff_preservesEpimorphisms_preadditive_yoneda_obj' (J : C) :
- Injective J ↔ (preadditiveYonedaObj J).PreservesEpimorphisms :=
- by
- rw [injective_iff_preserves_epimorphisms_yoneda_obj]
- refine' ⟨fun h : (preadditive_yoneda_obj J ⋙ forget _).PreservesEpimorphisms => _, _⟩
- ·
- exact
- functor.preserves_epimorphisms_of_preserves_of_reflects (preadditive_yoneda_obj J) (forget _)
- · intro
- exact (inferInstance : (preadditive_yoneda_obj J ⋙ forget _).PreservesEpimorphisms)
-#align category_theory.injective.injective_iff_preserves_epimorphisms_preadditive_yoneda_obj' CategoryTheory.Injective.injective_iff_preservesEpimorphisms_preadditive_yoneda_obj'
-
-end Preadditive
-
section EnoughInjectives
variable [EnoughInjectives C]
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
These notions on functors are now Functor.Full
, Functor.Faithful
, Functor.EssSurj
, Functor.IsEquivalence
, Functor.ReflectsIsomorphisms
. Deprecated aliases are introduced for the previous names.
@@ -319,15 +319,14 @@ theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : I
simp⟩
#align category_theory.adjunction.map_injective CategoryTheory.Adjunction.map_injective
-theorem injective_of_map_injective (adj : F ⊣ G) [Full G] [Faithful G] (I : D)
+theorem injective_of_map_injective (adj : F ⊣ G) [G.Full] [G.Faithful] (I : D)
(hI : Injective (G.obj I)) : Injective I :=
⟨fun {X} {Y} f g => by
intro
haveI : PreservesLimitsOfSize.{0, 0} G := adj.rightAdjointPreservesLimits
rcases hI.factors (G.map f) (G.map g) with ⟨w,h⟩
use inv (adj.counit.app _) ≫ F.map w ≫ adj.counit.app _
- refine' Faithful.map_injective (F := G) _
- simpa⟩
+ exact G.map_injective (by simpa)⟩
#align category_theory.adjunction.injective_of_map_injective CategoryTheory.Adjunction.injective_of_map_injective
/-- Given an adjunction `F ⊣ G` such that `F` preserves monos, `G` maps an injective presentation
@@ -367,7 +366,7 @@ lemma EnoughInjectives.of_adjunction {C : Type u₁} {D : Type u₂}
/-- 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) [IsEquivalence e] [EnoughInjectives D] : EnoughInjectives C :=
+ (e : C ⥤ D) [e.IsEquivalence] [EnoughInjectives D] : EnoughInjectives C :=
EnoughInjectives.of_adjunction (adj := e.asEquivalence.toAdjunction)
namespace Equivalence
Empty lines were removed by executing the following Python script twice
import os
import re
# Loop through each file in the repository
for dir_path, dirs, files in os.walk('.'):
for filename in files:
if filename.endswith('.lean'):
file_path = os.path.join(dir_path, filename)
# Open the file and read its contents
with open(file_path, 'r') as file:
content = file.read()
# Use a regular expression to replace sequences of "variable" lines separated by empty lines
# with sequences without empty lines
modified_content = re.sub(r'(variable.*\n)\n(variable(?! .* in))', r'\1\2', content)
# Write the modified content back to the file
with open(file_path, 'w') as file:
file.write(modified_content)
@@ -196,7 +196,6 @@ section Adjunction
open CategoryTheory.Functor
variable {D : Type u₂} [Category.{v₂} D]
-
variable {L : C ⥤ D} {R : D ⥤ C} [PreservesMonomorphisms L]
theorem injective_of_adjoint (adj : L ⊣ R) (J : D) [Injective J] : Injective <| R.obj J :=
@@ -134,7 +134,6 @@ instance Type.enoughInjectives : EnoughInjectives (Type u₁) where
instance {P Q : C} [HasBinaryProduct P Q] [Injective P] [Injective Q] : Injective (P ⨯ Q) where
factors g f mono := by
- skip
use Limits.prod.lift (factorThru (g ≫ Limits.prod.fst) f) (factorThru (g ≫ Limits.prod.snd) f)
simp only [prod.comp_lift, comp_factorThru]
ext
@@ -143,7 +142,6 @@ instance {P Q : C} [HasBinaryProduct P Q] [Injective P] [Injective Q] : Injectiv
instance {β : Type v} (c : β → C) [HasProduct c] [∀ b, Injective (c b)] : Injective (∏ c) where
factors g f mono := by
- skip
refine' ⟨Pi.lift fun b => factorThru (g ≫ Pi.π c _) f, _⟩
ext b
simp only [Category.assoc, limit.lift_π, Fan.mk_π_app, comp_factorThru]
@@ -151,7 +149,6 @@ instance {β : Type v} (c : β → C) [HasProduct c] [∀ b, Injective (c b)] :
instance {P Q : C} [HasZeroMorphisms C] [HasBinaryBiproduct P Q] [Injective P] [Injective Q] :
Injective (P ⊞ Q) where
factors g f mono := by
- skip
refine' ⟨biprod.lift (factorThru (g ≫ biprod.fst) f) (factorThru (g ≫ biprod.snd) f), _⟩
ext
· simp only [Category.assoc, biprod.lift_fst, comp_factorThru]
@@ -160,7 +157,6 @@ instance {P Q : C} [HasZeroMorphisms C] [HasBinaryBiproduct P Q] [Injective P] [
instance {β : Type v} (c : β → C) [HasZeroMorphisms C] [HasBiproduct c] [∀ b, Injective (c b)] :
Injective (⨁ c) where
factors g f mono := by
- skip
refine' ⟨biproduct.lift fun b => factorThru (g ≫ biproduct.π _ _) f, _⟩
ext
simp only [Category.assoc, biproduct.lift_π, comp_factorThru]
@@ -346,8 +346,35 @@ def mapInjectivePresentation (adj : F ⊣ G) [F.PreservesMonomorphisms] (X : D)
haveI : PreservesLimitsOfSize.{0, 0} G := adj.rightAdjointPreservesLimits; infer_instance
#align category_theory.adjunction.map_injective_presentation CategoryTheory.Adjunction.mapInjectivePresentation
+/-- 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 where
+ J := G.obj I.J
+ injective := Injective.injective_of_adjoint adj _
+ f := adj.homEquiv _ _ I.f
+
end Adjunction
+/--
+[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 where
+ presentation _ :=
+ ⟨adj.injectivePresentationOfMap _ (EnoughInjectives.presentation _).some⟩
+
+/-- 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) [IsEquivalence e] [EnoughInjectives D] : EnoughInjectives C :=
+ EnoughInjectives.of_adjunction (adj := e.asEquivalence.toAdjunction)
+
namespace Equivalence
variable {D : Type*} [Category D] (F : C ≌ D)
@@ -358,22 +385,12 @@ theorem map_injective_iff (P : C) : Injective (F.functor.obj P) ↔ Injective P
/-- 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 where
- J := F.inverse.obj I.J
- injective := Adjunction.map_injective F.toAdjunction I.J I.injective
- f := F.unit.app _ ≫ F.inverse.map I.f
- mono := mono_comp _ _
+ (I : InjectivePresentation (F.functor.obj X)) : InjectivePresentation X :=
+ F.toAdjunction.injectivePresentationOfMap _ I
#align category_theory.equivalence.injective_presentation_of_map_injective_presentation CategoryTheory.Equivalence.injectivePresentationOfMapInjectivePresentation
-theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D := by
- constructor
- all_goals intro H; constructor; intro X; constructor
- · exact
- F.symm.injectivePresentationOfMapInjectivePresentation _
- (Nonempty.some (H.presentation (F.inverse.obj X)))
- · exact
- F.injectivePresentationOfMapInjectivePresentation X
- (Nonempty.some (H.presentation (F.functor.obj X)))
+theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D :=
+ ⟨fun h => h.of_adjunction F.symm.toAdjunction, fun h => h.of_adjunction F.toAdjunction⟩
#align category_theory.equivalence.enough_injectives_iff CategoryTheory.Equivalence.enoughInjectives_iff
end Equivalence
These are split from #8226 (and subsequent changes in #8366), and arise from the fact the latest Lean is better at detecting these due to better abstraction.
I can't comment on whether any of these should be concerning, but putting them in a small commit makes it easier for someone to find and review them later.
Co-authored-by: Kyle Miller <kmill31415@gmail.com> Co-authored-by: Eric Wieser <wieser.eric@gmail.com>
@@ -88,7 +88,7 @@ section
open ZeroObject
-instance zero_injective [HasZeroObject C] [HasZeroMorphisms C] : Injective (0 : C) :=
+instance zero_injective [HasZeroObject C] : Injective (0 : C) :=
(isZero_zero C).injective
#align category_theory.injective.zero_injective CategoryTheory.Injective.zero_injective
This PR removes the special definitions of single₀
for chain and cochain complexes, so as to avoid duplication of code with HomologicalComplex.single
which is the functor constructing the complex that is supported by a single arbitrary degree. single₀
was supposed to have better definitional properties, but it turns out that in Lean4, it is no longer true (at least for the action of this functor on objects). The computation of the homology of these single complexes is generalized for HomologicalComplex.single
using the new homology API: this result is moved to a separate file Algebra.Homology.SingleHomology
.
@@ -37,6 +37,9 @@ class Injective (J : C) : Prop where
attribute [inherit_doc Injective] Injective.factors
+lemma Limits.IsZero.injective {X : C} (h : IsZero X) : Injective X where
+ factors _ _ _ := ⟨h.from_ _, h.eq_of_tgt _ _⟩
+
section
/-- An injective presentation of an object `X` consists of a monomorphism `f : X ⟶ J`
@@ -85,8 +88,8 @@ section
open ZeroObject
-instance zero_injective [HasZeroObject C] [HasZeroMorphisms C] : Injective (0 : C) where
- factors g f := ⟨0, by ext⟩
+instance zero_injective [HasZeroObject C] [HasZeroMorphisms C] : Injective (0 : C) :=
+ (isZero_zero C).injective
#align category_theory.injective.zero_injective CategoryTheory.Injective.zero_injective
end
And fix some names in comments where this revealed issues
@@ -248,7 +248,7 @@ def syzygies : C :=
instance : Injective <| syzygies f := injective_under (cokernel f)
/-- When `C` has enough injective,
-`injective.d f : Y ⟶ syzygies f` is the composition
+`Injective.d f : Y ⟶ syzygies f` is the composition
`cokernel.π f ≫ ι (cokernel f)`.
(When `C` is abelian, we have `exact f (injective.d f)`.)
@@ -349,6 +349,9 @@ namespace Equivalence
variable {D : Type*} [Category D] (F : C ≌ D)
+theorem map_injective_iff (P : C) : Injective (F.functor.obj P) ↔ Injective P :=
+ ⟨F.symm.toAdjunction.injective_of_map_injective P, F.symm.toAdjunction.map_injective P⟩
+
/-- Given an equivalence of categories `F`, an injective presentation of `F(X)` induces an
injective presentation of `X.` -/
def injectivePresentationOfMapInjectivePresentation (X : C)
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -309,7 +309,7 @@ end Injective
namespace Adjunction
-variable {D : Type _} [Category D] {F : C ⥤ D} {G : D ⥤ C}
+variable {D : Type*} [Category D] {F : C ⥤ D} {G : D ⥤ C}
theorem map_injective (adj : F ⊣ G) [F.PreservesMonomorphisms] (I : D) (hI : Injective I) :
Injective (G.obj I) :=
@@ -347,7 +347,7 @@ end Adjunction
namespace Equivalence
-variable {D : Type _} [Category D] (F : C ≌ D)
+variable {D : Type*} [Category D] (F : C ≌ D)
/-- Given an equivalence of categories `F`, an injective presentation of `F(X)` induces an
injective presentation of `X.` -/
@@ -2,14 +2,11 @@
Copyright (c) 2022 Jujian Zhang. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Jujian Zhang, Kevin Buzzard
-
-! This file was ported from Lean 3 source module category_theory.preadditive.injective
-! leanprover-community/mathlib commit 3974a774a707e2e06046a14c0eaef4654584fada
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.CategoryTheory.Preadditive.Projective
+#align_import category_theory.preadditive.injective from "leanprover-community/mathlib"@"3974a774a707e2e06046a14c0eaef4654584fada"
+
/-!
# Injective objects and categories with enough injectives
@@ -48,7 +48,7 @@ to some injective object `J`.
structure InjectivePresentation (X : C) where
J : C
injective : Injective J := by infer_instance
- f : X ⟶ J
+ f : X ⟶ J
mono : Mono f := by infer_instance
#align category_theory.injective_presentation CategoryTheory.InjectivePresentation
@@ -216,7 +216,7 @@ section EnoughInjectives
variable [EnoughInjectives C]
/-- `Injective.under X` provides an arbitrarily chosen injective object equipped with
-a monomorphism `Injective.ι : X ⟶ Injective.under X`.
+a monomorphism `Injective.ι : X ⟶ Injective.under X`.
-/
def under (X : C) : C :=
(EnoughInjectives.presentation X).some.J
@@ -226,7 +226,7 @@ instance injective_under (X : C) : Injective (under X) :=
(EnoughInjectives.presentation X).some.injective
#align category_theory.injective.injective_under CategoryTheory.Injective.injective_under
-/-- The monomorphism `Injective.ι : X ⟶ Injective.under X`
+/-- The monomorphism `Injective.ι : X ⟶ Injective.under X`
from the arbitrarily chosen injective object under `X`.
-/
def ι (X : C) : X ⟶ under X :=
@@ -376,4 +376,3 @@ theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInject
end Equivalence
end CategoryTheory
-
This PR is the result of running
find . -type f -name "*.lean" -exec sed -i -E 's/^( +)\. /\1· /' {} \;
find . -type f -name "*.lean" -exec sed -i -E 'N;s/^( +·)\n +(.*)$/\1 \2/;P;D' {} \;
which firstly replaces .
focusing dots with ·
and secondly removes isolated instances of such dots, unifying them with the following line. A new rule is placed in the style linter to verify this.
@@ -365,12 +365,10 @@ def injectivePresentationOfMapInjectivePresentation (X : C)
theorem enoughInjectives_iff (F : C ≌ D) : EnoughInjectives C ↔ EnoughInjectives D := by
constructor
all_goals intro H; constructor; intro X; constructor
- ·
- exact
+ · exact
F.symm.injectivePresentationOfMapInjectivePresentation _
(Nonempty.some (H.presentation (F.inverse.obj X)))
- ·
- exact
+ · exact
F.injectivePresentationOfMapInjectivePresentation X
(Nonempty.some (H.presentation (F.functor.obj X)))
#align category_theory.equivalence.enough_injectives_iff CategoryTheory.Equivalence.enoughInjectives_iff
@@ -216,7 +216,7 @@ section EnoughInjectives
variable [EnoughInjectives C]
/-- `Injective.under X` provides an arbitrarily chosen injective object equipped with
-an monomorphism `Injective.ι : X ⟶ Injective.under X`.
+a monomorphism `Injective.ι : X ⟶ Injective.under X`.
-/
def under (X : C) : C :=
(EnoughInjectives.presentation X).some.J
The unported dependencies are