Anna Williams 29 January 2026

Definition of precategory.

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import Categories.Notation.Wild
open import UF.Sets
open import UF.Sets-Properties
open import UF.Base
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Subsingletons-Properties
open import UF.FunExt

open import Notation.UnderlyingType
open import MLTT.Spartan
open import Categories.Wild

module Categories.Pre where

\end{code}

Precategories are exactly wild categories where the homs are sets. This
property is given by the below.

\begin{code}

module _ {𝓤 𝓥 : Universe} (W : WildCategory 𝓤 𝓥) where
 open WildCategoryNotation W

 is-precategory : (𝓤  𝓥) ̇
 is-precategory = (a b : obj W)  is-set (hom a b)

 being-precat-is-prop : (fe : Fun-Ext)
                       is-prop (is-precategory)
 being-precat-is-prop fe = Π₂-is-prop fe  _ _  being-set-is-prop fe)

\end{code}

We can now define the notion of a precategory.

\begin{code}

Precategory : (𝓤 𝓥 : Universe)  (𝓤  𝓥) ̇
Precategory 𝓤 𝓥 = Σ W  WildCategory 𝓤 𝓥 , is-precategory W

\end{code}

This gives the object notation for precategories and projections from the
sigma type.

\begin{code}

instance
 precatobj : {𝓤 𝓥 : Universe}  OBJ (Precategory 𝓤 𝓥) (𝓤 ̇ )
 obj {{precatobj}} (P , _) = WildCategory.obj P

instance
  underlying-wildcategory-of-precategory
   : {𝓤 𝓥 : Universe}
    Underlying-Type (Precategory 𝓤 𝓥) (WildCategory 𝓤 𝓥)
  ⟨_⟩ {{underlying-wildcategory-of-precategory}} (P , _) = P

hom-is-set : (P : Precategory 𝓤 𝓥)
             {a b : obj P}
            is-set (WildCategory.hom  P  a b)
hom-is-set (_ , p) {a} {b} = p a b

\end{code}

We now show that in a precategory, for any given homomorphism, being an
isomorphism is a (mere) proposition. We argue that inverses are unique,
and then since the type of homomorphisms between two objects is a set,
equality between any two homomorphisms is a proposition, so our left and
right inverse equalities are a proposition.

\begin{code}

module _ (P : Precategory 𝓤 𝓥) where
 open WildCategoryNotation  P 

 inverses-are-lc : {a b : obj P}
                   {f : hom a b}
                   (i j : inverse f)
                   i    j 
                  i  j
 inverses-are-lc i j refl = ap₂  l r   i  , l , r) l-eq r-eq
  where
   l-eq :  i ⌟-is-left-inverse   j ⌟-is-left-inverse
   l-eq = hom-is-set P  i ⌟-is-left-inverse  j ⌟-is-left-inverse

   r-eq :  i ⌟-is-right-inverse   j ⌟-is-right-inverse
   r-eq = hom-is-set P  i ⌟-is-right-inverse  j ⌟-is-right-inverse

 being-iso-is-prop : {a b : obj P}
                     (f : hom a b)
                    is-prop (inverse f)
 being-iso-is-prop f i j = inverses-are-lc i j (at-most-one-inverse i j)

\end{code}

Following this, we can see that the type of isomorphisms is a set.

\begin{code}

 isomorphism-type-is-set : {a b : obj P}
                          is-set (a  b)
 isomorphism-type-is-set = Σ-is-set (hom-is-set P)
                                     f  props-are-sets (being-iso-is-prop f))

\end{code}