Documentation

Mathlib.CategoryTheory.Limits.Shapes.WideEqualizers

Wide equalizers and wide coequalizers #

This file defines wide (co)equalizers as special cases of (co)limits.

A wide equalizer for the family of morphisms X ⟶ Y indexed by J is the categorical generalization of the subobject {a ∈ A | ∀ j₁ j₂, f(j₁, a) = f(j₂, a)}. Note that if J has fewer than two morphisms this condition is trivial, so some lemmas and definitions assume J is nonempty.

Main definitions #

Each of these has a dual.

Main statements #

Implementation notes #

As with the other special shapes in the limits library, all the definitions here are given as abbreviations of the general statements for limits, so all the simp lemmas and theorems about general limits can be used.

References #

The type of objects for the diagram indexing a wide (co)equalizer.

Instances For

    The type family of morphisms for the diagram indexing a wide (co)equalizer.

    Instances For

      Composition of morphisms in the indexing diagram for wide (co)equalizers.

      Equations
      Instances For
        def CategoryTheory.Limits.parallelFamily {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) :

        parallelFamily f is the diagram in C consisting of the given family of morphisms, each with common domain and codomain.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[simp]
          @[simp]
          theorem CategoryTheory.Limits.parallelFamily_obj_one {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) :
          @[simp]
          theorem CategoryTheory.Limits.parallelFamily_map_left {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) {j : J} :

          Every functor indexing a wide (co)equalizer is naturally isomorphic (actually, equal) to a parallelFamily

          Equations
          Instances For

            WalkingParallelPair as a category is equivalent to a special case of WalkingParallelFamily.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              @[reducible, inline]
              abbrev CategoryTheory.Limits.Trident {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) :
              Type (max (max w u) v)

              A trident on f is just a Cone (parallelFamily f).

              Equations
              Instances For
                @[reducible, inline]
                abbrev CategoryTheory.Limits.Cotrident {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) :
                Type (max (max w u) v)

                A cotrident on f and g is just a Cocone (parallelFamily f).

                Equations
                Instances For
                  @[reducible, inline]

                  A trident t on the parallel family f : J → (X ⟶ Y) consists of two morphisms t.π.app zero : t.X ⟶ X and t.π.app one : t.X ⟶ Y. Of these, only the first one is interesting, and we give it the shorter name Trident.ι t.

                  Equations
                  Instances For
                    @[reducible, inline]

                    A cotrident t on the parallel family f : J → (X ⟶ Y) consists of two morphisms t.ι.app zero : X ⟶ t.X and t.ι.app one : Y ⟶ t.X. Of these, only the second one is interesting, and we give it the shorter name Cotrident.π t.

                    Equations
                    Instances For
                      @[simp]
                      theorem CategoryTheory.Limits.Trident.ι_eq_app_zero {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (t : Trident f) :
                      @[simp]
                      theorem CategoryTheory.Limits.Cotrident.π_eq_app_one {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (t : Cotrident f) :
                      @[simp]
                      theorem CategoryTheory.Limits.Trident.app_zero {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (s : Trident f) (j : J) :
                      @[simp]
                      theorem CategoryTheory.Limits.Trident.app_zero_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (s : Trident f) (j : J) {Z : C} (h : Y Z) :
                      @[simp]
                      theorem CategoryTheory.Limits.Cotrident.app_one {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (s : Cotrident f) (j : J) :
                      def CategoryTheory.Limits.Trident.ofι {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (ι : P X) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp ι (f j₁) = CategoryStruct.comp ι (f j₂)) :

                      A trident on f : J → (X ⟶ Y) is determined by the morphism ι : P ⟶ X satisfying ∀ j₁ j₂, ι ≫ f j₁ = ι ≫ f j₂.

                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        @[simp]
                        theorem CategoryTheory.Limits.Trident.ofι_pt {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (ι : P X) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp ι (f j₁) = CategoryStruct.comp ι (f j₂)) :
                        (ofι ι w).pt = P
                        @[simp]
                        theorem CategoryTheory.Limits.Trident.ofι_π_app {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (ι : P X) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp ι (f j₁) = CategoryStruct.comp ι (f j₂)) (X✝ : WalkingParallelFamily J) :
                        def CategoryTheory.Limits.Cotrident.ofπ {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (π : Y P) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) π = CategoryStruct.comp (f j₂) π) :

                        A cotrident on f : J → (X ⟶ Y) is determined by the morphism π : Y ⟶ P satisfying ∀ j₁ j₂, f j₁ ≫ π = f j₂ ≫ π.

                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For
                          @[simp]
                          theorem CategoryTheory.Limits.Cotrident.ofπ_pt {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (π : Y P) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) π = CategoryStruct.comp (f j₂) π) :
                          (ofπ π w).pt = P
                          @[simp]
                          theorem CategoryTheory.Limits.Cotrident.ofπ_ι_app {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (π : Y P) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) π = CategoryStruct.comp (f j₂) π) (X✝ : WalkingParallelFamily J) :
                          theorem CategoryTheory.Limits.Trident.ι_ofι {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (ι : P X) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp ι (f j₁) = CategoryStruct.comp ι (f j₂)) :
                          (ofι ι w) = ι
                          theorem CategoryTheory.Limits.Cotrident.π_ofπ {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {P : C} (π : Y P) (w : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) π = CategoryStruct.comp (f j₂) π) :
                          (ofπ π w) = π
                          theorem CategoryTheory.Limits.Trident.condition {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (j₁ j₂ : J) (t : Trident f) :
                          CategoryStruct.comp t (f j₁) = CategoryStruct.comp t (f j₂)
                          theorem CategoryTheory.Limits.Trident.condition_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (j₁ j₂ : J) (t : Trident f) {Z : C} (h : Y Z) :
                          theorem CategoryTheory.Limits.Cotrident.condition {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (j₁ j₂ : J) (t : Cotrident f) :
                          CategoryStruct.comp (f j₁) t = CategoryStruct.comp (f j₂) t
                          theorem CategoryTheory.Limits.Cotrident.condition_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} (j₁ j₂ : J) (t : Cotrident f) {Z : C} (h : ((Functor.const (WalkingParallelFamily J)).obj t.pt).obj WalkingParallelFamily.one Z) :
                          theorem CategoryTheory.Limits.Trident.equalizer_ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] (s : Trident f) {W : C} {k l : W s.pt} (h : CategoryStruct.comp k s = CategoryStruct.comp l s) (j : WalkingParallelFamily J) :
                          CategoryStruct.comp k (s.app j) = CategoryStruct.comp l (s.app j)

                          To check whether two maps are equalized by both maps of a trident, it suffices to check it for the first map

                          theorem CategoryTheory.Limits.Cotrident.coequalizer_ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] (s : Cotrident f) {W : C} {k l : s.pt W} (h : CategoryStruct.comp s k = CategoryStruct.comp s l) (j : WalkingParallelFamily J) :
                          CategoryStruct.comp (s.app j) k = CategoryStruct.comp (s.app j) l

                          To check whether two maps are coequalized by both maps of a cotrident, it suffices to check it for the second map

                          theorem CategoryTheory.Limits.Trident.IsLimit.hom_ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s : Trident f} (hs : IsLimit s) {W : C} {k l : W s.pt} (h : CategoryStruct.comp k s = CategoryStruct.comp l s) :
                          k = l
                          theorem CategoryTheory.Limits.Cotrident.IsColimit.hom_ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s : Cotrident f} (hs : IsColimit s) {W : C} {k l : s.pt W} (h : CategoryStruct.comp s k = CategoryStruct.comp s l) :
                          k = l
                          def CategoryTheory.Limits.Trident.IsLimit.lift' {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s : Trident f} (hs : IsLimit s) {W : C} (k : W X) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp k (f j₁) = CategoryStruct.comp k (f j₂)) :
                          { l : W s.pt // CategoryStruct.comp l s = k }

                          If s is a limit trident over f, then a morphism k : W ⟶ X satisfying ∀ j₁ j₂, k ≫ f j₁ = k ≫ f j₂ induces a morphism l : W ⟶ s.X such that l ≫ Trident.ι s = k.

                          Equations
                          Instances For
                            def CategoryTheory.Limits.Cotrident.IsColimit.desc' {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s : Cotrident f} (hs : IsColimit s) {W : C} (k : Y W) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) k = CategoryStruct.comp (f j₂) k) :
                            { l : s.pt W // CategoryStruct.comp s l = k }

                            If s is a colimit cotrident over f, then a morphism k : Y ⟶ W satisfying ∀ j₁ j₂, f j₁ ≫ k = f j₂ ≫ k induces a morphism l : s.X ⟶ W such that Cotrident.π s ≫ l = k.

                            Equations
                            Instances For
                              def CategoryTheory.Limits.Trident.IsLimit.mk {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] (t : Trident f) (lift : (s : Trident f) → s.pt t.pt) (fac : ∀ (s : Trident f), CategoryStruct.comp (lift s) t = s) (uniq : ∀ (s : Trident f) (m : s.pt t.pt), (∀ (j : WalkingParallelFamily J), CategoryStruct.comp m (t.app j) = s.app j)m = lift s) :

                              This is a slightly more convenient method to verify that a trident is a limit cone. It only asks for a proof of facts that carry any mathematical content

                              Equations
                              Instances For

                                This is another convenient method to verify that a trident is a limit cone. It only asks for a proof of facts that carry any mathematical content, and allows access to the same s for all parts.

                                Equations
                                Instances For
                                  def CategoryTheory.Limits.Cotrident.IsColimit.mk {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] (t : Cotrident f) (desc : (s : Cotrident f) → t.pt s.pt) (fac : ∀ (s : Cotrident f), CategoryStruct.comp t (desc s) = s) (uniq : ∀ (s : Cotrident f) (m : t.pt s.pt), (∀ (j : WalkingParallelFamily J), CategoryStruct.comp (t.app j) m = s.app j)m = desc s) :

                                  This is a slightly more convenient method to verify that a cotrident is a colimit cocone. It only asks for a proof of facts that carry any mathematical content

                                  Equations
                                  Instances For
                                    def CategoryTheory.Limits.Cotrident.IsColimit.mk' {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] (t : Cotrident f) (create : (s : Cotrident f) → { l : t.pt s.pt // CategoryStruct.comp t l = s ∀ {m : ((Functor.const (WalkingParallelFamily J)).obj t.pt).obj WalkingParallelFamily.one ((Functor.const (WalkingParallelFamily J)).obj s.pt).obj WalkingParallelFamily.one}, CategoryStruct.comp t m = sm = l }) :

                                    This is another convenient method to verify that a cotrident is a colimit cocone. It only asks for a proof of facts that carry any mathematical content, and allows access to the same s for all parts.

                                    Equations
                                    Instances For
                                      def CategoryTheory.Limits.Trident.IsLimit.homIso {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Trident f} (ht : IsLimit t) (Z : C) :
                                      (Z t.pt) { h : Z X // ∀ (j₁ j₂ : J), CategoryStruct.comp h (f j₁) = CategoryStruct.comp h (f j₂) }

                                      Given a limit cone for the family f : J → (X ⟶ Y), for any Z, morphisms from Z to its point are in bijection with morphisms h : Z ⟶ X such that ∀ j₁ j₂, h ≫ f j₁ = h ≫ f j₂. Further, this bijection is natural in Z: see Trident.Limits.homIso_natural.

                                      Equations
                                      • One or more equations did not get rendered due to their size.
                                      Instances For
                                        @[simp]
                                        theorem CategoryTheory.Limits.Trident.IsLimit.homIso_apply_coe {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Trident f} (ht : IsLimit t) (Z : C) (k : Z t.pt) :
                                        ((homIso ht Z) k) = CategoryStruct.comp k t
                                        @[simp]
                                        theorem CategoryTheory.Limits.Trident.IsLimit.homIso_symm_apply {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Trident f} (ht : IsLimit t) (Z : C) (h : { h : Z X // ∀ (j₁ j₂ : J), CategoryStruct.comp h (f j₁) = CategoryStruct.comp h (f j₂) }) :
                                        (homIso ht Z).symm h = (lift' ht h )
                                        theorem CategoryTheory.Limits.Trident.IsLimit.homIso_natural {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Trident f} (ht : IsLimit t) {Z Z' : C} (q : Z' Z) (k : Z t.pt) :
                                        ((homIso ht Z') (CategoryStruct.comp q k)) = CategoryStruct.comp q ((homIso ht Z) k)

                                        The bijection of Trident.IsLimit.homIso is natural in Z.

                                        def CategoryTheory.Limits.Cotrident.IsColimit.homIso {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Cotrident f} (ht : IsColimit t) (Z : C) :
                                        (t.pt Z) { h : Y Z // ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) h = CategoryStruct.comp (f j₂) h }

                                        Given a colimit cocone for the family f : J → (X ⟶ Y), for any Z, morphisms from the cocone point to Z are in bijection with morphisms h : Z ⟶ X such that ∀ j₁ j₂, f j₁ ≫ h = f j₂ ≫ h. Further, this bijection is natural in Z: see Cotrident.IsColimit.homIso_natural.

                                        Equations
                                        • One or more equations did not get rendered due to their size.
                                        Instances For
                                          @[simp]
                                          theorem CategoryTheory.Limits.Cotrident.IsColimit.homIso_apply_coe {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Cotrident f} (ht : IsColimit t) (Z : C) (k : t.pt Z) :
                                          ((homIso ht Z) k) = CategoryStruct.comp t k
                                          @[simp]
                                          theorem CategoryTheory.Limits.Cotrident.IsColimit.homIso_symm_apply {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Cotrident f} (ht : IsColimit t) (Z : C) (h : { h : Y Z // ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) h = CategoryStruct.comp (f j₂) h }) :
                                          (homIso ht Z).symm h = (desc' ht h )
                                          theorem CategoryTheory.Limits.Cotrident.IsColimit.homIso_natural {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {t : Cotrident f} {Z Z' : C} (q : Z Z') (ht : IsColimit t) (k : t.pt Z) :
                                          ((homIso ht Z') (CategoryStruct.comp k q)) = CategoryStruct.comp (↑((homIso ht Z) k)) q

                                          The bijection of Cotrident.IsColimit.homIso is natural in Z.

                                          This is a helper construction that can be useful when verifying that a category has certain wide equalizers. Given F : WalkingParallelFamily ⥤ C, which is really the same as parallelFamily (fun j ↦ F.map (line j)), and a trident on fun j ↦ F.map (line j), we get a cone on F.

                                          If you're thinking about using this, have a look at hasWideEqualizers_of_hasLimit_parallelFamily, which you may find to be an easier way of achieving your goal.

                                          Equations
                                          • One or more equations did not get rendered due to their size.
                                          Instances For

                                            This is a helper construction that can be useful when verifying that a category has all coequalizers. Given F : WalkingParallelFamily ⥤ C, which is really the same as parallelFamily (fun j ↦ F.map (line j)), and a cotrident on fun j ↦ F.map (line j) we get a cocone on F.

                                            If you're thinking about using this, have a look at hasWideCoequalizers_of_hasColimit_parallelFamily, which you may find to be an easier way of achieving your goal.

                                            Equations
                                            • One or more equations did not get rendered due to their size.
                                            Instances For
                                              @[simp]
                                              theorem CategoryTheory.Limits.Cone.ofTrident_π {J : Type w} {C : Type u} [Category.{v, u} C] {F : Functor (WalkingParallelFamily J) C} (t : Trident fun (j : J) => F.map (WalkingParallelFamily.Hom.line j)) (j : WalkingParallelFamily J) :
                                              (ofTrident t).app j = CategoryStruct.comp (t.app j) (eqToHom )
                                              @[simp]

                                              Given F : WalkingParallelFamily ⥤ C, which is really the same as parallelFamily (fun j ↦ F.map (line j)) and a cone on F, we get a trident on fun j ↦ F.map (line j).

                                              Equations
                                              • One or more equations did not get rendered due to their size.
                                              Instances For

                                                Given F : WalkingParallelFamily ⥤ C, which is really the same as parallelFamily (F.map left) (F.map right) and a cocone on F, we get a cotrident on fun j ↦ F.map (line j).

                                                Equations
                                                • One or more equations did not get rendered due to their size.
                                                Instances For
                                                  @[simp]
                                                  theorem CategoryTheory.Limits.Trident.ofCone_π {J : Type w} {C : Type u} [Category.{v, u} C] {F : Functor (WalkingParallelFamily J) C} (t : Cone F) (j : WalkingParallelFamily J) :
                                                  (ofCone t).app j = CategoryStruct.comp (t.app j) (eqToHom )
                                                  @[simp]
                                                  def CategoryTheory.Limits.Trident.mkHom {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Trident f} (k : s.pt t.pt) (w : CategoryStruct.comp k t = s := by aesop_cat) :
                                                  s t

                                                  Helper function for constructing morphisms between wide equalizer tridents.

                                                  Equations
                                                  Instances For
                                                    @[simp]
                                                    theorem CategoryTheory.Limits.Trident.mkHom_hom {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Trident f} (k : s.pt t.pt) (w : CategoryStruct.comp k t = s := by aesop_cat) :
                                                    (mkHom k w).hom = k
                                                    def CategoryTheory.Limits.Trident.ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Trident f} (i : s.pt t.pt) (w : CategoryStruct.comp i.hom t = s := by aesop_cat) :
                                                    s t

                                                    To construct an isomorphism between tridents, it suffices to give an isomorphism between the cone points and check that it commutes with the ι morphisms.

                                                    Equations
                                                    Instances For
                                                      @[simp]
                                                      theorem CategoryTheory.Limits.Trident.ext_hom {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Trident f} (i : s.pt t.pt) (w : CategoryStruct.comp i.hom t = s := by aesop_cat) :
                                                      (ext i w).hom = mkHom i.hom w
                                                      @[simp]
                                                      theorem CategoryTheory.Limits.Trident.ext_inv {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Trident f} (i : s.pt t.pt) (w : CategoryStruct.comp i.hom t = s := by aesop_cat) :
                                                      (ext i w).inv = mkHom i.inv
                                                      def CategoryTheory.Limits.Cotrident.mkHom {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Cotrident f} (k : s.pt t.pt) (w : CategoryStruct.comp s k = t := by aesop_cat) :
                                                      s t

                                                      Helper function for constructing morphisms between coequalizer cotridents.

                                                      Equations
                                                      Instances For
                                                        @[simp]
                                                        theorem CategoryTheory.Limits.Cotrident.mkHom_hom {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Cotrident f} (k : s.pt t.pt) (w : CategoryStruct.comp s k = t := by aesop_cat) :
                                                        (mkHom k w).hom = k
                                                        def CategoryTheory.Limits.Cotrident.ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {s t : Cotrident f} (i : s.pt t.pt) (w : CategoryStruct.comp s i.hom = t := by aesop_cat) :
                                                        s t

                                                        To construct an isomorphism between cotridents, it suffices to give an isomorphism between the cocone points and check that it commutes with the π morphisms.

                                                        Equations
                                                        Instances For
                                                          @[reducible, inline]
                                                          abbrev CategoryTheory.Limits.HasWideEqualizer {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) :

                                                          HasWideEqualizer f represents a particular choice of limiting cone for the parallel family of morphisms f.

                                                          Equations
                                                          Instances For
                                                            @[reducible, inline]
                                                            abbrev CategoryTheory.Limits.wideEqualizer {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideEqualizer f] :
                                                            C

                                                            If a wide equalizer of f exists, we can access an arbitrary choice of such by saying wideEqualizer f.

                                                            Equations
                                                            Instances For
                                                              @[reducible, inline]
                                                              abbrev CategoryTheory.Limits.wideEqualizer.ι {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideEqualizer f] :

                                                              If a wide equalizer of f exists, we can access the inclusion wideEqualizer f ⟶ X by saying wideEqualizer.ι f.

                                                              Equations
                                                              Instances For
                                                                @[reducible, inline]
                                                                abbrev CategoryTheory.Limits.wideEqualizer.trident {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideEqualizer f] :

                                                                A wide equalizer cone for a parallel family f.

                                                                Equations
                                                                Instances For
                                                                  @[simp]
                                                                  theorem CategoryTheory.Limits.wideEqualizer.trident_ι {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideEqualizer f] :
                                                                  (trident f) = ι f
                                                                  theorem CategoryTheory.Limits.wideEqualizer.condition {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideEqualizer f] (j₁ j₂ : J) :
                                                                  CategoryStruct.comp (ι f) (f j₁) = CategoryStruct.comp (ι f) (f j₂)
                                                                  theorem CategoryTheory.Limits.wideEqualizer.condition_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideEqualizer f] (j₁ j₂ : J) {Z : C} (h : Y Z) :

                                                                  The wideEqualizer built from wideEqualizer.ι f is limiting.

                                                                  Equations
                                                                  • One or more equations did not get rendered due to their size.
                                                                  Instances For
                                                                    @[reducible, inline]
                                                                    abbrev CategoryTheory.Limits.wideEqualizer.lift {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideEqualizer f] [Nonempty J] {W : C} (k : W X) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp k (f j₁) = CategoryStruct.comp k (f j₂)) :

                                                                    A morphism k : W ⟶ X satisfying ∀ j₁ j₂, k ≫ f j₁ = k ≫ f j₂ factors through the wide equalizer of f via wideEqualizer.lift : W ⟶ wideEqualizer f.

                                                                    Equations
                                                                    Instances For
                                                                      @[simp]
                                                                      theorem CategoryTheory.Limits.wideEqualizer.lift_ι {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideEqualizer f] [Nonempty J] {W : C} (k : W X) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp k (f j₁) = CategoryStruct.comp k (f j₂)) :
                                                                      @[simp]
                                                                      theorem CategoryTheory.Limits.wideEqualizer.lift_ι_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideEqualizer f] [Nonempty J] {W : C} (k : W X) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp k (f j₁) = CategoryStruct.comp k (f j₂)) {Z : C} (h✝ : X Z) :
                                                                      def CategoryTheory.Limits.wideEqualizer.lift' {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideEqualizer f] [Nonempty J] {W : C} (k : W X) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp k (f j₁) = CategoryStruct.comp k (f j₂)) :
                                                                      { l : W wideEqualizer f // CategoryStruct.comp l (ι f) = k }

                                                                      A morphism k : W ⟶ X satisfying ∀ j₁ j₂, k ≫ f j₁ = k ≫ f j₂ induces a morphism l : W ⟶ wideEqualizer f satisfying l ≫ wideEqualizer.ι f = k.

                                                                      Equations
                                                                      Instances For
                                                                        theorem CategoryTheory.Limits.wideEqualizer.hom_ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideEqualizer f] [Nonempty J] {W : C} {k l : W wideEqualizer f} (h : CategoryStruct.comp k (ι f) = CategoryStruct.comp l (ι f)) :
                                                                        k = l

                                                                        Two maps into a wide equalizer are equal if they are equal when composed with the wide equalizer map.

                                                                        instance CategoryTheory.Limits.wideEqualizer.ι_mono {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideEqualizer f] [Nonempty J] :
                                                                        Mono (ι f)

                                                                        A wide equalizer morphism is a monomorphism

                                                                        theorem CategoryTheory.Limits.mono_of_isLimit_parallelFamily {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {c : Cone (parallelFamily f)} (i : IsLimit c) :

                                                                        The wide equalizer morphism in any limit cone is a monomorphism.

                                                                        @[reducible, inline]
                                                                        abbrev CategoryTheory.Limits.HasWideCoequalizer {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) :

                                                                        HasWideCoequalizer f g represents a particular choice of colimiting cocone for the parallel family of morphisms f.

                                                                        Equations
                                                                        Instances For
                                                                          @[reducible, inline]
                                                                          abbrev CategoryTheory.Limits.wideCoequalizer {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideCoequalizer f] :
                                                                          C

                                                                          If a wide coequalizer of f, we can access an arbitrary choice of such by saying wideCoequalizer f.

                                                                          Equations
                                                                          Instances For
                                                                            @[reducible, inline]
                                                                            abbrev CategoryTheory.Limits.wideCoequalizer.π {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideCoequalizer f] :

                                                                            If a wideCoequalizer of f exists, we can access the corresponding projection by saying wideCoequalizer.π f.

                                                                            Equations
                                                                            Instances For
                                                                              @[reducible, inline]
                                                                              abbrev CategoryTheory.Limits.wideCoequalizer.cotrident {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideCoequalizer f] :

                                                                              An arbitrary choice of coequalizer cocone for a parallel family f.

                                                                              Equations
                                                                              Instances For
                                                                                @[simp]
                                                                                theorem CategoryTheory.Limits.wideCoequalizer.cotrident_π {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideCoequalizer f] :
                                                                                (cotrident f) = π f
                                                                                theorem CategoryTheory.Limits.wideCoequalizer.condition {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideCoequalizer f] (j₁ j₂ : J) :
                                                                                CategoryStruct.comp (f j₁) (π f) = CategoryStruct.comp (f j₂) (π f)
                                                                                theorem CategoryTheory.Limits.wideCoequalizer.condition_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} (f : J(X Y)) [HasWideCoequalizer f] (j₁ j₂ : J) {Z : C} (h : wideCoequalizer f Z) :

                                                                                The cotrident built from wideCoequalizer.π f is colimiting.

                                                                                Equations
                                                                                • One or more equations did not get rendered due to their size.
                                                                                Instances For
                                                                                  @[reducible, inline]
                                                                                  abbrev CategoryTheory.Limits.wideCoequalizer.desc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideCoequalizer f] [Nonempty J] {W : C} (k : Y W) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) k = CategoryStruct.comp (f j₂) k) :

                                                                                  Any morphism k : Y ⟶ W satisfying ∀ j₁ j₂, f j₁ ≫ k = f j₂ ≫ k factors through the wide coequalizer of f via wideCoequalizer.desc : wideCoequalizer f ⟶ W.

                                                                                  Equations
                                                                                  Instances For
                                                                                    @[simp]
                                                                                    theorem CategoryTheory.Limits.wideCoequalizer.π_desc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideCoequalizer f] [Nonempty J] {W : C} (k : Y W) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) k = CategoryStruct.comp (f j₂) k) :
                                                                                    @[simp]
                                                                                    theorem CategoryTheory.Limits.wideCoequalizer.π_desc_assoc {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideCoequalizer f] [Nonempty J] {W : C} (k : Y W) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) k = CategoryStruct.comp (f j₂) k) {Z : C} (h✝ : W Z) :
                                                                                    def CategoryTheory.Limits.wideCoequalizer.desc' {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideCoequalizer f] [Nonempty J] {W : C} (k : Y W) (h : ∀ (j₁ j₂ : J), CategoryStruct.comp (f j₁) k = CategoryStruct.comp (f j₂) k) :
                                                                                    { l : wideCoequalizer f W // CategoryStruct.comp (π f) l = k }

                                                                                    Any morphism k : Y ⟶ W satisfying ∀ j₁ j₂, f j₁ ≫ k = f j₂ ≫ k induces a morphism l : wideCoequalizer f ⟶ W satisfying wideCoequalizer.π ≫ g = l.

                                                                                    Equations
                                                                                    Instances For
                                                                                      theorem CategoryTheory.Limits.wideCoequalizer.hom_ext {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideCoequalizer f] [Nonempty J] {W : C} {k l : wideCoequalizer f W} (h : CategoryStruct.comp (π f) k = CategoryStruct.comp (π f) l) :
                                                                                      k = l

                                                                                      Two maps from a wide coequalizer are equal if they are equal when composed with the wide coequalizer map

                                                                                      instance CategoryTheory.Limits.wideCoequalizer.π_epi {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [HasWideCoequalizer f] [Nonempty J] :
                                                                                      Epi (π f)

                                                                                      A wide coequalizer morphism is an epimorphism

                                                                                      theorem CategoryTheory.Limits.epi_of_isColimit_parallelFamily {J : Type w} {C : Type u} [Category.{v, u} C] {X Y : C} {f : J(X Y)} [Nonempty J] {c : Cocone (parallelFamily f)} (i : IsColimit c) :

                                                                                      The wide coequalizer morphism in any colimit cocone is an epimorphism.

                                                                                      @[reducible, inline]

                                                                                      HasWideEqualizers represents a choice of wide equalizer for every family of morphisms

                                                                                      Equations
                                                                                      Instances For
                                                                                        @[reducible, inline]

                                                                                        HasWideCoequalizers represents a choice of wide coequalizer for every family of morphisms

                                                                                        Equations
                                                                                        Instances For

                                                                                          If C has all limits of diagrams parallelFamily f, then it has all wide equalizers

                                                                                          If C has all colimits of diagrams parallelFamily f, then it has all wide coequalizers