Documentation

Mathlib.CategoryTheory.FullSubcategory

Induced categories and full subcategories #

Given a category D and a function F : C → D from a type C to the objects of D, there is an essentially unique way to give C a category structure such that F becomes a fully faithful functor, namely by taking $$ Hom_C(X, Y) = Hom_D(FX, FY) $$. We call this the category induced from D along F.

As a special case, if C is a subtype of D, this produces the full subcategory of D on the objects belonging to C. In general the induced category is equivalent to the full subcategory of D on the image of F.

Implementation notes #

It looks odd to make D an explicit argument of InducedCategory, when it is determined by the argument F anyways. The reason to make D explicit is in order to control its syntactic form, so that instances like InducedCategory.has_forget₂ (elsewhere) refer to the correct form of D. This is used to set up several algebraic categories like

def CommMon : Type (u+1) := InducedCategory Mon (Bundled.map @CommMonoid.toMonoid) -- not InducedCategory (Bundled Monoid) (Bundled.map @CommMonoid.toMonoid), -- even though MonCat = Bundled Monoid!

def CategoryTheory.InducedCategory {C : Type u₁} (D : Type u₂) (_F : CD) :
Type u₁

InducedCategory D F, where F : C → D, is a typeclass synonym for C, which provides a category structure so that the morphisms X ⟶ Y are the morphisms in D from F X to F Y.

Equations
Instances For
    instance CategoryTheory.InducedCategory.hasCoeToSort {C : Type u₁} {D : Type u₂} (F : CD) {α : Sort u_1} [CoeSort D α] :
    Equations
    def CategoryTheory.InducedCategory.isoMk {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] {F : CD} {X Y : InducedCategory D F} (f : F X F Y) :
    X Y

    Construct an isomorphism in the induced category from an isomorphism in the original category.

    Equations
    Instances For
      @[simp]
      theorem CategoryTheory.InducedCategory.isoMk_hom {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] {F : CD} {X Y : InducedCategory D F} (f : F X F Y) :
      (isoMk f).hom = f.hom
      @[simp]
      theorem CategoryTheory.InducedCategory.isoMk_inv {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] {F : CD} {X Y : InducedCategory D F} (f : F X F Y) :
      (isoMk f).inv = f.inv
      def CategoryTheory.inducedFunctor {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] (F : CD) :

      The forgetful functor from an induced category to the original category, forgetting the extra data.

      Equations
      Instances For
        @[simp]
        theorem CategoryTheory.inducedFunctor_map {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] (F : CD) {X✝ Y✝ : InducedCategory D F} (f : X✝ Y✝) :
        (inducedFunctor F).map f = f
        @[simp]
        theorem CategoryTheory.inducedFunctor_obj {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] (F : CD) (a✝ : C) :
        (inducedFunctor F).obj a✝ = F a✝
        def CategoryTheory.fullyFaithfulInducedFunctor {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] (F : CD) :
        (inducedFunctor F).FullyFaithful

        The induced functor inducedFunctor F : InducedCategory D F ⥤ D is fully faithful.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          instance CategoryTheory.InducedCategory.full {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] (F : CD) :
          instance CategoryTheory.InducedCategory.faithful {C : Type u₁} {D : Type u₂} [Category.{v, u₂} D] (F : CD) :
          (inducedFunctor F).Faithful
          structure CategoryTheory.FullSubcategory {C : Type u₁} (Z : CProp) :
          Type u₁

          A subtype-like structure for full subcategories. Morphisms just ignore the property. We don't use actual subtypes since the simp-normal form ↑X of X.val does not work well for full subcategories.

          See https://stacks.math.columbia.edu/tag/001D. We do not define 'strictly full' subcategories.

          • obj : C

            The category of which this is a full subcategory

          • property : Z self.obj

            The predicate satisfied by all objects in this subcategory

          Instances For
            theorem CategoryTheory.FullSubcategory.ext {C : Type u₁} {Z : CProp} {x y : FullSubcategory Z} (obj : x.obj = y.obj) :
            x = y
            theorem CategoryTheory.FullSubcategory.comp_def {C : Type u₁} [Category.{v, u₁} C] (Z : CProp) {X Y Z✝ : FullSubcategory Z} (f : X Y) (g : Y Z✝) :

            The forgetful functor from a full subcategory into the original category ("forgetting" the condition).

            Equations
            Instances For
              @[simp]
              theorem CategoryTheory.fullSubcategoryInclusion.map {C : Type u₁} [Category.{v, u₁} C] (Z : CProp) {X Y : FullSubcategory Z} {f : X Y} :
              @[reducible, inline]

              The inclusion of a full subcategory is fully faithful.

              Equations
              Instances For
                def CategoryTheory.FullSubcategory.map {C : Type u₁} [Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) :

                An implication of predicates Z → Z' induces a functor between full subcategories.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  @[simp]
                  theorem CategoryTheory.FullSubcategory.map_map {C : Type u₁} [Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) {X✝ Y✝ : FullSubcategory Z} (f : X✝ Y✝) :
                  (map h).map f = f
                  @[simp]
                  theorem CategoryTheory.FullSubcategory.map_obj_obj {C : Type u₁} [Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) (X : FullSubcategory Z) :
                  ((map h).obj X).obj = X.obj
                  instance CategoryTheory.FullSubcategory.full_map {C : Type u₁} [Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) :
                  (map h).Full
                  instance CategoryTheory.FullSubcategory.faithful_map {C : Type u₁} [Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) :
                  (map h).Faithful
                  @[simp]
                  theorem CategoryTheory.FullSubcategory.map_inclusion {C : Type u₁} [Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) :
                  def CategoryTheory.FullSubcategory.lift {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) :

                  A functor which maps objects to objects satisfying a certain property induces a lift through the full subcategory of objects satisfying that property.

                  Equations
                  Instances For
                    @[simp]
                    theorem CategoryTheory.FullSubcategory.lift_obj_obj {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) (X : C) :
                    ((lift P F hF).obj X).obj = F.obj X
                    @[simp]
                    theorem CategoryTheory.FullSubcategory.lift_map {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) {X✝ Y✝ : C} (f : X✝ Y✝) :
                    (lift P F hF).map f = F.map f
                    @[simp]
                    theorem CategoryTheory.FullSubcategory.lift_comp_inclusion_eq {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) :
                    (lift P F hF).comp (fullSubcategoryInclusion P) = F
                    def CategoryTheory.FullSubcategory.lift_comp_inclusion {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) :
                    (lift P F hF).comp (fullSubcategoryInclusion P) F

                    Composing the lift of a functor through a full subcategory with the inclusion yields the original functor. This is actually true definitionally.

                    Equations
                    Instances For
                      @[simp]
                      theorem CategoryTheory.fullSubcategoryInclusion_obj_lift_obj {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) {X : C} :
                      (fullSubcategoryInclusion P).obj ((FullSubcategory.lift P F hF).obj X) = F.obj X
                      @[simp]
                      theorem CategoryTheory.fullSubcategoryInclusion_map_lift_map {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) {X Y : C} (f : X Y) :
                      (fullSubcategoryInclusion P).map ((FullSubcategory.lift P F hF).map f) = F.map f
                      instance CategoryTheory.instFaithfulFullSubcategoryLift {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) [F.Faithful] :
                      (FullSubcategory.lift P F hF).Faithful
                      instance CategoryTheory.instFullFullSubcategoryLift {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) [F.Full] :
                      (FullSubcategory.lift P F hF).Full
                      @[simp]
                      theorem CategoryTheory.FullSubcategory.lift_comp_map {C : Type u₁} [Category.{v, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] (P Q : DProp) (F : Functor C D) (hF : ∀ (X : C), P (F.obj X)) (h : ∀ ⦃X : D⦄, P XQ X) :
                      (lift P F hF).comp (map h) = lift Q F