# mathlibdocumentation

category_theory.full_subcategory

# Induced categories and full subcategories #

Given a category D and a function F : C → Dfrom 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 induced_category, 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 induced_category.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) := induced_category Mon (bundled.map @comm_monoid.to_monoid) -- not induced_category (bundled monoid) (bundled.map @comm_monoid.to_monoid), -- even though Mon = bundled monoid!

@[nolint]
def category_theory.induced_category {C : Type u₁} (D : Type u₂) (F : C → D) :
Type u₁

induced_category 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 category_theory.induced_category
@[protected, instance]
def category_theory.induced_category.has_coe_to_sort {C : Type u₁} {D : Type u₂} (F : C → D) {α : Sort u_1} [ α] :
Equations
@[protected, instance]
def category_theory.induced_category.category {C : Type u₁} {D : Type u₂} (F : C → D) :
Equations
def category_theory.induced_functor {C : Type u₁} {D : Type u₂} (F : C → D) :

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

Equations
Instances for category_theory.induced_functor
@[simp]
theorem category_theory.induced_functor_obj {C : Type u₁} {D : Type u₂} (F : C → D) (ᾰ : C) :
= F ᾰ
@[simp]
theorem category_theory.induced_functor_map {C : Type u₁} {D : Type u₂} (F : C → D) (x y : F) (f : x y) :
@[protected, instance]
def category_theory.induced_category.full {C : Type u₁} {D : Type u₂} (F : C → D) :
Equations
@[protected, instance]
def category_theory.induced_category.faithful {C : Type u₁} {D : Type u₂} (F : C → D) :
@[protected, instance]
def category_theory.full_subcategory {C : Type u₁} (Z : C → Prop) :

The category structure on a subtype; morphisms just ignore the property.

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

Equations
def category_theory.full_subcategory_inclusion {C : Type u₁} (Z : C → Prop) :
{X // Z X} C

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

Equations
Instances for category_theory.full_subcategory_inclusion
@[simp]
theorem category_theory.full_subcategory_inclusion.obj {C : Type u₁} (Z : C → Prop) {X : {X // Z X}} :
@[simp]
theorem category_theory.full_subcategory_inclusion.map {C : Type u₁} (Z : C → Prop) {X Y : {X // Z X}} {f : X Y} :
@[protected, instance]
def category_theory.full_subcategory.full {C : Type u₁} (Z : C → Prop) :
Equations
@[protected, instance]
def category_theory.full_subcategory.faithful {C : Type u₁} (Z : C → Prop) :
def category_theory.full_subcategory.map {C : Type u₁} {Z Z' : C → Prop} (h : ∀ ⦃X : C⦄, Z XZ' X) :
{X // Z X} {X // Z' X}

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

Equations
Instances for category_theory.full_subcategory.map
@[simp]
theorem category_theory.full_subcategory.map_obj_coe {C : Type u₁} {Z Z' : C → Prop} (h : ∀ ⦃X : C⦄, Z XZ' X) (X : {X // Z X}) :
= X.val
@[simp]
theorem category_theory.full_subcategory.map_map {C : Type u₁} {Z Z' : C → Prop} (h : ∀ ⦃X : C⦄, Z XZ' X) (X Y : {X // Z X}) (f : X Y) :
@[protected, instance]
def category_theory.full_subcategory.map.full {C : Type u₁} {Z Z' : C → Prop} (h : ∀ ⦃X : C⦄, Z XZ' X) :
Equations
@[protected, instance]
def category_theory.full_subcategory.map.faithful {C : Type u₁} {Z Z' : C → Prop} (h : ∀ ⦃X : C⦄, Z XZ' X) :
@[simp]
theorem category_theory.full_subcategory.map_inclusion {C : Type u₁} {Z Z' : C → Prop} (h : ∀ ⦃X : C⦄, Z XZ' X) :
def category_theory.full_subcategory.lift {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) :
C {X // P 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 category_theory.full_subcategory.lift
@[simp]
theorem category_theory.full_subcategory.lift_map {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) (X Y : C) (f : X Y) :
.map f = F.map f
@[simp]
theorem category_theory.full_subcategory.lift_obj_coe {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) (X : C) :
.obj X) = F.obj X
def category_theory.full_subcategory.lift_comp_inclusion {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) :

Composing the lift of a functor through a full subcategory with the inclusion yields the original functor. Unfortunately, this is not true by definition, so we only get a natural isomorphism, but it is pointwise definitionally true, see full_subcategory.inclusion_obj_lift_obj and full_subcategory.inclusion_map_lift_map.

Equations
@[simp]
theorem category_theory.full_subcategory.inclusion_obj_lift_obj {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) {X : C} :
= F.obj X
theorem category_theory.full_subcategory.inclusion_map_lift_map {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) {X Y : C} (f : X Y) :
= F.map f
@[protected, instance]
def category_theory.full_subcategory.lift.faithful {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X))  :
@[protected, instance]
def category_theory.full_subcategory.lift.full {C : Type u₁} {D : Type u₂} (P : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X))  :
Equations
@[simp]
theorem category_theory.full_subcategory.lift_comp_map {C : Type u₁} {D : Type u₂} (P Q : D → Prop) (F : C D) (hF : ∀ (X : C), P (F.obj X)) (h : ∀ ⦃X : D⦄, P XQ X) :