Documentation

DerivedAlgGeo.Algebra.Homology.DGCategory.Pretriangulated.Lift

Lifting a square to a map of cones #

dg-enhancements-e6. complete_distinguished_triangle_morphism asks that a commuting square between the first two vertices of two distinguished triangles extend to the third. For cone triangles the extension is written down against the splitting, and this file writes it down.

The homotopy is the whole difficulty #

If the square commuted on the nose the obvious candidate fst₁ ≫ (a ≫ inl₂) + snd₁ ≫ (b ≫ inr₂) would already be closed. It does not: the square commutes in H⁰, which means only that f₁ ≫ b - a ≫ f₂ is a coboundary, and the candidate's differential is exactly that difference pushed into the cone. So the homotopy k witnessing it is added to the map, as a third term fst₁ ≫ (k ≫ inr₂), and the two contributions cancel.

That is the axiom's actual content, and it is why the lift is not unique: a different k gives a different c, homotopic but not equal.

One owner for the lift #

Everything here is the degree-zero case of Pretriangulated.HomogeneousLift. HomotopySquare is a HomogeneousSquare of degree zero whose vertical maps are closed, lift is homogeneousLift 0, and closedness of the lift is homogeneousLift_d read at degree zero. No sign is computed twice.

Both squares are strict #

Once c exists, neither square needs a homotopy. inr₁ ≫ c = b ≫ inr₂ because inr₁ is orthogonal to fst₁ and a section of snd₁, so the k-term and the a-term both vanish. And c ≫ fst₂ = fst₁ ≫ a because inl₂ ≫ fst₂ is the identity while inr₂ ≫ fst₂ is zero, which kills the b- and k-terms.

The second square is stated on the cone projection fst, not on the connecting morphism into a chosen shift: it needs no shift witness, so cone morphisms compose without choosing one, and the connecting-morphism form Morphism.toShift_comm is a consequence for every witness at once.

structure CategoryTheory.DGCategory.HomotopySquare {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} (f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)) (f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) extends CategoryTheory.DGCategory.HomogeneousSquare f₁ f₂ 0 a b :

A degree-zero square between closed dg morphisms together with a chosen degree-minus-one homotopy witnessing its commutativity in H⁰: a HomogeneousSquare of degree zero whose vertical maps are closed.

This is the canonical input to cone functoriality. In particular, the homotopy is stored as data rather than merely asserted to exist, so cone maps can be constructed and composed without making a fresh choice.

Instances For
    theorem CategoryTheory.DGCategory.HomotopySquare.boundary {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (s : HomotopySquare f₁ f₂ a b) :
    (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ Y₂).d (-1) 0)) s.homotopy = ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b - ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂

    The boundary equation of a degree-zero homotopy, with the trivial Koszul sign (-1)^0 removed: δ k = f₁ ≫ b - a ≫ f₂.

    def CategoryTheory.DGCategory.HomotopySquare.ofBoundary {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (ha : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ X₂).d 0 1)) a = 0) (hb : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom Y₁ Y₂).d 0 1)) b = 0) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) (hk : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ Y₂).d (-1) 0)) k = ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b - ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂) :
    HomotopySquare f₁ f₂ a b

    Build a homotopy square from closed vertical maps and the unsigned boundary equation.

    Equations
    Instances For
      @[simp]
      theorem CategoryTheory.DGCategory.HomotopySquare.ofBoundary_homotopy {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (ha : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ X₂).d 0 1)) a = 0) (hb : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom Y₁ Y₂).d 0 1)) b = 0) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) (hk : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ Y₂).d (-1) 0)) k = ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b - ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂) :
      (ofBoundary ha hb k hk).homotopy = k
      def CategoryTheory.DGCategory.HomotopySquare.strict {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (ha : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ X₂).d 0 1)) a = 0) (hb : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom Y₁ Y₂).d 0 1)) b = 0) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b = ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂) :
      HomotopySquare f₁ f₂ a b

      A strictly commuting square of closed degree-zero morphisms, regarded as a homotopy square with zero homotopy.

      Equations
      Instances For
        @[simp]
        theorem CategoryTheory.DGCategory.HomotopySquare.strict_homotopy {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (ha : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ X₂).d 0 1)) a = 0) (hb : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom Y₁ Y₂).d 0 1)) b = 0) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b = ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂) :
        (strict ha hb hsq).homotopy = 0
        theorem CategoryTheory.DGCategory.HomotopySquare.ext {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {s t : HomotopySquare f₁ f₂ a b} (h : s.homotopy = t.homotopy) :
        s = t

        Two homotopy squares with the same chosen homotopy are equal. Closedness and the boundary equation are propositions, so the degree-minus-one element is the only additional data once the four boundary morphisms are fixed.

        theorem CategoryTheory.DGCategory.HomotopySquare.ext_iff {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {s t : HomotopySquare f₁ f₂ a b} :
        @[simp]
        def CategoryTheory.DGCategory.HomotopySquare.comp {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {X₃ Y₃ : C} {f₃ : ↑((DGCategoryStruct.dgHom X₃ Y₃).X 0)} {a₂ : ↑((DGCategoryStruct.dgHom X₂ X₃).X 0)} {b₂ : ↑((DGCategoryStruct.dgHom Y₂ Y₃).X 0)} (s₁ : HomotopySquare f₁ f₂ a b) (s₂ : HomotopySquare f₂ f₃ a₂ b₂) :
        HomotopySquare f₁ f₃ (((DGCategoryStruct.dgComp 0 0 0 ⋯) a) a₂) (((DGCategoryStruct.dgComp 0 0 0 ⋯) b) b₂)

        Composition of chosen homotopy squares. The composite homotopy is the standard sum k₁ ≫ b₂ + a₁ ≫ k₂; unlike an existential commutativity proof, this operation retains the witness needed by the induced cone map.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          @[simp]
          theorem CategoryTheory.DGCategory.HomotopySquare.comp_homotopy {C : Type u} [DGCategory C] {X₁ Y₁ X₂ Y₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {X₃ Y₃ : C} {f₃ : ↑((DGCategoryStruct.dgHom X₃ Y₃).X 0)} {a₂ : ↑((DGCategoryStruct.dgHom X₂ X₃).X 0)} {b₂ : ↑((DGCategoryStruct.dgHom Y₂ Y₃).X 0)} (s₁ : HomotopySquare f₁ f₂ a b) (s₂ : HomotopySquare f₂ f₃ a₂ b₂) :
          (s₁.comp s₂).homotopy = ((DGCategoryStruct.dgComp (-1) 0 (-1) ⋯) s₁.homotopy) b₂ + ((DGCategoryStruct.dgComp 0 (-1) (-1) ⋯) a) s₂.homotopy
          structure CategoryTheory.IsConeOf.Morphism {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) :

          A cone morphism keeps the dg representative and the strict identities that make it useful downstream. In particular, this is stronger data than a morphism between the corresponding triangles in H⁰: the representative is closed before passing to the quotient, and both cone squares are retained on the nose.

          Instances For
            theorem CategoryTheory.IsConeOf.Morphism.a_closed {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (m : hc₁.Morphism hc₂ a b) :

            The closedness of the first component, projected from the canonical homotopy-square input.

            theorem CategoryTheory.IsConeOf.Morphism.b_closed {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (m : hc₁.Morphism hc₂ a b) :

            The closedness of the second component, projected from the canonical homotopy-square input.

            def CategoryTheory.IsConeOf.Morphism.homotopy {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (m : hc₁.Morphism hc₂ a b) :
            ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))

            The chosen degree-minus-one homotopy underlying a cone morphism.

            Equations
            Instances For
              theorem CategoryTheory.IsConeOf.Morphism.homotopy_boundary {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (m : hc₁.Morphism hc₂ a b) :
              (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ Y₂).d (-1) 0)) m.homotopy = ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b - ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂

              The boundary equation for the chosen homotopy underlying a cone morphism.

              theorem CategoryTheory.IsConeOf.Morphism.ext {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {m n : hc₁.Morphism hc₂ a b} (hs : m.square = n.square) (hc : m.hom = n.hom) :
              m = n

              A cone morphism is determined by its chosen homotopy square and its closed map between cone objects. The two strict compatibility fields are propositions.

              theorem CategoryTheory.IsConeOf.Morphism.ext_iff {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {m n : hc₁.Morphism hc₂ a b} :
              m = n ↔ m.square = n.square ∧ m.hom = n.hom
              theorem CategoryTheory.IsConeOf.Morphism.toShift_comm {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} {hc₁ : IsConeOf f₁ Z₁} {hc₂ : IsConeOf f₂ Z₂} {a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} (m : hc₁.Morphism hc₂ a b) {X₁' X₂' : C} (s₁ : IsShiftBy X₁ 1 X₁') (s₂ : IsShiftBy X₂ 1 X₂') :
              ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑m.hom) (hc₂.toShift s₂) = ((DGCategoryStruct.dgComp 0 0 0 ⋯) (hc₁.toShift s₁)) (s₁.mapShift s₂ a)

              The connecting-morphism square, at every chosen shift. toShift is fst followed by the shift's element and mapShift is conjugation by the two shift witnesses, so the fst square gives the connecting square once s₁.hom ≫ s₁.inv cancels.

              noncomputable def CategoryTheory.IsConeOf.lift {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) :
              ↑((DGCategoryStruct.dgHom Z₁ Z₂).X 0)

              The lift of a square to the cones, with the homotopy folded in: the degree-zero case of homogeneousLift.

              Equations
              Instances For
                theorem CategoryTheory.IsConeOf.inr_comp_lift {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) :
                ((DGCategoryStruct.dgComp 0 0 0 ⋯) hc₁.inr) (hc₁.lift hc₂ a b k) = ((DGCategoryStruct.dgComp 0 0 0 ⋯) b) hc₂.inr

                The first square, strictly. inr₁ ≫ fst₁ = 0 kills the first and third terms, and inr₁ ≫ snd₁ = dgId leaves the second.

                theorem CategoryTheory.IsConeOf.lift_comp_fst {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) :
                ((DGCategoryStruct.dgComp 0 1 1 ⋯) (hc₁.lift hc₂ a b k)) hc₂.fst = ((DGCategoryStruct.dgComp 1 0 1 ⋯) hc₁.fst) a

                The second square, strictly. inr₂ ≫ fst₂ = 0 kills the b- and k-terms and inl₂ ≫ fst₂ = dgId collapses the a-term.

                theorem CategoryTheory.IsConeOf.lift_closed {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) (ha : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ X₂).d 0 1)) a = 0) (hb : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom Y₁ Y₂).d 0 1)) b = 0) (hk : (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X₁ Y₂).d (-1) 0)) k = ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) b - ((DGCategoryStruct.dgComp 0 0 0 ⋯) a) f₂) :
                (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom Z₁ Z₂).d 0 1)) (hc₁.lift hc₂ a b k) = 0

                The lift is closed. homogeneousLift_d at degree zero: the differential of the lift is the lift of δ a and δ b, which vanish.

                noncomputable def CategoryTheory.IsConeOf.liftMorphism {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) (s : DGCategory.HomotopySquare f₁ f₂ a b) :
                hc₁.Morphism hc₂ a b

                The standard dg lift of a chosen homotopy square, packaged as a cone morphism. lift_closed consumes the square's boundary equation, while the two strict square lemmas retain the resulting naturality before passage to H⁰.

                Equations
                Instances For
                  theorem CategoryTheory.IsConeOf.lift_comp_toShift {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) (a : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)) (b : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)) (k : ↑((DGCategoryStruct.dgHom X₁ Y₂).X (-1))) {X₁' X₂' : C} (s₁ : IsShiftBy X₁ 1 X₁') (s₂ : IsShiftBy X₂ 1 X₂') :
                  ((DGCategoryStruct.dgComp 0 0 0 ⋯) (hc₁.lift hc₂ a b k)) (hc₂.toShift s₂) = ((DGCategoryStruct.dgComp 0 0 0 ⋯) (hc₁.toShift s₁)) (s₁.mapShift s₂ a)

                  The connecting-morphism square of the lift, for any two shift witnesses. lift_comp_fst supplies the fst square; the rest is s₁.hom ≫ s₁.inv = 1.

                  The identity cone morphism.

                  Equations
                  Instances For
                    def CategoryTheory.IsConeOf.Morphism.comp {C : Type u} [DGCategory C] {X₁ Y₁ Z₁ X₂ Y₂ Z₂ : C} {f₁ : ↑((DGCategoryStruct.dgHom X₁ Y₁).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom X₂ Y₂).X 0)} (hc₁ : IsConeOf f₁ Z₁) (hc₂ : IsConeOf f₂ Z₂) {X₃ Y₃ Z₃ : C} {f₃ : ↑((DGCategoryStruct.dgHom X₃ Y₃).X 0)} (hc₃ : IsConeOf f₃ Z₃) {a₁ : ↑((DGCategoryStruct.dgHom X₁ X₂).X 0)} {b₁ : ↑((DGCategoryStruct.dgHom Y₁ Y₂).X 0)} {a₂ : ↑((DGCategoryStruct.dgHom X₂ X₃).X 0)} {b₂ : ↑((DGCategoryStruct.dgHom Y₂ Y₃).X 0)} (m₁ : hc₁.Morphism hc₂ a₁ b₁) (m₂ : hc₂.Morphism hc₃ a₂ b₂) :
                    hc₁.Morphism hc₃ (((DGCategoryStruct.dgComp 0 0 0 ⋯) a₁) a₂) (((DGCategoryStruct.dgComp 0 0 0 ⋯) b₁) b₂)

                    Composition of cone morphisms. The underlying degree-zero maps and the homotopies compose strictly, and both cone squares are chased through the middle cone; no shift witness is needed.

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For
                      noncomputable def CategoryTheory.IsConeOf.isoOfStrictSquare {C : Type u} [DGCategory C] {A₁ B₁ T₁ A₂ B₂ T₂ : Z0 C} {f₁ : ↑((DGCategoryStruct.dgHom (Z0.of C A₁) (Z0.of C B₁)).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom (Z0.of C A₂) (Z0.of C B₂)).X 0)} (hc₁ : IsConeOf f₁ (Z0.of C T₁)) (hc₂ : IsConeOf f₂ (Z0.of C T₂)) (eA : A₁ ≅ A₂) (eB : B₁ ≅ B₂) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) ↑eB.hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑eA.hom) f₂) :
                      T₁ ≅ T₂

                      A strict square whose two vertical maps are isomorphisms induces an isomorphism between any chosen cones. The forward and inverse maps are the strict cone lifts of the two endpoint isomorphisms.

                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        @[simp]
                        theorem CategoryTheory.IsConeOf.isoOfStrictSquare_hom_val {C : Type u} [DGCategory C] {A₁ B₁ T₁ A₂ B₂ T₂ : Z0 C} {f₁ : ↑((DGCategoryStruct.dgHom (Z0.of C A₁) (Z0.of C B₁)).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom (Z0.of C A₂) (Z0.of C B₂)).X 0)} (hc₁ : IsConeOf f₁ (Z0.of C T₁)) (hc₂ : IsConeOf f₂ (Z0.of C T₂)) (eA : A₁ ≅ A₂) (eB : B₁ ≅ B₂) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) ↑eB.hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑eA.hom) f₂) :
                        ↑(hc₁.isoOfStrictSquare hc₂ eA eB hsq).hom = hc₁.lift hc₂ (↑eA.hom) (↑eB.hom) 0
                        @[simp]
                        theorem CategoryTheory.IsConeOf.isoOfStrictSquare_inv_val {C : Type u} [DGCategory C] {A₁ B₁ T₁ A₂ B₂ T₂ : Z0 C} {f₁ : ↑((DGCategoryStruct.dgHom (Z0.of C A₁) (Z0.of C B₁)).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom (Z0.of C A₂) (Z0.of C B₂)).X 0)} (hc₁ : IsConeOf f₁ (Z0.of C T₁)) (hc₂ : IsConeOf f₂ (Z0.of C T₂)) (eA : A₁ ≅ A₂) (eB : B₁ ≅ B₂) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) ↑eB.hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑eA.hom) f₂) :
                        ↑(hc₁.isoOfStrictSquare hc₂ eA eB hsq).inv = hc₂.lift hc₁ (↑eA.inv) (↑eB.inv) 0
                        theorem CategoryTheory.IsConeOf.inr_comp_isoOfStrictSquare_hom {C : Type u} [DGCategory C] {A₁ B₁ T₁ A₂ B₂ T₂ : Z0 C} {f₁ : ↑((DGCategoryStruct.dgHom (Z0.of C A₁) (Z0.of C B₁)).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom (Z0.of C A₂) (Z0.of C B₂)).X 0)} (hc₁ : IsConeOf f₁ (Z0.of C T₁)) (hc₂ : IsConeOf f₂ (Z0.of C T₂)) (eA : A₁ ≅ A₂) (eB : B₁ ≅ B₂) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) ↑eB.hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑eA.hom) f₂) :
                        ((DGCategoryStruct.dgComp 0 0 0 ⋯) hc₁.inr) ↑(hc₁.isoOfStrictSquare hc₂ eA eB hsq).hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑eB.hom) hc₂.inr

                        The cone isomorphism strictly commutes with the target inclusions.

                        theorem CategoryTheory.IsConeOf.isoOfStrictSquare_hom_comp_fst {C : Type u} [DGCategory C] {A₁ B₁ T₁ A₂ B₂ T₂ : Z0 C} {f₁ : ↑((DGCategoryStruct.dgHom (Z0.of C A₁) (Z0.of C B₁)).X 0)} {f₂ : ↑((DGCategoryStruct.dgHom (Z0.of C A₂) (Z0.of C B₂)).X 0)} (hc₁ : IsConeOf f₁ (Z0.of C T₁)) (hc₂ : IsConeOf f₂ (Z0.of C T₂)) (eA : A₁ ≅ A₂) (eB : B₁ ≅ B₂) (hsq : ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) ↑eB.hom = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑eA.hom) f₂) :
                        ((DGCategoryStruct.dgComp 0 1 1 ⋯) ↑(hc₁.isoOfStrictSquare hc₂ eA eB hsq).hom) hc₂.fst = ((DGCategoryStruct.dgComp 1 0 1 ⋯) hc₁.fst) ↑eA.hom

                        The cone isomorphism strictly commutes with the source projections.