module Cat.Gaunt where
Gaunt (pre)categories🔗
A precategory is gaunt if it is univalent and strict: its type of objects is a set, and identity in is equivalent to isomorphism in This is a truncation condition on the isomorphisms which must all be trivial.
record is-gaunt {o ℓ} (C : Precategory o ℓ) : Type (o ⊔ ℓ) where
field
: is-category C
has-category : is-strict C
has-strict
open Univalent.path→iso has-category hiding (hlevel) public
open StrictIds has-category has-strict renaming (K to K-iso) public
unquoteDecl H-Level-is-gaunt = declare-record-hlevel 1 H-Level-is-gaunt (quote is-gaunt)
As one would expect, being gaunt is property of a category.
module _ {o â„“} {C : Precategory o â„“} (gaunt : is-gaunt C) where
open is-gaunt gaunt
open Cat.Reasoning C
: ∀ {x y} → is-prop (x ≅ y)
iso-is-prop = hlevel 1 ⦃ R-H-level ⦄ iso-is-prop
This implies that gaunt categories are skeletal: Since there is at most one isomorphism then given we can apply unique choice to retrieve the underlying map.
: is-skeletal C
gaunt→skeletal = set-identity-system (λ _ _ → squash) $
gaunt→skeletal (has-strict _ _) (has-category .to-path) ∥-∥-rec
Furthermore, if a category is skeletal and univalent, it is gaunt.
skeletal+category→gaunt: ∀ {o ℓ} {C : Precategory o ℓ}
→ is-skeletal C
→ is-category C
→ is-gaunt C
.is-gaunt.has-category = cat
skeletal+category→gaunt skel cat .is-gaunt.has-strict = skeletal→strict _ skel skeletal+category→gaunt skel cat
This implies that gaunt categories are precisely the skeletal univalent categories.
skeletal-category≃gaunt: ∀ {o ℓ} {C : Precategory o ℓ}
→ (is-skeletal C × is-category C) ≃ is-gaunt C
= prop-ext (hlevel 1) (hlevel 1)
skeletal-category≃gaunt (λ { (skel , cat) → skeletal+category→gaunt skel cat })
(λ gaunt → gaunt→skeletal gaunt , has-category gaunt)
where open is-gaunt
If a category is skeletal and has only trivial automorphisms, then it is gaunt.
skeletal+trivial-automorphisms→gaunt: ∀ {o ℓ} {C : Precategory o ℓ}
→ is-skeletal C
→ (∀ {x} → (f : Isomorphism C x x) → f ≡ id-iso C)
→ is-gaunt C
To show that
is gaunt, it suffices to show that isomorphisms of
are equivalent to paths.
is skeletal, so it is straightforward to construct an inverse to path→iso
by applying to-path
to the truncation of an
isomorphism. Showing that this is a right inverse is straightforward, as
is strict.
{C = C} skel trivial-aut =
skeletal+trivial-automorphisms→gaunt
skeletal+category→gaunt skel $(Iso→Equiv path-iso)
equiv-path→identity-system where
open is-gaunt
: ∀ {x y} → Iso (Isomorphism C x y) (x ≡ y)
path-iso .fst f = skel .to-path (inc f)
path-iso .snd .is-iso.inv f = path→iso f
path-iso .snd .is-iso.rinv _ =
path-iso _ _ _ _ skeletal→strict C skel
To see that this is a left inverse, we can use the fact that truncated isomorphisms form an identity system to contract the iso down into an automorphism. However, all automorphisms are trivial, which allows us to finish off the proof.
{x = x} .snd .is-iso.linv f =
path-iso
IdsJ skel(λ y' ∥f∥ → ∀ (f : Isomorphism C x y') → path→iso (skel .to-path ∥f∥) ≡ f)
(λ f → trivial-aut _ ∙ sym (trivial-aut _))
(inc f) f