Documentation

DerivedAlgGeo.Algebra.Homology.DGCategory.Pretriangulated.H0.NaturalTransformationCone

The triangle of H⁰ attached to a closed dg natural transformation #

HomogeneousNatTrans.ConeData chooses a dg cone of every component of a closed degree-zero dg natural transformation α : F ⟶ G. Each choice gives a distinguished triangle of H⁰ D,

F X ⟶ G X ⟶ Cone(α) X ⟶ (F X)⟦1⟧,

and this file says those triangles are functorial in X.

Why this is not automatic #

The three vertices are functorial separately: F.h0, G.h0 and ConeData.functor.h0 are ordinary functors H⁰ C ⥤ H⁰ D. What has to be supplied is that a morphism of H⁰ C induces a morphism of triangles, and the third square of a triangle morphism involves the connecting map and the chosen shift of H⁰ D. That square is the one IsConeOf.Morphism was built to carry, so the work here is to produce a cone morphism from a cocycle of C and hand it to IsConeOf.Morphism.toTriangleMorphism.

Producing it needs three naturality statements that already exist and no new computation:

The homotopy class, not the representative #

A morphism of H⁰ C is a homotopy class and a cone morphism needs an actual cocycle, so different representatives give different cone morphisms. The triangle morphism they produce is nevertheless the same, because its three components are F.h0.map f, G.h0.map f and ConeData.functor.h0.map f, all of which depend only on the class. That is why the functor below is defined with those three components and only its three commuting squares are proved by choosing a representative.

Naturality in the transformation, and its hypothesis #

A strictly commuting square of closed degree-zero dg natural transformations between two cone situations induces a natural transformation of triangle functors (triangleNatTrans). Strictness is the hypothesis that makes this work and it is not cosmetic: with a zero homotopy every cone map in sight is a strict lift, so homogeneousLift_strict_comp collapses each composite to a single lift and the two agree because u and v are natural at degree zero. The cone lifts are therefore natural on the nose, not merely up to homotopy, which is functor_map_comp_lift.

When both endpoint maps are isomorphisms in the closed degree-zero dg-functor category, triangleIsoOfStrictSquare upgrades this natural transformation to a natural isomorphism. Its first two components are the H⁰ images of the endpoint isomorphisms, and its third is the H⁰ image of the canonical dg cone-functor isomorphism ConeData.isoOfStrictSquare.

The homotopy-coherent version is open. With a nonzero homotopy the two composite lifts carry different homotopies, and identifying them needs uniqueness of the lift up to homotopy, which this repository does not have.

The cone choices do not matter #

ConeData is a choice of cone at every object, and compareIso says the triangle functor does not depend on it: two choices give canonically isomorphic functors. The comparison is the identity case of the naturality above, since two ConeData for the same α are related by the identity square, and compareNatTrans_self and compareNatTrans_comp are what make it an isomorphism rather than merely a map.

What this does not give #

No comparison is made from a merely homotopy-commuting square, and no statement says that triangleFunctor is triangulated or exact in any sense. The generic strict-square interface is specialized to object twists in H0/ObjectTwist; autoequivalence and sphericality remain separate questions.

noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.coneMorphism {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) {X Y : C} (f : ↥(cocycles X Y)) :
(K.isCone X).Morphism (K.isCone Y) ((F.map 0) ↑f) ((G.map 0) ↑f)

The dg cone morphism a degree-zero cocycle of C induces.

The homotopy is zero: graded naturality of α at degree zero carries the sign (-1)^(0 * 0) = +1, so the square on the first two vertices commutes on the nose. The other two squares are naturality of ConeData.inr and of ConeData.fst.

Equations
  • One or more equations did not get rendered due to their size.
Instances For
    noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleObj {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) (X : C) :

    The distinguished triangle of H⁰ D at one object.

    Equations
    Instances For
      noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.coneTriangleMorphism {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {X Y : C} (f : ↥(cocycles X Y)) :
      K.triangleObj hα X ⟶ K.triangleObj hα Y

      The triangle morphism a cocycle of C induces between the cone triangles.

      The two cocycles are passed explicitly. toTriangleMorphism takes them as implicit arguments constrained only through IsConeOf, so leaving them to unification asks Lean to solve ?f.val =?= app α X for a subtype element, and it does not terminate.

      Equations
      Instances For

        The cone triangles are functorial.

        The three components are the three induced functors on H⁰, so functoriality is theirs; only the three commuting squares need a representative.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[simp]
          theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleFunctor_obj {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) (X : H0 C) :
          (K.triangleFunctor hα).obj X = K.triangleObj hα (H0.of C X)
          @[simp]
          theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleFunctor_map_hom₁ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {X Y : H0 C} (f : X ⟶ Y) :
          ((K.triangleFunctor hα).map f).hom₁ = F.h0.map f
          @[simp]
          theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleFunctor_map_hom₂ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {X Y : H0 C} (f : X ⟶ Y) :
          ((K.triangleFunctor hα).map f).hom₂ = G.h0.map f
          @[simp]
          theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleFunctor_map_hom₃ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {X Y : H0 C} (f : X ⟶ Y) :

          Every value of the triangle functor is a distinguished triangle.

          Naturality in the transformation #

          noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.squareAt {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : C) :
          DGCategory.HomotopySquare (app α X) (app α' X) (app u X) (app v X)

          A strictly commuting square of closed degree-zero dg natural transformations, read at one object. The homotopy is zero, which is what makes the whole naturality statement below strict rather than up to homotopy.

          Equations
          Instances For
            noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.squareConeMorphism {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : C) :
            (K.isCone X).Morphism (K'.isCone X) (app u X) (app v X)

            The cone morphism the square induces at one object: the standard dg lift, with zero homotopy.

            Equations
            • One or more equations did not get rendered due to their size.
            Instances For
              noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.squareTriangleMorphism {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') (hα' : IsClosed α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : C) :
              K.triangleObj hα X ⟶ K'.triangleObj hα' X

              The triangle morphism the square induces at one object.

              The two cocycles are passed explicitly for the same reason as in coneTriangleMorphism: left to unification they do not resolve.

              Equations
              Instances For
                theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.functor_map_comp_lift {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') {X Y : C} (f : ↑((DGCategoryStruct.dgHom X Y).X 0)) :
                ((DGCategoryStruct.dgComp 0 0 0 ⋯) ((K.functor.map 0) f)) ↑(K.squareConeMorphism K' hu hv hsq Y).hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑(K.squareConeMorphism K' hu hv hsq X).hom) ((K'.functor.map 0) f)

                The cone lifts are natural, on the nose.

                Both composites are a composite of two strict lifts, so homogeneousLift_strict_comp rewrites each to a single strict lift, and the two agree because u and v are natural at degree zero, where the Koszul sign is +1. Nothing here is up to homotopy: that is what the square being strict buys.

                @[simp]
                theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.squareTriangleMorphism_hom₁ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') (hα' : IsClosed α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : C) :
                (K.squareTriangleMorphism hα K' hα' hu hv hsq X).hom₁ = H0.homMk ⟨app u X, ⋯⟩
                @[simp]
                theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.squareTriangleMorphism_hom₂ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') (hα' : IsClosed α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : C) :
                (K.squareTriangleMorphism hα K' hα' hu hv hsq X).hom₂ = H0.homMk ⟨app v X, ⋯⟩
                @[simp]
                theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.squareTriangleMorphism_hom₃ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') (hα' : IsClosed α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : C) :
                (K.squareTriangleMorphism hα K' hα' hu hv hsq X).hom₃ = H0.homMk (K.squareConeMorphism K' hu hv hsq X).hom
                noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleNatTrans {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') (hα' : IsClosed α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') :

                The triangle functors are natural in the transformation.

                A strictly commuting square of closed degree-zero dg natural transformations induces a natural transformation of triangle functors. The first two components are naturality of u and v on H⁰; the third is functor_map_comp_lift.

                Every step goes through the component lemmas rather than through exact on the assembled triangle morphisms. The assembled terms unfold to the chosen cones and the chosen shift, and the defeq check does not terminate.

                Equations
                Instances For
                  @[simp]
                  theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleNatTrans_app {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (K : ConeData α) (hα : IsClosed α) {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K' : ConeData α') (hα' : IsClosed α') {u : ↥(F.HomogeneousNatTrans F' 0)} {v : ↥(G.HomogeneousNatTrans G' 0)} (hu : IsClosed u) (hv : IsClosed v) (hsq : ((composition F G G' 0 0 0 ⋯) α) v = ((composition F F' G' 0 0 0 ⋯) u) α') (X : H0 C) :
                  (K.triangleNatTrans hα K' hα' hu hv hsq).app X = K.squareTriangleMorphism hα K' hα' hu hv hsq (H0.of C X)

                  Isomorphisms induced by strict isomorphism squares #

                  noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleIsoOfStrictSquare {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K : ConeData α) (hα : IsClosed α) (K' : ConeData α') (hα' : IsClosed α') (eF : (have this := F; this) ≅ have this := F'; this) (eG : (have this := G; this) ≅ have this := G'; this) (hsq : ((composition F G G' 0 0 0 ⋯) α) ↑eG.hom = ((composition F F' G' 0 0 0 ⋯) ↑eF.hom) α') :

                  A strict square of closed dg natural transformations whose two endpoint maps are isomorphisms induces a natural isomorphism of their cone triangle functors. Its third component is the H⁰ image of the dg cone-functor isomorphism ConeData.isoOfStrictSquare.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    @[simp]
                    theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleIsoOfStrictSquare_hom_app {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K : ConeData α) (hα : IsClosed α) (K' : ConeData α') (hα' : IsClosed α') (eF : (have this := F; this) ≅ have this := F'; this) (eG : (have this := G; this) ≅ have this := G'; this) (hsq : ((composition F G G' 0 0 0 ⋯) α) ↑eG.hom = ((composition F F' G' 0 0 0 ⋯) ↑eF.hom) α') (X : H0 C) :
                    (K.triangleIsoOfStrictSquare hα K' hα' eF eG hsq).hom.app X = K.squareTriangleMorphism hα K' hα' ⋯ ⋯ hsq (H0.of C X)
                    @[simp]
                    theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleIsoOfStrictSquare_hom_app_hom₁ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K : ConeData α) (hα : IsClosed α) (K' : ConeData α') (hα' : IsClosed α') (eF : (have this := F; this) ≅ have this := F'; this) (eG : (have this := G; this) ≅ have this := G'; this) (hsq : ((composition F G G' 0 0 0 ⋯) α) ↑eG.hom = ((composition F F' G' 0 0 0 ⋯) ↑eF.hom) α') (X : H0 C) :
                    ((K.triangleIsoOfStrictSquare hα K' hα' eF eG hsq).hom.app X).hom₁ = (h0Iso eF).hom.app X
                    @[simp]
                    theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleIsoOfStrictSquare_hom_app_hom₂ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K : ConeData α) (hα : IsClosed α) (K' : ConeData α') (hα' : IsClosed α') (eF : (have this := F; this) ≅ have this := F'; this) (eG : (have this := G; this) ≅ have this := G'; this) (hsq : ((composition F G G' 0 0 0 ⋯) α) ↑eG.hom = ((composition F F' G' 0 0 0 ⋯) ↑eF.hom) α') (X : H0 C) :
                    ((K.triangleIsoOfStrictSquare hα K' hα' eF eG hsq).hom.app X).hom₂ = (h0Iso eG).hom.app X
                    theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.triangleIsoOfStrictSquare_hom_app_hom₃ {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} {F' G' : DGFunctor C D} {α' : ↥(F'.HomogeneousNatTrans G' 0)} (K : ConeData α) (hα : IsClosed α) (K' : ConeData α') (hα' : IsClosed α') (eF : (have this := F; this) ≅ have this := F'; this) (eG : (have this := G; this) ≅ have this := G'; this) (hsq : ((composition F G G' 0 0 0 ⋯) α) ↑eG.hom = ((composition F F' G' 0 0 0 ⋯) ↑eF.hom) α') (X : H0 C) :
                    ((K.triangleIsoOfStrictSquare hα K' hα' eF eG hsq).hom.app X).hom₃ = (h0Iso (K.isoOfStrictSquare K' eF eG hsq)).hom.app X

                    Independence of the chosen cones #

                    noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.compareCone {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (L M : ConeData α) (X : C) :
                    ↑((DGCategoryStruct.dgHom (L.obj X) (M.obj X)).X 0)

                    The comparison map between two chosen cones of the same component: the strict lift of the two identities.

                    Equations
                    Instances For
                      theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.compareCone_comp {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (L M N : ConeData α) (X : C) :
                      ((DGCategoryStruct.dgComp 0 0 0 ⋯) (L.compareCone M X)) (M.compareCone N X) = L.compareCone N X

                      The comparison maps compose. Both sides are strict lifts, so homogeneousLift_strict_comp applies and the two identities compose to one.

                      theorem CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.id_square {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} :
                      ((composition F G G 0 0 0 ⋯) α) (id G) = ((composition F F G 0 0 0 ⋯) (id F)) α

                      The identity square relating a cone situation to itself. Both composites are α, by the two unit laws of the dg category of dg functors.

                      The triangle functor does not depend on the chosen cones.

                      Two ConeData for the same transformation are related by the identity square, so triangleNatTrans applies with u and v the identities. The transformation it produces is the objectwise comparison of cones.

                      Equations
                      Instances For
                        @[simp]

                        Comparing a cone choice with itself is the identity.

                        The comparisons compose.

                        noncomputable def CategoryTheory.DGFunctor.HomogeneousNatTrans.ConeData.compareIso {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] [IsPretriangulated D] {F G : DGFunctor C D} {α : ↥(F.HomogeneousNatTrans G 0)} (hα : IsClosed α) (L M : ConeData α) :

                        The triangle functors of two cone choices are canonically isomorphic.

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