Documentation

Mathlib.CategoryTheory.Subobject.Basic

Subobjects #

We define Subobject X as the quotient (by isomorphisms) of MonoOver X := {f : Over X // Mono f.hom}.

Here MonoOver X is a thin category (a pair of objects has at most one morphism between them), so we can think of it as a preorder. However as it is not skeletal, it is not a partial order.

There is a coercion from Subobject X back to the ambient category C (using choice to pick a representative), and for P : Subobject X, P.arrow : (P : C) ⟶ X is the inclusion morphism.

We provide

The subobjects of X form a preorder making them into a category. We have X ≤ Y if and only if X.arrow factors through Y.arrow: see ofLE/ofLEMk/ofMkLE/ofMkLEMk and le_of_comm. Similarly, to show that two subobjects are equal, we can supply an isomorphism between the underlying objects that commutes with the arrows (eq_of_comm).

See also

Notes #

This development originally appeared in Bhavik Mehta's "Topos theory for Lean" repository, and was ported to mathlib by Kim Morrison.

Implementation note #

Currently we describe pullback, map, etc., as functors. It may be better to just say that they are monotone functions, and even avoid using categorical language entirely when describing Subobject X. (It's worth keeping this in mind in future use; it should be a relatively easy change here if it looks preferable.)

Relation to pseudoelements #

There is a separate development of pseudoelements in CategoryTheory.Abelian.Pseudoelements, as a quotient (but not by isomorphism) of Over X.

When a morphism f has an image, the image represents the same pseudoelement. In a category with images Pseudoelements X could be constructed as a quotient of MonoOver X. In fact, in an abelian category (I'm not sure in what generality beyond that), Pseudoelements X agrees with Subobject X, but we haven't developed this in mathlib yet.

We now construct the subobject lattice for X : C, as the quotient by isomorphisms of MonoOver X.

Since MonoOver X is a thin category, we use ThinSkeleton to take the quotient.

Essentially all the structure defined above on MonoOver X descends to Subobject X, with morphisms becoming inequalities, and isomorphisms becoming equations.

def CategoryTheory.Subobject {C : Type u₁} [Category.{v₁, u₁} C] (X : C) :
Type (max u₁ v₁)

The category of subobjects of X : C, defined as isomorphism classes of monomorphisms into X.

Equations
Instances For
    def CategoryTheory.Subobject.mk {C : Type u₁} [Category.{v₁, u₁} C] {X A : C} (f : A X) [Mono f] :

    Convenience constructor for a subobject.

    Equations
    Instances For
      theorem CategoryTheory.Comma.ext {A : Type u₁} {inst✝ : Category.{v₁, u₁} A} {B : Type u₂} {inst✝¹ : Category.{v₂, u₂} B} {T : Type u₃} {inst✝² : Category.{v₃, u₃} T} {L : Functor A T} {R : Functor B T} {x y : Comma L R} (left : x.left = y.left) (right : x.right = y.right) (hom : HEq x.hom y.hom) :
      x = y
      theorem CategoryTheory.Subobject.ind {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (p : Subobject XProp) (h : ∀ ⦃A : C⦄ (f : A X) [inst : Mono f], p (mk f)) (P : Subobject X) :
      p P
      theorem CategoryTheory.Subobject.ind₂ {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (p : Subobject XSubobject XProp) (h : ∀ ⦃A B : C⦄ (f : A X) (g : B X) [inst : Mono f] [inst_1 : Mono g], p (mk f) (mk g)) (P Q : Subobject X) :
      p P Q
      def CategoryTheory.Subobject.lift {C : Type u₁} [Category.{v₁, u₁} C] {α : Sort u_1} {X : C} (F : A : C⦄ → (f : A X) → [inst : Mono f] → α) (h : ∀ ⦃A B : C⦄ (f : A X) (g : B X) [inst : Mono f] [inst_1 : Mono g] (i : A B), CategoryStruct.comp i.hom g = fF f = F g) :
      Subobject Xα

      Declare a function on subobjects of X by specifying a function on monomorphisms with codomain X.

      Equations
      Instances For
        @[simp]
        theorem CategoryTheory.Subobject.lift_mk {C : Type u₁} [Category.{v₁, u₁} C] {α : Sort u_1} {X : C} (F : A : C⦄ → (f : A X) → [inst : Mono f] → α) {h : ∀ ⦃A B : C⦄ (f : A X) (g : B X) [inst : Mono f] [inst_1 : Mono g] (i : A B), CategoryStruct.comp i.hom g = fF f = F g} {A : C} (f : A X) [Mono f] :
        Subobject.lift F h (mk f) = F f

        The category of subobjects is equivalent to the MonoOver category. It is more convenient to use the former due to the partial order instance, but oftentimes it is easier to define structures on the latter.

        Equations
        Instances For

          Use choice to pick a representative MonoOver X for each Subobject X.

          Equations
          Instances For
            noncomputable def CategoryTheory.Subobject.representativeIso {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (A : MonoOver X) :

            Starting with A : MonoOver X, we can take its equivalence class in Subobject X then pick an arbitrary representative using representative.obj. This is isomorphic (in MonoOver X) to the original A.

            Equations
            Instances For
              noncomputable def CategoryTheory.Subobject.underlying {C : Type u₁} [Category.{v₁, u₁} C] {X : C} :

              Use choice to pick a representative underlying object in C for any Subobject X.

              Prefer to use the coercion P : C rather than explicitly writing underlying.obj P.

              Equations
              Instances For
                noncomputable def CategoryTheory.Subobject.underlyingIso {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : X Y) [Mono f] :
                underlying.obj (mk f) X

                If we construct a Subobject Y from an explicit f : X ⟶ Y with [Mono f], then pick an arbitrary choice of underlying object (Subobject.mk f : C) back in C, it is isomorphic (in C) to the original X.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  noncomputable def CategoryTheory.Subobject.arrow {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (Y : Subobject X) :
                  underlying.obj Y X

                  The morphism in C from the arbitrarily chosen underlying object to the ambient object.

                  Equations
                  Instances For
                    instance CategoryTheory.Subobject.arrow_mono {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (Y : Subobject X) :
                    Mono Y.arrow
                    @[simp]
                    theorem CategoryTheory.Subobject.arrow_congr {C : Type u₁} [Category.{v₁, u₁} C] {A : C} (X Y : Subobject A) (h : X = Y) :
                    CategoryStruct.comp (eqToHom ) Y.arrow = X.arrow
                    @[simp]
                    theorem CategoryTheory.Subobject.representative_coe {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (Y : Subobject X) :
                    (representative.obj Y).obj.left = underlying.obj Y
                    @[simp]
                    theorem CategoryTheory.Subobject.representative_arrow {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (Y : Subobject X) :
                    (representative.obj Y).arrow = Y.arrow
                    @[simp]
                    theorem CategoryTheory.Subobject.underlying_arrow {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {Y Z : Subobject X} (f : Y Z) :
                    CategoryStruct.comp (underlying.map f) Z.arrow = Y.arrow
                    @[simp]
                    theorem CategoryTheory.Subobject.underlying_arrow_assoc {C : Type u₁} [Category.{v₁, u₁} C] {X : C} {Y Z : Subobject X} (f : Y Z) {Z✝ : C} (h : X Z✝) :
                    @[simp]
                    theorem CategoryTheory.Subobject.underlyingIso_arrow {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : X Y) [Mono f] :
                    @[simp]
                    @[simp]
                    theorem CategoryTheory.Subobject.underlyingIso_arrow_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : X Y) [Mono f] [inst : HasForget C] (x : (forget C).obj X) :
                    (mk f).arrow ((underlyingIso f).inv x) = f x
                    @[simp]
                    theorem CategoryTheory.Subobject.eq_of_comp_arrow_eq {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} {P : Subobject Y} {f g : X underlying.obj P} (h : CategoryStruct.comp f P.arrow = CategoryStruct.comp g P.arrow) :
                    f = g

                    Two morphisms into a subobject are equal exactly if the morphisms into the ambient object are equal

                    theorem CategoryTheory.Subobject.mk_le_mk_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} {f₁ : A₁ B} {f₂ : A₂ B} [Mono f₁] [Mono f₂] (g : A₁ A₂) (w : CategoryStruct.comp g f₂ = f₁) :
                    mk f₁ mk f₂
                    @[simp]
                    theorem CategoryTheory.Subobject.mk_arrow {C : Type u₁} [Category.{v₁, u₁} C] {X : C} (P : Subobject X) :
                    mk P.arrow = P
                    theorem CategoryTheory.Subobject.le_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B : C} {X Y : Subobject B} (f : underlying.obj X underlying.obj Y) (w : CategoryStruct.comp f Y.arrow = X.arrow) :
                    X Y
                    theorem CategoryTheory.Subobject.le_mk_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} {X : Subobject B} {f : A B} [Mono f] (g : underlying.obj X A) (w : CategoryStruct.comp g f = X.arrow) :
                    X mk f
                    theorem CategoryTheory.Subobject.mk_le_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} {X : Subobject B} {f : A B} [Mono f] (g : A underlying.obj X) (w : CategoryStruct.comp g X.arrow = f) :
                    mk f X
                    theorem CategoryTheory.Subobject.eq_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B : C} {X Y : Subobject B} (f : underlying.obj X underlying.obj Y) (w : CategoryStruct.comp f.hom Y.arrow = X.arrow) :
                    X = Y

                    To show that two subobjects are equal, it suffices to exhibit an isomorphism commuting with the arrows.

                    theorem CategoryTheory.Subobject.eq_mk_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} {X : Subobject B} (f : A B) [Mono f] (i : underlying.obj X A) (w : CategoryStruct.comp i.hom f = X.arrow) :
                    X = mk f

                    To show that two subobjects are equal, it suffices to exhibit an isomorphism commuting with the arrows.

                    theorem CategoryTheory.Subobject.mk_eq_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} {X : Subobject B} (f : A B) [Mono f] (i : A underlying.obj X) (w : CategoryStruct.comp i.hom X.arrow = f) :
                    mk f = X

                    To show that two subobjects are equal, it suffices to exhibit an isomorphism commuting with the arrows.

                    theorem CategoryTheory.Subobject.mk_eq_mk_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) (g : A₂ B) [Mono f] [Mono g] (i : A₁ A₂) (w : CategoryStruct.comp i.hom g = f) :
                    mk f = mk g

                    To show that two subobjects are equal, it suffices to exhibit an isomorphism commuting with the arrows.

                    def CategoryTheory.Subobject.ofLE {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y : Subobject B) (h : X Y) :

                    An inequality of subobjects is witnessed by some morphism between the corresponding objects.

                    Equations
                    Instances For
                      @[simp]
                      theorem CategoryTheory.Subobject.ofLE_arrow {C : Type u₁} [Category.{v₁, u₁} C] {B : C} {X Y : Subobject B} (h : X Y) :
                      CategoryStruct.comp (X.ofLE Y h) Y.arrow = X.arrow
                      @[simp]
                      theorem CategoryTheory.Subobject.ofLE_arrow_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B : C} {X Y : Subobject B} (h : X Y) {Z : C} (h✝ : B Z) :
                      CategoryStruct.comp (X.ofLE Y h) (CategoryStruct.comp Y.arrow h✝) = CategoryStruct.comp X.arrow h✝
                      instance CategoryTheory.Subobject.instMonoOfLE {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y : Subobject B) (h : X Y) :
                      Mono (X.ofLE Y h)
                      theorem CategoryTheory.Subobject.ofLE_mk_le_mk_of_comm {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} {f₁ : A₁ B} {f₂ : A₂ B} [Mono f₁] [Mono f₂] (g : A₁ A₂) (w : CategoryStruct.comp g f₂ = f₁) :
                      (mk f₁).ofLE (mk f₂) = CategoryStruct.comp (underlyingIso f₁).hom (CategoryStruct.comp g (underlyingIso f₂).inv)
                      def CategoryTheory.Subobject.ofLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (h : X mk f) :
                      underlying.obj X A

                      An inequality of subobjects is witnessed by some morphism between the corresponding objects.

                      Equations
                      Instances For
                        instance CategoryTheory.Subobject.instMonoOfLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (h : X mk f) :
                        Mono (X.ofLEMk f h)
                        @[simp]
                        theorem CategoryTheory.Subobject.ofLEMk_comp {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} {X : Subobject B} {f : A B} [Mono f] (h : X mk f) :
                        CategoryStruct.comp (X.ofLEMk f h) f = X.arrow
                        def CategoryTheory.Subobject.ofMkLE {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (f : A B) [Mono f] (X : Subobject B) (h : mk f X) :
                        A underlying.obj X

                        An inequality of subobjects is witnessed by some morphism between the corresponding objects.

                        Equations
                        Instances For
                          instance CategoryTheory.Subobject.instMonoOfMkLE {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (f : A B) [Mono f] (X : Subobject B) (h : mk f X) :
                          Mono (ofMkLE f X h)
                          @[simp]
                          theorem CategoryTheory.Subobject.ofMkLE_arrow {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} {f : A B} [Mono f] {X : Subobject B} (h : mk f X) :
                          CategoryStruct.comp (ofMkLE f X h) X.arrow = f
                          def CategoryTheory.Subobject.ofMkLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) (g : A₂ B) [Mono f] [Mono g] (h : mk f mk g) :
                          A₁ A₂

                          An inequality of subobjects is witnessed by some morphism between the corresponding objects.

                          Equations
                          • One or more equations did not get rendered due to their size.
                          Instances For
                            instance CategoryTheory.Subobject.instMonoOfMkLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) (g : A₂ B) [Mono f] [Mono g] (h : mk f mk g) :
                            Mono (ofMkLEMk f g h)
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLEMk_comp {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} {f : A₁ B} {g : A₂ B} [Mono f] [Mono g] (h : mk f mk g) :
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLE_comp_ofLE {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y Z : Subobject B) (h₁ : X Y) (h₂ : Y Z) :
                            CategoryStruct.comp (X.ofLE Y h₁) (Y.ofLE Z h₂) = X.ofLE Z
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLE_comp_ofLE_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y Z : Subobject B) (h₁ : X Y) (h₂ : Y Z) {Z✝ : C} (h : underlying.obj Z Z✝) :
                            CategoryStruct.comp (X.ofLE Y h₁) (CategoryStruct.comp (Y.ofLE Z h₂) h) = CategoryStruct.comp (X.ofLE Z ) h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLE_comp_ofLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X Y : Subobject B) (f : A B) [Mono f] (h₁ : X Y) (h₂ : Y mk f) :
                            CategoryStruct.comp (X.ofLE Y h₁) (Y.ofLEMk f h₂) = X.ofLEMk f
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLE_comp_ofLEMk_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X Y : Subobject B) (f : A B) [Mono f] (h₁ : X Y) (h₂ : Y mk f) {Z : C} (h : A Z) :
                            CategoryStruct.comp (X.ofLE Y h₁) (CategoryStruct.comp (Y.ofLEMk f h₂) h) = CategoryStruct.comp (X.ofLEMk f ) h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLEMk_comp_ofMkLE {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (Y : Subobject B) (h₁ : X mk f) (h₂ : mk f Y) :
                            CategoryStruct.comp (X.ofLEMk f h₁) (ofMkLE f Y h₂) = X.ofLE Y
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLEMk_comp_ofMkLE_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (Y : Subobject B) (h₁ : X mk f) (h₂ : mk f Y) {Z : C} (h : underlying.obj Y Z) :
                            CategoryStruct.comp (X.ofLEMk f h₁) (CategoryStruct.comp (ofMkLE f Y h₂) h) = CategoryStruct.comp (X.ofLE Y ) h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLEMk_comp_ofMkLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (X : Subobject B) (f : A₁ B) [Mono f] (g : A₂ B) [Mono g] (h₁ : X mk f) (h₂ : mk f mk g) :
                            CategoryStruct.comp (X.ofLEMk f h₁) (ofMkLEMk f g h₂) = X.ofLEMk g
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLEMk_comp_ofMkLEMk_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (X : Subobject B) (f : A₁ B) [Mono f] (g : A₂ B) [Mono g] (h₁ : X mk f) (h₂ : mk f mk g) {Z : C} (h : A₂ Z) :
                            CategoryStruct.comp (X.ofLEMk f h₁) (CategoryStruct.comp (ofMkLEMk f g h₂) h) = CategoryStruct.comp (X.ofLEMk g ) h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLE_comp_ofLE {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ : C} (f : A₁ B) [Mono f] (X Y : Subobject B) (h₁ : mk f X) (h₂ : X Y) :
                            CategoryStruct.comp (ofMkLE f X h₁) (X.ofLE Y h₂) = ofMkLE f Y
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLE_comp_ofLE_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ : C} (f : A₁ B) [Mono f] (X Y : Subobject B) (h₁ : mk f X) (h₂ : X Y) {Z : C} (h : underlying.obj Y Z) :
                            CategoryStruct.comp (ofMkLE f X h₁) (CategoryStruct.comp (X.ofLE Y h₂) h) = CategoryStruct.comp (ofMkLE f Y ) h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLE_comp_ofLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) [Mono f] (X : Subobject B) (g : A₂ B) [Mono g] (h₁ : mk f X) (h₂ : X mk g) :
                            CategoryStruct.comp (ofMkLE f X h₁) (X.ofLEMk g h₂) = ofMkLEMk f g
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLE_comp_ofLEMk_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) [Mono f] (X : Subobject B) (g : A₂ B) [Mono g] (h₁ : mk f X) (h₂ : X mk g) {Z : C} (h : A₂ Z) :
                            CategoryStruct.comp (ofMkLE f X h₁) (CategoryStruct.comp (X.ofLEMk g h₂) h) = CategoryStruct.comp (ofMkLEMk f g ) h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLEMk_comp_ofMkLE {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) [Mono f] (g : A₂ B) [Mono g] (X : Subobject B) (h₁ : mk f mk g) (h₂ : mk g X) :
                            CategoryStruct.comp (ofMkLEMk f g h₁) (ofMkLE g X h₂) = ofMkLE f X
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLEMk_comp_ofMkLE_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) [Mono f] (g : A₂ B) [Mono g] (X : Subobject B) (h₁ : mk f mk g) (h₂ : mk g X) {Z : C} (h : underlying.obj X Z) :
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLEMk_comp_ofMkLEMk {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ A₃ : C} (f : A₁ B) [Mono f] (g : A₂ B) [Mono g] (h : A₃ B) [Mono h] (h₁ : mk f mk g) (h₂ : mk g mk h) :
                            CategoryStruct.comp (ofMkLEMk f g h₁) (ofMkLEMk g h h₂) = ofMkLEMk f h
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLEMk_comp_ofMkLEMk_assoc {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ A₃ : C} (f : A₁ B) [Mono f] (g : A₂ B) [Mono g] (h : A₃ B) [Mono h] (h₁ : mk f mk g) (h₂ : mk g mk h) {Z : C} (h✝ : A₃ Z) :
                            @[simp]
                            theorem CategoryTheory.Subobject.ofLE_refl {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X : Subobject B) :
                            X.ofLE X = CategoryStruct.id (underlying.obj X)
                            @[simp]
                            theorem CategoryTheory.Subobject.ofMkLEMk_refl {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ : C} (f : A₁ B) [Mono f] :
                            def CategoryTheory.Subobject.isoOfEq {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y : Subobject B) (h : X = Y) :

                            An equality of subobjects gives an isomorphism of the corresponding objects. (One could use underlying.mapIso (eqToIso h)) here, but this is more readable.)

                            Equations
                            • X.isoOfEq Y h = { hom := X.ofLE Y , inv := Y.ofLE X , hom_inv_id := , inv_hom_id := }
                            Instances For
                              @[simp]
                              theorem CategoryTheory.Subobject.isoOfEq_hom {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y : Subobject B) (h : X = Y) :
                              (X.isoOfEq Y h).hom = X.ofLE Y
                              @[simp]
                              theorem CategoryTheory.Subobject.isoOfEq_inv {C : Type u₁} [Category.{v₁, u₁} C] {B : C} (X Y : Subobject B) (h : X = Y) :
                              (X.isoOfEq Y h).inv = Y.ofLE X
                              def CategoryTheory.Subobject.isoOfEqMk {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (h : X = mk f) :
                              underlying.obj X A

                              An equality of subobjects gives an isomorphism of the corresponding objects.

                              Equations
                              Instances For
                                @[simp]
                                theorem CategoryTheory.Subobject.isoOfEqMk_hom {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (h : X = mk f) :
                                (X.isoOfEqMk f h).hom = X.ofLEMk f
                                @[simp]
                                theorem CategoryTheory.Subobject.isoOfEqMk_inv {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (X : Subobject B) (f : A B) [Mono f] (h : X = mk f) :
                                (X.isoOfEqMk f h).inv = ofMkLE f X
                                def CategoryTheory.Subobject.isoOfMkEq {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (f : A B) [Mono f] (X : Subobject B) (h : mk f = X) :
                                A underlying.obj X

                                An equality of subobjects gives an isomorphism of the corresponding objects.

                                Equations
                                Instances For
                                  @[simp]
                                  theorem CategoryTheory.Subobject.isoOfMkEq_hom {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (f : A B) [Mono f] (X : Subobject B) (h : mk f = X) :
                                  (isoOfMkEq f X h).hom = ofMkLE f X
                                  @[simp]
                                  theorem CategoryTheory.Subobject.isoOfMkEq_inv {C : Type u₁} [Category.{v₁, u₁} C] {B A : C} (f : A B) [Mono f] (X : Subobject B) (h : mk f = X) :
                                  (isoOfMkEq f X h).inv = X.ofLEMk f
                                  def CategoryTheory.Subobject.isoOfMkEqMk {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) (g : A₂ B) [Mono f] [Mono g] (h : mk f = mk g) :
                                  A₁ A₂

                                  An equality of subobjects gives an isomorphism of the corresponding objects.

                                  Equations
                                  Instances For
                                    @[simp]
                                    theorem CategoryTheory.Subobject.isoOfMkEqMk_hom {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) (g : A₂ B) [Mono f] [Mono g] (h : mk f = mk g) :
                                    (isoOfMkEqMk f g h).hom = ofMkLEMk f g
                                    @[simp]
                                    theorem CategoryTheory.Subobject.isoOfMkEqMk_inv {C : Type u₁} [Category.{v₁, u₁} C] {B A₁ A₂ : C} (f : A₁ B) (g : A₂ B) [Mono f] [Mono g] (h : mk f = mk g) :
                                    (isoOfMkEqMk f g h).inv = ofMkLEMk g f

                                    Any functor MonoOver X ⥤ MonoOver Y descends to a functor Subobject X ⥤ Subobject Y, because MonoOver Y is thin.

                                    Equations
                                    Instances For
                                      theorem CategoryTheory.Subobject.lower_iso {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (F₁ F₂ : Functor (MonoOver X) (MonoOver Y)) (h : F₁ F₂) :
                                      lower F₁ = lower F₂

                                      Isomorphic functors become equal when lowered to Subobject. (It's not as evil as usual to talk about equality between functors because the categories are thin and skeletal.)

                                      @[simp]
                                      def CategoryTheory.Subobject.lowerAdjunction {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] {A : C} {B : D} {L : Functor (MonoOver A) (MonoOver B)} {R : Functor (MonoOver B) (MonoOver A)} (h : L R) :

                                      An adjunction between MonoOver A and MonoOver B gives an adjunction between Subobject A and Subobject B.

                                      Equations
                                      Instances For

                                        An equivalence between MonoOver A and MonoOver B gives an equivalence between Subobject A and Subobject B.

                                        Equations
                                        • One or more equations did not get rendered due to their size.
                                        Instances For
                                          @[simp]
                                          @[simp]
                                          @[simp]
                                          theorem CategoryTheory.Subobject.lowerEquivalence_functor {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] {A : C} {B : D} (e : MonoOver A MonoOver B) :
                                          (lowerEquivalence e).functor = lower e.functor
                                          @[simp]
                                          theorem CategoryTheory.Subobject.lowerEquivalence_inverse {C : Type u₁} [Category.{v₁, u₁} C] {D : Type u₂} [Category.{v₂, u₂} D] {A : C} {B : D} (e : MonoOver A MonoOver B) :
                                          (lowerEquivalence e).inverse = lower e.inverse

                                          When C has pullbacks, a morphism f : X ⟶ Y induces a functor Subobject Y ⥤ Subobject X, by pulling back a monomorphism along f.

                                          Equations
                                          Instances For
                                            theorem CategoryTheory.Subobject.pullback_comp {C : Type u₁} [Category.{v₁, u₁} C] {X Y Z : C} [Limits.HasPullbacks C] (f : X Y) (g : Y Z) (x : Subobject Z) :
                                            (pullback (CategoryStruct.comp f g)).obj x = (pullback f).obj ((pullback g).obj x)
                                            def CategoryTheory.Subobject.map {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (f : X Y) [Mono f] :

                                            We can map subobjects of X to subobjects of Y by post-composition with a monomorphism f : X ⟶ Y.

                                            Equations
                                            Instances For
                                              theorem CategoryTheory.Subobject.map_comp {C : Type u₁} [Category.{v₁, u₁} C] {X Y Z : C} (f : X Y) (g : Y Z) [Mono f] [Mono g] (x : Subobject X) :
                                              (map (CategoryStruct.comp f g)).obj x = (map g).obj ((map f).obj x)

                                              Isomorphic objects have equivalent subobject lattices.

                                              Equations
                                              Instances For

                                                In fact, there's a type level bijection between the subobjects of isomorphic objects, which preserves the order.

                                                Equations
                                                • One or more equations did not get rendered due to their size.
                                                Instances For
                                                  @[simp]
                                                  theorem CategoryTheory.Subobject.mapIsoToOrderIso_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (e : X Y) (P : Subobject X) :
                                                  (mapIsoToOrderIso e) P = (map e.hom).obj P
                                                  @[simp]
                                                  theorem CategoryTheory.Subobject.mapIsoToOrderIso_symm_apply {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} (e : X Y) (Q : Subobject Y) :
                                                  (mapIsoToOrderIso e).symm Q = (map e.inv).obj Q
                                                  @[simp]
                                                  theorem CategoryTheory.Subobject.pullback_map_self {C : Type u₁} [Category.{v₁, u₁} C] {X Y : C} [Limits.HasPullbacks C] (f : X Y) [Mono f] (g : Subobject X) :
                                                  (pullback f).obj ((map f).obj g) = g
                                                  theorem CategoryTheory.Subobject.map_pullback {C : Type u₁} [Category.{v₁, u₁} C] [Limits.HasPullbacks C] {X Y Z W : C} {f : X Y} {g : X Z} {h : Y W} {k : Z W} [Mono h] [Mono g] (comm : CategoryStruct.comp f h = CategoryStruct.comp g k) (t : Limits.IsLimit (Limits.PullbackCone.mk f g comm)) (p : Subobject Y) :
                                                  (map g).obj ((pullback f).obj p) = (pullback k).obj ((map h).obj p)

                                                  The functor from subobjects of X to subobjects of Y given by sending the subobject S to its "image" under f, usually denoted $\exists_f$. For instance, when C is the category of types, viewing Subobject X as Set X this is just Set.image f.

                                                  This functor is left adjoint to the pullback f functor (shown in existsPullbackAdj) provided both are defined, and generalises the map f functor, again provided it is defined.

                                                  Equations
                                                  Instances For

                                                    When f : X ⟶ Y is a monomorphism, exists f agrees with map f.