Documentation

Mathlib.CategoryTheory.ConcreteCategory.Basic

Concrete categories #

A concrete category is a category C where the objects and morphisms correspond with types and (bundled) functions between these types. We define concrete categories using class ConcreteCategory. To convert an object to a type, write ToType. To convert a morphism to a (bundled) function, write hom.

Each concrete category C comes with a canonical faithful functor forget C : C ⥤ Type*, see the file Mathlib.CategoryTheory.ConcreteCategory.Forget

Implementation notes #

We do not use CoeSort to convert objects in a concrete category to types, since this would lead to elaboration mismatches between results taking a [ConcreteCategory C] instance and specific types C that hold a ConcreteCategory C instance: the first gets a literal CoeSort.coe and the second gets unfolded to the actual coe field.

ToType and ToHom are abbrevs so that we do not need to copy over instances such as Ring or RingHomClass respectively.

References #

See Ahrens and Lumsdaine, Displayed Categories for related work.

class CategoryTheory.ConcreteCategory (C : Type u) [Category.{v, u} C] (FC : outParam (CCType u_1)) {CC : outParam (CType w)} [outParam ((X Y : C) → FunLike (FC X Y) (CC X) (CC Y))] :
Type (max (max u u_1) v)

A concrete category is a category C where objects correspond to types and morphisms to (bundled) functions between those types.

In other words, it has a fixed faithful functor forget : C ⥤ Type.

Note that ConcreteCategory potentially depends on three independent universe levels,

  • the universe level w appearing in forget : C ⥤ Type w
  • the universe level v of the morphisms (i.e. we have a Category.{v} C)
  • the universe level u of the objects (i.e C : Type u) They are specified that order, to avoid unnecessary universe annotations.
  • hom {X Y : C} : (X Y) → FC X Y

    Convert a morphism of C to a bundled function.

  • ofHom {X Y : C} : FC X Y → (X Y)

    Convert a bundled function to a morphism of C.

  • hom_ofHom {X Y : C} (f : FC X Y) : hom (ofHom f) = f
  • ofHom_hom {X Y : C} (f : X Y) : ofHom (hom f) = f
  • id_apply {X : C} (x : CC X) : (hom (CategoryStruct.id X)) x = x
  • comp_apply {X Y Z : C} (f : X Y) (g : Y Z) (x : CC X) : (hom (CategoryStruct.comp f g)) x = (hom g) ((hom f) x)
Instances
    @[reducible, inline]
    abbrev CategoryTheory.ToType {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] :
    CType w

    ToType X converts the object X of the concrete category C to a type.

    This is an abbrev so that instances on X (e.g. Ring) do not need to be redeclared.

    Equations
    Instances For
      @[reducible, inline]
      abbrev CategoryTheory.ToHom {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] :
      CCType u_1

      ToHom X Y is the type of (bundled) functions between objects X Y : C.

      This is an abbrev so that instances (e.g. RingHomClass) do not need to be redeclared.

      Equations
      Instances For
        instance CategoryTheory.ConcreteCategory.instCoeFunHomForallToType {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} :
        CoeFun (X Y) fun (x : X Y) => ToType XToType Y

        We can apply morphisms of concrete categories by first casting them down to the base functions.

        Equations
        @[reducible, inline]
        abbrev CategoryTheory.HasForget.instFunLike {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} :
        FunLike (X Y) (ToType X) (ToType Y)

        A non-instance FunLike instance on X ⟶ Y.

        Equations
        Instances For
          def CategoryTheory.ConcreteCategory.homEquiv {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} :
          (X Y) ToHom X Y

          ConcreteCategory.hom bundled as an Equiv.

          Equations
          Instances For
            theorem CategoryTheory.ConcreteCategory.hom_bijective {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} :
            theorem CategoryTheory.ConcreteCategory.hom_injective {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} :
            theorem CategoryTheory.ConcreteCategory.ext {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} {f g : X Y} (h : hom f = hom g) :
            f = g

            In any concrete category, we can test equality of morphisms by pointwise evaluations.

            theorem CategoryTheory.ConcreteCategory.ext_iff {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} {f g : X Y} :
            f = g hom f = hom g
            theorem CategoryTheory.ConcreteCategory.coe_ext {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} {f g : X Y} (h : (hom f) = (hom g)) :
            f = g
            theorem CategoryTheory.ConcreteCategory.ext_apply {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} {f g : X Y} (h : ∀ (x : CC X), (hom f) x = (hom g) x) :
            f = g
            theorem CategoryTheory.ConcreteCategory.hom_ext {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} (f g : X Y) (w : ∀ (x : ToType X), (hom f) x = (hom g) x) :
            f = g

            In any concrete category, we can test equality of morphisms by pointwise evaluations.

            theorem CategoryTheory.ConcreteCategory.hom_ext_iff {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} {f g : X Y} :
            f = g ∀ (x : ToType X), (hom f) x = (hom g) x
            theorem CategoryTheory.ConcreteCategory.congr_hom {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} {f g : X Y} (h : f = g) (x : ToType X) :
            (hom f) x = (hom g) x

            Analogue of congr_fun h x, when h : f = g is an equality between morphisms in a concrete category.

            theorem CategoryTheory.ConcreteCategory.coe_id {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X : C} :
            theorem CategoryTheory.ConcreteCategory.coe_comp {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y Z : C} (f : X Y) (g : Y Z) :
            (hom (CategoryStruct.comp f g)) = (hom g) (hom f)
            @[simp]
            theorem CategoryTheory.id_apply {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X : C} (x : ToType X) :
            @[simp]
            theorem CategoryTheory.comp_apply {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y Z : C} (f : X Y) (g : Y Z) (x : ToType X) :
            @[deprecated CategoryTheory.comp_apply (since := "2026-02-06")]
            theorem CategoryTheory.comp_apply' {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y Z : C} (f : X Y) (g : Y Z) (x : ToType X) :

            Alias of CategoryTheory.comp_apply.

            theorem CategoryTheory.ConcreteCategory.congr_arg {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y : C} (f : X Y) {x x' : ToType X} (h : x = x') :
            (hom f) x = (hom f) x'
            theorem CategoryTheory.hom_id {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X : C} :
            theorem CategoryTheory.hom_comp {C : Type u} [Category.{v, u} C] {FC : CCType u_1} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] {X Y Z : C} (f : X Y) (g : Y Z) :
            instance CategoryTheory.InducedCategory.concreteCategory {C : Type u} {D : Type u'} [Category.{v', u'} D] {FD : DDType u_2} {CD : DType w} [(X Y : D) → FunLike (FD X Y) (CD X) (CD Y)] [ConcreteCategory D FD] (f : CD) :
            ConcreteCategory (InducedCategory D f) fun (X Y : InducedCategory D f) => FD (f X) (f Y)
            Equations
            • One or more equations did not get rendered due to their size.
            instance CategoryTheory.FullSubcategory.concreteCategory {C : Type u} [Category.{v, u} C] {FC : CCType u_2} {CC : CType w} [(X Y : C) → FunLike (FC X Y) (CC X) (CC Y)] [ConcreteCategory C FC] (P : ObjectProperty C) :
            Equations
            • One or more equations did not get rendered due to their size.