category_theory.preadditive.injectiveMathlib.CategoryTheory.Preadditive.Injective

This file has been ported!

Changes since the initial port

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.

Changes in mathlib3

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(no changes)

(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)

Changes in mathlib3port

mathlib3
mathlib3port
Diff
@@ -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
Diff
@@ -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⟩)⟩
 
Diff
@@ -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
Diff
@@ -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
Diff
@@ -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"
 
Diff
@@ -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
 
Diff
@@ -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
 
Diff
@@ -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 _ _ _ = _
Diff
@@ -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
 -/
 
Diff
@@ -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)
Diff
@@ -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
Diff
@@ -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
 -/
 
Diff
@@ -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.
 -/
 
Diff
@@ -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
Diff
@@ -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
Diff
@@ -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]

Changes in mathlib4

mathlib3
mathlib4
chore(CategoryTheory): move Full, Faithful, EssSurj, IsEquivalence and ReflectsIsomorphisms to the Functor namespace (#11985)

These notions on functors are now Functor.Full, Functor.Faithful, Functor.EssSurj, Functor.IsEquivalence, Functor.ReflectsIsomorphisms. Deprecated aliases are introduced for the previous names.

Diff
@@ -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
chore(*): remove empty lines between variable statements (#11418)

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)
Diff
@@ -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 :=
chore: remove tactics (#11365)

More tactics that are not used, found using the linter at #11308.

The PR consists of tactic removals, whitespace changes and replacing a porting note by an explanation.

Diff
@@ -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]
feat: category of $R$-modules has enough injectives (#7392)

Co-authored-by: Junyan Xu <junyanxumath@gmail.com>

Diff
@@ -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
fix: remove unused arguments (#8380)

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>

Diff
@@ -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
 
refactor(Algebra/Homology): remove single₀ (#8208)

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.

Diff
@@ -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
chore: fix some cases in names (#7469)

And fix some names in comments where this revealed issues

Diff
@@ -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)`.)
chore(GroupCat/Injective): golf (#7204)

Co-authored-by: Junyan Xu <junyanxu.math@gmail.com>

Diff
@@ -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)
chore: banish Type _ and Sort _ (#6499)

We remove all possible occurences of Type _ and Sort _ in favor of Type* and Sort*.

This has nice performance benefits.

Diff
@@ -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.` -/
chore: script to replace headers with #align_import statements (#5979)

Open in Gitpod

Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
 
chore: cleanup whitespace (#5988)

Grepping for [^ .:{-] [^ :] and reviewing the results. Once I started I couldn't stop. :-)

Co-authored-by: Scott Morrison <scott.morrison@gmail.com>

Diff
@@ -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
-
chore: fix focusing dots (#5708)

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.

Diff
@@ -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
chore: fix grammar 2/3 (#5002)

Part 2 of #5001

Diff
@@ -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
feat: port CategoryTheory.Preadditive.Injective (#3859)

Dependencies 3 + 307

308 files ported (99.0%)
123874 lines ported (99.2%)
Show graph

The unported dependencies are