Documentation

DerivedAlgGeo.Algebra.Homology.DGCategory.H0

Cocycles, coboundaries, and Z⁰ of a dg category #

The degree-zero cocycles of a dg category form an ordinary category on the same objects, and the coboundaries sit inside them as an additive subgroup. H⁰ is the quotient; this file builds everything the quotient needs.

Both halves rest on the Leibniz rule, at three different pairs of degrees:

The last two are what make composition descend to H⁰. They are the reason the Leibniz rule is an axiom of DGCategory rather than a lemma about a special case, and the Const example in DerivedAlgGeo.Algebra.Homology.DGCategory/Instances.lean — whose differential is zero — tests none of them.

The induced functor on H⁰ also carries canonical identity and composition comparisons. Their associativity and two unit laws are recorded here as the ordinary pseudofunctor coherence equations. They are exposed directly because the repository has no bundled bicategory of dg categories on which to install Mathlib's Pseudofunctor; introducing a partial replacement would duplicate that abstraction.

A wrinkle in the degrees #

dgComp_leibniz states the shifted degrees as p + 1, and those are dependent arguments: simp only [zero_add] cannot normalise 0 + 1 to 1 in a goal without breaking the motive. Hypotheses are therefore restated at the shifted degree — they typecheck directly, the degrees being definitionally equal — rather than rewriting the goal.

The degree-zero cocycles from X to Y.

Equations
Instances For

    The degree-zero coboundaries from X to Y.

    Equations
    Instances For
      theorem CategoryTheory.mem_coboundaries_iff {C : Type u} [DGCategory C] {X Y : C} (f : ↑((DGCategoryStruct.dgHom X Y).X 0)) :
      f ∈ coboundaries X Y ↔ ∃ (h : ↑((DGCategoryStruct.dgHom X Y).X (-1))), (AddCommGrpCat.Hom.hom ((DGCategoryStruct.dgHom X Y).d (-1) 0)) h = f

      Every coboundary is a cocycle: this is d ∘ d = 0.

      theorem CategoryTheory.comp_coboundary_mem {C : Type u} [DGCategory C] {X Y Z : C} {f : ↑((DGCategoryStruct.dgHom X Y).X 0)} (hf : f ∈ cocycles X Y) {b : ↑((DGCategoryStruct.dgHom Y Z).X 0)} (hb : b ∈ coboundaries Y Z) :

      A cocycle composed with a coboundary is a coboundary. Leibniz at (0, -1): the δf term vanishes because f is closed, and the sign is +1.

      theorem CategoryTheory.coboundary_comp_mem {C : Type u} [DGCategory C] {X Y Z : C} {b : ↑((DGCategoryStruct.dgHom X Y).X 0)} (hb : b ∈ coboundaries X Y) {g : ↑((DGCategoryStruct.dgHom Y Z).X 0)} (hg : g ∈ cocycles Y Z) :

      A coboundary composed with a cocycle is a coboundary. Leibniz at (-1, 0): the δg term vanishes because g is closed, so the sign never matters.

      def CategoryTheory.Z0 (C : Type u) :

      Objects of Z⁰. A type synonym, so the ordinary category structure does not attach itself to C.

      Equations
      Instances For
        def CategoryTheory.Z0.of (C : Type u) (X : Z0 C) :
        C

        The underlying object of C.

        Equations
        Instances For
          theorem CategoryTheory.Z0.comp_mem {C : Type u} [DGCategory C] {X Y Z : C} {f : ↑((DGCategoryStruct.dgHom X Y).X 0)} (hf : f ∈ cocycles X Y) {g : ↑((DGCategoryStruct.dgHom Y Z).X 0)} (hg : g ∈ cocycles Y Z) :
          ((DGCategoryStruct.dgComp 0 0 0 ⋯) f) g ∈ cocycles X Z

          Composition of cocycles is a cocycle: Leibniz at (0, 0), with both differential terms vanishing.

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

          The two computation rules below are stated through Subtype.val on the ascribed subgroup type: X ⟶ Y in Z0 C is cocycles _ _, but only definitionally, so the anonymous coercion does not fire on the ⟶ form.

          @[simp]
          theorem CategoryTheory.Z0.comp_val {C : Type u} [DGCategory C] {X Y Z : Z0 C} (f : X ⟶ Y) (g : Y ⟶ Z) :
          ↑(CategoryStruct.comp f g) = ((DGCategoryStruct.dgComp 0 0 0 ⋯) ↑f) ↑g
          theorem CategoryTheory.comp_sub_mem {C : Type u} [DGCategory C] {X Y Z : C} {f₁ f₂ : ↑((DGCategoryStruct.dgHom X Y).X 0)} {g₁ g₂ : ↑((DGCategoryStruct.dgHom Y Z).X 0)} (hf₂ : f₂ ∈ cocycles X Y) (hg₁ : g₁ ∈ cocycles Y Z) (hf : f₁ - f₂ ∈ coboundaries X Y) (hg : g₁ - g₂ ∈ coboundaries Y Z) :
          ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₁) g₁ - ((DGCategoryStruct.dgComp 0 0 0 ⋯) f₂) g₂ ∈ coboundaries X Z

          Composition respects cohomology classes. Writing f₁ ∘ g₁ - f₂ ∘ g₂ = (f₁ - f₂) ∘ g₁ + f₂ ∘ (g₁ - g₂) reduces this to the two descent lemmas, one for each summand.

          Only f₂ and g₁ are required to be closed — the split above touches the other two only through the differences, which are already assumed to be coboundaries.

          def CategoryTheory.H0 (C : Type u) :

          Objects of H⁰.

          Equations
          Instances For
            def CategoryTheory.H0.of (C : Type u) (X : H0 C) :
            C

            The underlying object of C.

            Equations
            Instances For
              theorem CategoryTheory.H0.of_self {C : Type u} (X : H0 C) :
              of C X = X

              of is the identity. Not a simp lemma: making it one changes how the quotient's membership goals normalise and breaks the descent proofs above. Pass it explicitly where objects need to be unfolded.

              The coboundaries, viewed inside the cocycles.

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

                H⁰ is preadditive: its Hom-sets are quotients of abelian groups, and composition is biadditive because dgComp is.

                Equations
                def CategoryTheory.H0.homMk {C : Type u} [DGCategory C] {X Y : C} (f : ↥(cocycles X Y)) :
                (have this := X; this) ⟶ have this := Y; this

                The morphism of H⁰ a cocycle represents. Every construction that descends a dg morphism to H⁰ goes through this constructor, and the three computation rules below are what downstream files rewrite with.

                Equations
                Instances For
                  theorem CategoryTheory.H0.homMk_eq_homMk {C : Type u} [DGCategory C] {X Y : C} {a b : ↥(cocycles X Y)} (h : ↑a - ↑b ∈ coboundaries X Y) :

                  Two cocycles represent the same morphism of H⁰ when they differ by a coboundary. The quotient's own eq_iff_sub_mem says so; this restates it on the underlying elements, which is the form every homotopy produces.

                  theorem CategoryTheory.H0.homMk_neg {C : Type u} [DGCategory C] {X Y : C} (a : ↥(cocycles X Y)) :

                  Negation of an H⁰ morphism is negation of a representative.

                  theorem CategoryTheory.H0.homMk_comp {C : Type u} [DGCategory C] {X Y Z : C} (a : ↥(cocycles X Y)) (b : ↥(cocycles Y Z)) :

                  Composition of H⁰ morphisms is dgComp of representatives.

                  theorem CategoryTheory.H0.homMk_id {C : Type u} [DGCategory C] (X : C) :

                  The identity of H⁰ is represented by the dg identity.

                  theorem CategoryTheory.DGFunctor.map_mem_cocycles {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] (F : DGFunctor C D) {X Y : C} {f : ↑((DGCategoryStruct.dgHom X Y).X 0)} (hf : f ∈ cocycles X Y) :
                  (F.map 0) f ∈ cocycles (F.obj X) (F.obj Y)

                  A dg functor sends cocycles to cocycles: it commutes with the differential, and an additive map sends 0 to 0.

                  theorem CategoryTheory.DGFunctor.map_mem_coboundaries {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] (F : DGFunctor C D) {X Y : C} {f : ↑((DGCategoryStruct.dgHom X Y).X 0)} (hf : f ∈ coboundaries X Y) :
                  (F.map 0) f ∈ coboundaries (F.obj X) (F.obj Y)

                  A dg functor sends coboundaries to coboundaries, for the same reason and with no closedness hypothesis: map_d already exhibits the primitive.

                  def CategoryTheory.DGFunctor.h0 {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] (F : DGFunctor C D) :
                  Functor (H0 C) (H0 D)

                  The functor H⁰(F) induced by a dg functor.

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

                    The functor on H⁰ induced by a dg functor is additive.

                    A dg functor's action on a single Hom-complex, packaged as a morphism of cochain complexes. map_d is exactly the commutation square.

                    Equations
                    Instances For

                      A quasi-equivalence of dg categories: the action on every Hom-complex is a quasi-isomorphism, and H⁰ of it is essentially surjective.

                      That a quasi-equivalence induces an equivalence H⁰ C ≌ H⁰ D is DGFunctor.isEquivalence_h0 and DGFunctor.h0Equivalence (DGCategory/QuasiEquivalence.lean), and that this equivalence is triangulated between pretriangulated dg categories is DGFunctor.isTriangulated_h0Equivalence (DGCategory/Pretriangulated/H0/FunctorTransport.lean).

                      • quasiIso (X Y : C) : QuasiIso (F.mapComplex X Y)

                        Every Hom-complex map is a quasi-isomorphism.

                      • essSurj : F.h0.EssSurj

                        H⁰ F hits every object up to isomorphism.

                      Instances For

                        The quotient functor from cocycles to cohomology classes.

                        Equations
                        Instances For

                          Every morphism in H⁰ C has a degree-zero cocycle representative.

                          @[simp]
                          theorem CategoryTheory.DGFunctor.h0_obj {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] (F : DGFunctor C D) (X : H0 C) :
                          F.h0.obj X = F.obj (H0.of C X)

                          The object part of H⁰ F. A simp lemma because otherwise the objects in a naturality square stay in the h0.obj form and Category.comp_id — whose statement mentions the codomain — cannot match.

                          @[simp]
                          theorem CategoryTheory.DGFunctor.h0_map_mk {C : Type u} {D : Type u'} [DGCategory C] [DGCategory D] (F : DGFunctor C D) {X Y : H0 C} (f : ↥(cocycles (H0.of C X) (H0.of C Y))) :
                          F.h0.map ↑f = ↑⟨(F.map 0) ↑f, ⋯⟩

                          How H⁰ F acts on a class: this is the computation rule simp needs before any naturality square involving h0 will close.

                          The identity comparison has literal identity components in both directions.

                          @[simp]

                          The forward component of h0IdIso is the identity. This exposes the computation without requiring consumers to unfold NatIso.ofComponents.

                          @[simp]

                          The inverse component of h0IdIso is the identity. This exposes the computation without requiring consumers to unfold NatIso.ofComponents.

                          def CategoryTheory.DGFunctor.h0CompIso {C : Type u} {D : Type u'} {E : Type u''} [DGCategory C] [DGCategory D] [DGCategory E] (F : DGFunctor C D) (G : DGFunctor D E) :
                          (F.comp G).h0 ≅ F.h0.comp G.h0

                          H⁰ takes composition of dg functors to composition of functors.

                          Equations
                          Instances For
                            @[simp]
                            theorem CategoryTheory.DGFunctor.h0CompIso_hom_app {C : Type u} {D : Type u'} {E : Type u''} [DGCategory C] [DGCategory D] [DGCategory E] (F : DGFunctor C D) (G : DGFunctor D E) (X : H0 C) :

                            The forward component of h0CompIso is the identity. This is the component computation used when descending dg whiskering to H⁰.

                            @[simp]
                            theorem CategoryTheory.DGFunctor.h0CompIso_inv_app {C : Type u} {D : Type u'} {E : Type u''} [DGCategory C] [DGCategory D] [DGCategory E] (F : DGFunctor C D) (G : DGFunctor D E) (X : H0 C) :

                            The inverse component of h0CompIso is the identity. This is the component computation used when descending dg whiskering to H⁰.

                            The H⁰ composition comparison satisfies the pseudofunctor associativity law. The ordinary functor associator is retained explicitly even though dg-functor composition is strict.

                            The H⁰ composition comparison is coherent with right composition by the identity dg functor and the ordinary right unitor.

                            The H⁰ composition comparison is coherent with left composition by the identity dg functor and the ordinary left unitor.