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 HomC(X,Y)=HomD(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
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₂} [CategoryTheory.Category.{v, u₂} D] {F : CD} {X Y : CategoryTheory.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

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

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

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.
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.

Stacks 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

theorem CategoryTheory.FullSubcategory.ext {C : Type u₁} {Z : CProp} {x y : CategoryTheory.FullSubcategory Z} (obj : x.obj = y.obj) :
x = y

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.
@[simp]
theorem CategoryTheory.FullSubcategory.map_map {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) {X✝ Y✝ : CategoryTheory.FullSubcategory Z} (f : X✝ Y✝) :
@[simp]
theorem CategoryTheory.FullSubcategory.map_obj_obj {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) (X : CategoryTheory.FullSubcategory Z) :
instance CategoryTheory.FullSubcategory.full_map {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' X) :
instance CategoryTheory.FullSubcategory.faithful_map {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {Z Z' : CProp} (h : ∀ ⦃X : C⦄, Z XZ' 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
@[simp]
theorem CategoryTheory.FullSubcategory.lift_obj_obj {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (P : DProp) (F : CategoryTheory.Functor C D) (hF : ∀ (X : C), P (F.obj X)) (X : C) :
((CategoryTheory.FullSubcategory.lift P F hF).obj X).obj = F.obj X
@[simp]
theorem CategoryTheory.FullSubcategory.lift_map {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (P : DProp) (F : CategoryTheory.Functor C D) (hF : ∀ (X : C), P (F.obj X)) {X✝ Y✝ : C} (f : X✝ Y✝) :
(CategoryTheory.FullSubcategory.lift P F hF).map f = F.map f

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

Equations
@[simp]
theorem CategoryTheory.fullSubcategoryInclusion_map_lift_map {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (P : DProp) (F : CategoryTheory.Functor C D) (hF : ∀ (X : C), P (F.obj X)) {X Y : C} (f : X Y) :
instance CategoryTheory.instFaithfulFullSubcategoryLift {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (P : DProp) (F : CategoryTheory.Functor C D) (hF : ∀ (X : C), P (F.obj X)) [F.Faithful] :
instance CategoryTheory.instFullFullSubcategoryLift {C : Type u₁} [CategoryTheory.Category.{v, u₁} C] {D : Type u₂} [CategoryTheory.Category.{v₂, u₂} D] (P : DProp) (F : CategoryTheory.Functor C D) (hF : ∀ (X : C), P (F.obj X)) [F.Full] :
@[simp]