module Cat.Diagram.Initial.Strict where
module _ {o h} (C : Precategory o h) where
open Cat.Reasoning C
open Initial
Strict initial objects🔗
An initial object is said to be strict if every morphism into it is an isomorphism. This is a categorical generalization of the fact that if one can write a function then must itself be empty.
This is an instance of the more general notion of van Kampen colimits.
: Initial C → Type _
is-strict-initial = ∀ x → (f : Hom x (i .bot)) → is-invertible f
is-strict-initial i
record Strict-initial : Type (o ⊔ h) where
field
: Initial C
initial : is-strict-initial initial has-is-strict
Strictness is a property of, not structure on, an initial object.
: ∀ i → is-prop (is-strict-initial i)
is-strict-initial-is-prop = hlevel 1 is-strict-initial-is-prop i
As maps out of initial objects are unique, it suffices to show that every map for every to establish that is a strict initial object.
make-is-strict-initial: (i : Initial C)
→ (∀ x → (f : Hom x (i .bot)) → (¡ i) ∘ f ≡ id)
→ is-strict-initial i
=
make-is-strict-initial i p x f (¡ i) (¡-unique₂ i (f ∘ ¡ i) id) (p x f) make-invertible
Strict initial objects are subterminal objects: given two maps it suffices to prove that but those are maps out of so they are equal.
strict-initial→subterminal: ∀ {i : Initial C}
→ is-strict-initial i
→ is-subterminal C (i .bot)
{i} s X f g =
strict-initial→subterminal .to (s _ g) (¡-unique₂ i _ id) ∙ idl _ pre-invr