Documentation

Mathlib.CategoryTheory.SmallObject.Iteration.Basic

Transfinite iterations of a successor structure #

In this file, we introduce the structure SuccStruct on a category C. It consists of the data of an object X₀ : C, a successor map succ : C → C and a morphism toSucc : X ⟶ succ X for any X : C. The map toSucc does not have to be natural in X. For any element j : J in a well-ordered type J, we would like to define the iteration of Φ : SuccStruct C, as a functor F : J ⥤ C such that F.obj ⊥ = X₀, F.obj j ⟶ F.obj (Order.succ j) is toSucc (F.obj j) when j is not maximal, and when j is limit, F.obj j should be the colimit of the F.obj k for k < j.

In the small object argument, we shall apply this to the iteration of a functor F : C ⥤ C equipped with a natural transformation ε : 𝟭 C ⟶ F: this will correspond to the case of SuccStruct.ofNatTrans ε : SuccStruct (C ⥤ C), for which X₀ := 𝟭 C, succ G := G ⋙ F and toSucc G : G ⟶ G ⋙ F is given by whiskerLeft G ε.

The construction of the iteration of Φ : SuccStruct C is done by transfinite induction, under an assumption HasIterationOfShape C J. However, for a limit element j : J, the definition of F.obj j does not involve only the objects F.obj i for i < j, but it also involves the maps F.obj i₁ ⟶ F.obj i₂ for i₁ ≤ i₂ < j. Then, this is not a straightforward application of definitions by transfinite induction. In order to solve this technical difficulty, we introduce a structure Φ.Iteration j for any j : J. This structure contains all the expected data and properties for all the indices that are ≤ j. In this file, we show that Φ.Iteration j is a subsingleton. The existence shall be obtained in the file SmallObject.Iteration.Nonempty, and the construction of the functor Φ.iterationFunctor J : J ⥤ C and of its colimit Φ.iteration J : C will done in the file SmallObject.TransfiniteIteration.

The map Φ.toSucc X : X ⟶ Φ.succ X does not have to be natural (and it is not in certain applications). Then, two isomorphic objects X and Y may have non isomorphic successors. This is the reason why we make an extensive use of equalities in C and in Arrow C in the definitions.

Note #

The iteration was first introduced in mathlib by Joël Riou, using a different approach as the one described above. After refactoring his code, he found that the approach described above had already been used in the pioneering formalization work in Lean 3 by Reid Barton in 2018 towards the model category structure on topological spaces.

def CategoryTheory.SmallObject.restrictionLT {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) :
Functor (↑(Set.Iio i)) C

The functor Set.Iio i ⥤ C obtained by "restriction" of F : Set.Iic j ⥤ C when i ≤ j.

Equations
Instances For
    @[simp]
    theorem CategoryTheory.SmallObject.restrictionLT_obj {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) (k : J) (hk : k < i) :
    (restrictionLT F hi).obj k, hk = F.obj k,
    @[simp]
    theorem CategoryTheory.SmallObject.restrictionLT_map {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) {k₁ k₂ : (Set.Iio i)} (φ : k₁ k₂) :
    (restrictionLT F hi).map φ = F.map (homOfLE )
    def CategoryTheory.SmallObject.coconeOfLE {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) :

    Given F : Set.Iic j ⥤ C, i : J such that hi : i ≤ j, this is the cocone consisting of all maps F.obj ⟨k, hk⟩ ⟶ F.obj ⟨i, hi⟩ for k : J such that k < i.

    Equations
    Instances For
      @[simp]
      theorem CategoryTheory.SmallObject.coconeOfLE_ι_app {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) (i✝ : (Set.Iio i)) :
      (coconeOfLE F hi).ι.app i✝ = F.map (homOfLE )
      @[simp]
      theorem CategoryTheory.SmallObject.coconeOfLE_pt {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) :
      (coconeOfLE F hi).pt = F.obj i, hi
      def CategoryTheory.SmallObject.restrictionLE {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) :
      Functor (↑(Set.Iic i)) C

      The functor Set.Iic i ⥤ C obtained by "restriction" of F : Set.Iic j ⥤ C when i ≤ j.

      Equations
      Instances For
        @[simp]
        theorem CategoryTheory.SmallObject.restrictionLE_obj {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) (k : J) (hk : k i) :
        (restrictionLE F hi).obj k, hk = F.obj k,
        @[simp]
        theorem CategoryTheory.SmallObject.restrictionLE_map {C : Type u} [Category.{v, u} C] {J : Type w} [PartialOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {i : J} (hi : i j) {k₁ k₂ : (Set.Iic i)} (φ : k₁ k₂) :
        (restrictionLE F hi).map φ = F.map (homOfLE )

        A successor structure on a category consists of the data of an object succ X for any X : C, a map toSucc X : X ⟶ toSucc X (which does not need to be natural), and a zeroth object X₀.

        • X₀ : C

          the zeroth object

        • succ (X : C) : C

          the successor of an object

        • toSucc (X : C) : X self.succ X

          the map to the successor

        Instances For

          Given a functor Φ : C ⥤ C, a natural transformation of the form 𝟭 C ⟶ Φ induces a successor structure on C ⥤ C.

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

            The class of morphisms that are of the form toSucc X : X ⟶ succ X.

            Equations
            Instances For

              The map Φ.toSucc X : X ⟶ Φ.Succ X, as an element in Arrow C.

              Equations
              Instances For
                theorem CategoryTheory.SmallObject.SuccStruct.prop.succ_eq {C : Type u} [Category.{v, u} C] {Φ : SuccStruct C} {X Y : C} {f : X Y} (hf : Φ.prop f) :
                Φ.succ X = Y
                theorem CategoryTheory.SmallObject.SuccStruct.prop.fac {C : Type u} [Category.{v, u} C] {Φ : SuccStruct C} {X Y : C} {f : X Y} (hf : Φ.prop f) :
                theorem CategoryTheory.SmallObject.SuccStruct.prop.fac_assoc {C : Type u} [Category.{v, u} C] {Φ : SuccStruct C} {X Y : C} {f : X Y} (hf : Φ.prop f) {Z : C} (h : Y Z) :
                def CategoryTheory.SmallObject.SuccStruct.prop.arrowIso {C : Type u} [Category.{v, u} C] {Φ : SuccStruct C} {X Y : C} {f : X Y} (hf : Φ.prop f) :

                If Φ : SuccStruct C and f is a morphism in C which satisfies Φ.prop f, then this is the isomorphism of arrows between f and Φ.toSuccArrow X.

                Equations
                Instances For
                  @[simp]
                  @[simp]
                  def CategoryTheory.SmallObject.SuccStruct.arrowMap {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) (i₁ i₂ : J) (h₁₂ : i₁ i₂) (h₂ : i₂ j) :

                  Given a functor F : Set.Iic ⥤ C, this is the morphism in C, as an element in Arrow C, that is obtained by applying F.map to an inequality.

                  Equations
                  Instances For
                    @[simp]
                    theorem CategoryTheory.SmallObject.SuccStruct.arrowMap_refl {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) (i : J) (hi : i j) :
                    arrowMap F i i hi = Arrow.mk (CategoryStruct.id (F.obj i, hi))
                    theorem CategoryTheory.SmallObject.SuccStruct.arrowMap_restrictionLE {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) {j' : J} (hj' : j' j) (i₁ i₂ : J) (h₁₂ : i₁ i₂) (h₂ : i₂ j') :
                    arrowMap (restrictionLE F hj') i₁ i₂ h₁₂ h₂ = arrowMap F i₁ i₂ h₁₂
                    def CategoryTheory.SmallObject.SuccStruct.arrowSucc {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] [SuccOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) (i : J) (hi : i < j) :

                    Given a functor F : Set.Iic j ⥤ C and i : J such that i < j, this is the arrow F.obj ⟨i, _⟩ ⟶ F.obj ⟨Order.succ i, _⟩.

                    Equations
                    Instances For
                      theorem CategoryTheory.SmallObject.SuccStruct.arrowSucc_def {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] [SuccOrder J] {j : J} (F : Functor (↑(Set.Iic j)) C) (i : J) (hi : i < j) :
                      arrowSucc F i hi = arrowMap F i (Order.succ i)
                      noncomputable def CategoryTheory.SmallObject.SuccStruct.arrowι {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] [Limits.HasIterationOfShape J C] {i : J} (F : Functor (↑(Set.Iio i)) C) (hi : Order.IsSuccLimit i) (k : J) (hk : k < i) :

                      Given F : Set.Iio i ⥤ C, with i a limit element, and k such that hk : k < i, this is the map colimit.ι F ⟨k, hk⟩, as an element in Arrow C.

                      Equations
                      Instances For
                        theorem CategoryTheory.SmallObject.SuccStruct.arrowι_def {C : Type u} [Category.{v, u} C] {J : Type w} [LinearOrder J] [Limits.HasIterationOfShape J C] {i : J} (F : Functor (↑(Set.Iio i)) C) (hi : Order.IsSuccLimit i) (k : J) (hk : k < i) :
                        arrowι F hi k hk = Arrow.mk (Limits.colimit.ι F k, hk)

                        The category of jth iterations of a successor structure Φ : SuccStruct C. An object consists of the data of all iterations of Φ for i : J such that i ≤ j (this is the field F). Such objects are equipped with data and properties which characterizes uniquely the iterations on three types of elements: , successors, limit elements.

                        Instances For
                          theorem CategoryTheory.SmallObject.SuccStruct.Iteration.ext {C : Type u} {inst✝ : Category.{v, u} C} {J : Type w} {Φ : SuccStruct C} {inst✝¹ : LinearOrder J} {inst✝² : SuccOrder J} {inst✝³ : OrderBot J} {inst✝⁴ : Limits.HasIterationOfShape J C} {inst✝⁵ : WellFoundedLT J} {j : J} {x y : Φ.Iteration j} (F : x.F = y.F) :
                          x = y
                          theorem CategoryTheory.SmallObject.SuccStruct.Iteration.obj_succ {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) (i : J) (hi : i < j) :
                          iter.F.obj Order.succ i, = Φ.succ (iter.F.obj i, )
                          theorem CategoryTheory.SmallObject.SuccStruct.Iteration.prop_map_succ {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) (i : J) (hi : i < j) :
                          Φ.prop (iter.F.map (homOfLE ))
                          theorem CategoryTheory.SmallObject.SuccStruct.Iteration.obj_limit {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) (i : J) (hi : Order.IsSuccLimit i) (hij : i j) :
                          iter.F.obj i, hij = Limits.colimit (restrictionLT iter.F hij)
                          noncomputable def CategoryTheory.SmallObject.SuccStruct.Iteration.isColimit {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) (i : J) (hi : Order.IsSuccLimit i) (hij : i j) :

                          The iteration on a limit element identifies to the colimit of the value on smaller elements.

                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            def CategoryTheory.SmallObject.SuccStruct.Iteration.trunc {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) {j' : J} (hj' : j' j) :
                            Φ.Iteration j'

                            The element in Φ.Iteration i that is deduced from an element in Φ.Iteration j when i ≤ j.

                            Equations
                            Instances For
                              @[simp]
                              theorem CategoryTheory.SmallObject.SuccStruct.Iteration.trunc_F {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) {j' : J} (hj' : j' j) :
                              (iter.trunc hj').F = restrictionLE iter.F hj'
                              def CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.MapEq {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} (F G : Functor (↑(Set.Iic x)) C) (k₁ k₂ : K) (h₁₂ : k₁ k₂) (h₂ : k₂ x) :

                              Auxiliary definition for the proof of Subsingleton (Φ.Iteration j).

                              Equations
                              • One or more equations did not get rendered due to their size.
                              Instances For
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.MapEq.src {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} (F G : Functor (↑(Set.Iic x)) C) {k₁ k₂ : K} {h₁₂ : k₁ k₂} {h₂ : k₂ x} (h : MapEq F G k₁ k₂ h₁₂ h₂) :
                                F.obj k₁, = G.obj k₁,
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.MapEq.tgt {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} (F G : Functor (↑(Set.Iic x)) C) {k₁ k₂ : K} {h₁₂ : k₁ k₂} {h₂ : k₂ x} (h : MapEq F G k₁ k₂ h₁₂ h₂) :
                                F.obj k₂, h₂ = G.obj k₂, h₂
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.MapEq.w {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} (F G : Functor (↑(Set.Iic x)) C) {k₁ k₂ : K} {h₁₂ : k₁ k₂} {h₂ : k₂ x} (h : MapEq F G k₁ k₂ h₁₂ h₂) :
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.mapEq_refl {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} {F G : Functor (↑(Set.Iic x)) C} (k : K) (hk : k x) (h : F.obj k, hk = G.obj k, hk) :
                                MapEq F G k k hk
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.mapEq_trans {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} {F G : Functor (↑(Set.Iic x)) C} {i₁ i₂ i₃ : K} (h₁₂ : i₁ i₂) (h₂₃ : i₂ i₃) {h₃ : i₃ x} (m₁₂ : MapEq F G i₁ i₂ h₁₂ ) (m₂₃ : MapEq F G i₂ i₃ h₂₃ h₃) :
                                MapEq F G i₁ i₃ h₃
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.subsingleton.ext {C : Type u} [Category.{v, u} C] {K : Type w} [LinearOrder K] {x : K} {F G : Functor (↑(Set.Iic x)) C} (h : ∀ (k₁ k₂ : K) (h₁₂ : k₁ k₂) (h₂ : k₂ x), MapEq F G k₁ k₂ h₁₂ h₂) :
                                F = G
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.congr_obj {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) (k : J) (h₁ : k j₁) (h₂ : k j₂) :
                                iter₁.F.obj k, h₁ = iter₂.F.obj k, h₂
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.congr_arrowMap {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) {k₁ k₂ : J} (h : k₁ k₂) (h₁ : k₂ j₁) (h₂ : k₂ j₂) :
                                arrowMap iter₁.F k₁ k₂ h h₁ = arrowMap iter₂.F k₁ k₂ h h₂
                                theorem CategoryTheory.SmallObject.SuccStruct.Iteration.congr_map {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) {k₁ k₂ : J} (h : k₁ k₂) (h₁ : k₂ j₁) (h₂ : k₂ j₂) :
                                iter₁.F.map (homOfLE h) = CategoryStruct.comp (eqToHom ) (CategoryStruct.comp (iter₂.F.map (homOfLE h)) (eqToHom ))
                                def CategoryTheory.SmallObject.SuccStruct.Iteration.mapObj {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) {k₁ k₂ : J} (h₁₂ : k₁ k₂) (h₁ : k₁ j₁) (h₂ : k₂ j₂) (hj : j₁ j₂) :
                                iter₁.F.obj k₁, h₁ iter₂.F.obj k₂, h₂

                                Given iter₁ : Φ.Iteration j₁ and iter₂ : Φ.Iteration j₂, with j₁ ≤ j₂, if k₁ ≤ k₂ are elements such that k₁ ≤ j₁ and k₂ ≤ k₂, then this is the canonical map iter₁.F.obj ⟨k₁, h₁⟩ ⟶ iter₂.F.obj ⟨k₂, h₂⟩.

                                Equations
                                Instances For
                                  theorem CategoryTheory.SmallObject.SuccStruct.Iteration.arrow_mk_mapObj {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) {k₁ k₂ : J} (h₁₂ : k₁ k₂) (h₁ : k₁ j₁) (h₂ : k₂ j₂) (hj : j₁ j₂) :
                                  Arrow.mk (iter₁.mapObj iter₂ h₁₂ h₁ h₂ hj) = arrowMap iter₂.F k₁ k₂ h₁₂ h₂
                                  @[simp]
                                  theorem CategoryTheory.SmallObject.SuccStruct.Iteration.mapObj_refl {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j : J} (iter : Φ.Iteration j) {k l : J} (h : k l) (h' : l j) :
                                  iter.mapObj iter h h' = iter.F.map (homOfLE h)
                                  @[simp]
                                  theorem CategoryTheory.SmallObject.SuccStruct.Iteration.mapObj_trans {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ j₃ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) (iter₃ : Φ.Iteration j₃) {k₁ k₂ k₃ : J} (h₁₂ : k₁ k₂) (h₂₃ : k₂ k₃) (h₁ : k₁ j₁) (h₂ : k₂ j₂) (h₃ : k₃ j₃) (h₁₂' : j₁ j₂) (h₂₃' : j₂ j₃) :
                                  CategoryStruct.comp (iter₁.mapObj iter₂ h₁₂ h₁ h₂ h₁₂') (iter₂.mapObj iter₃ h₂₃ h₂ h₃ h₂₃') = iter₁.mapObj iter₃ h₁ h₃
                                  @[simp]
                                  theorem CategoryTheory.SmallObject.SuccStruct.Iteration.mapObj_trans_assoc {C : Type u} [Category.{v, u} C] {J : Type w} {Φ : SuccStruct C} [LinearOrder J] [SuccOrder J] [OrderBot J] [Limits.HasIterationOfShape J C] [WellFoundedLT J] {j₁ j₂ j₃ : J} (iter₁ : Φ.Iteration j₁) (iter₂ : Φ.Iteration j₂) (iter₃ : Φ.Iteration j₃) {k₁ k₂ k₃ : J} (h₁₂ : k₁ k₂) (h₂₃ : k₂ k₃) (h₁ : k₁ j₁) (h₂ : k₂ j₂) (h₃ : k₃ j₃) (h₁₂' : j₁ j₂) (h₂₃' : j₂ j₃) {Z : C} (h : iter₃.F.obj k₃, h₃ Z) :
                                  CategoryStruct.comp (iter₁.mapObj iter₂ h₁₂ h₁ h₂ h₁₂') (CategoryStruct.comp (iter₂.mapObj iter₃ h₂₃ h₂ h₃ h₂₃') h) = CategoryStruct.comp (iter₁.mapObj iter₃ h₁ h₃ ) h