{-
IDENTITIES VIA IDEMPOTENT EQUIVALENCES
complementing the paper
Internal ∞-Categorical Models of Dependent Type Theory
Nicolai Kraus, 2020
Summary. The standard definition of a semicategory consists
of objects, morphisms, composition, and associativity. How
can we say that a given semicategory has identities, i.e. is
a category? The standard answer is to say that the
semicategory has identities which satisfy left-neutrality and
right-neutrality.
In this short note, I present another definition of the
statement "has-identities" (a.k.a. "is-a-category").
The motivation is that I want "is-a-category" to be a
*property* of a semicategory rather than *data*, i.e. I want
it to be a proposition a.k.a. proof-irrelevant. For a semi-
category where the morphisms form a set, this is already the
case for the standard answer above. However, without this
additional assumption, the standard answer is data.
My new definition of "is-a-category" is "for every object x,
there is an endomorphism i ∈ Hom(x,x) such that i is
an idempotent equivalence". This Agda file shows that this
is a propositional property. I also show below that a semi-
category has idempotent equivalences if and only if it has
standard identities.
This Agda file is available on GitHub at
https://github.com/nicolaikraus/idempotentEquivalences
The source code can be type-checked with Agda 2.6.1 (or Agda
2.6.2) and makes use of the library HoTT-Agda, using Andrew
Swan's fork that is 2.6.1-compatible:
https://github.com/awswan/HoTT-Agda/tree/agda-2.6.1-compatible
-}
{-# OPTIONS --without-K #-}
module Identities where
open import HoTT public
open import Iff
{- A *wild semicategory*, sometimes also known as a *wild
semigroupoid*, consists of:
- Ob: a type of objects;
- Hom: a type family of morphisms (for increased
generality possibly in another universe than Ob, but
it doesn't matter);
- and an associative binary operation _⋄_.
This is of course just a "category without identities".
Note that we do *NOT* ask for set-truncation; Ob and Hom
are arbitrary types/type families!
-}
record SemiCategory j₁ j₂ : Type (lsucc (lmax j₁ j₂)) where
infixr 40 _⋄_
field
Ob : Type j₁
Hom : Ob → Ob → Type j₂
_⋄_ : ∀ {x y z} → Hom y z → Hom x y → Hom x z
ass : ∀ {x y z w} {f : Hom z w} {g : Hom y z} {h : Hom x y}
→ (f ⋄ g) ⋄ h == f ⋄ (g ⋄ h)
{- For the rest of this file, we assume that C is a given
fixed wild semicategory. We work inside a module which
fixes C.
-}
module _ {j₁ j₂} (C : SemiCategory j₁ j₂) where
open SemiCategory C
j = lmax j₁ j₂
{- A "standard identity" is a morphism which is left and
right neutral. This is the normal, well-known definition.
-}
module _ {y : Ob} (i : Hom y y) where
is-left-neutral = {x : Ob} (f : Hom x y) → i ⋄ f == f
is-right-neutral = {z : Ob} (g : Hom y z) → g ⋄ i == g
is-standard-id = is-left-neutral × is-right-neutral
{- We say that a semicategory (here, the semicategory C)
is a *standard category* if every object comes with
a morphism which is left- and right-neutral. This is
the usual definition of what it means to "have
identities". -}
is-standard-category = (x : Ob) → Σ (Hom x x) is-standard-id
{- The problem with these identities is that "having
standard identities" is not a propositional property:
it is structure, i.e. C can have standard identities in
multiple different ways. This makes "having standard
identities" ill-behaved, as demonstrated in the paper
(see Example 9, initial model in the wild/incoherent
setting).
We now develop an alternative, and better, definition
of identities, namely *idempotent equivalences*, and
this will lead to a propositional property.
-}
is-idpt : {x : Ob} (f : Hom x x) → Type j₂
is-idpt f = f ⋄ f == f
{- Note: `is-idpt f` a.k.a. "f is idempotent" is not
necessarily a proposition (as 'Hom x x' might not be a
set). -}
is-eqv : {x y : Ob} (g : Hom x y) → Type j
is-eqv {x} {y} g = ((z : Ob) → is-equiv λ (h : Hom y z) → h ⋄ g)
× ((w : Ob) → is-equiv λ (f : Hom w x) → g ⋄ f)
{- Note: `is-eqv g` a.k.a. "g is an equivalence" is a
proposition. This is automatic, as `is-equiv` (the
analogous property for types) is a proposition. -}
is-idpt+eqv : {x : Ob} (i : Hom x x) → Type j
is-idpt+eqv i = is-idpt i × is-eqv i
{- Note: `is-idpt+eqv i` a.k.a. "being idempotent and an
equivalence" is still not not a proposition!
E.g. in the wild semicategory of types and functions,
the identity on the circle S¹ is an idempotent
equivalence in ℤ-many ways. -}
{- I define "being a good category" as a property of a
semicategory. The property states that each object
comes with an idempotent equivalence. -}
is-good-category = (x : Ob) → Σ (Hom x x) is-idpt+eqv
{- Note: "being a category" a.k.a. "having idempotent
equivalences" *is* a proposition, but this is not
trivial. The main goal of the current file is to prove
this result.
First, we show that an idempotent equivalence is also a
standard identity. -}
module idpt+eqv→std {y : Ob} (i : Hom y y)
(idpt+eqv : is-idpt+eqv i) where
idpt = fst idpt+eqv
eqv = snd idpt+eqv
{- The idempotent equivalence i is left neutral: -}
left-neutral : is-left-neutral i
left-neutral f = w/o-i
where
with-i : i ⋄ (i ⋄ f) == i ⋄ f
with-i =
i ⋄ (i ⋄ f)
=⟨ ! ass ⟩
(i ⋄ i) ⋄ f
=⟨ ap (λ g → g ⋄ f) idpt ⟩
i ⋄ f
=∎
w/o-i : i ⋄ f == f
w/o-i = is-equiv.g
(ap-is-equiv {f = λ g → i ⋄ g} (snd eqv _) (i ⋄ f) f)
with-i
{- The proof of right neutrality is completely symmetric
to the above. Here is the shortened version: -}
right-neutral : is-right-neutral i
right-neutral g =
is-equiv.g
(ap-is-equiv (fst eqv _) (g ⋄ i) g)
(ass ∙ ap (λ f → g ⋄ f) idpt)
{- The above shows that an idempotent equivalence is a
standard equivalence. A "summary statement" will be given
later.
We start the opposite direction with very simple
observation: Any left-neutral endomorphism is idempotent. -}
left-neutral→idempotent : ∀{y} (f : Hom y y) →
is-left-neutral f → is-idpt f
left-neutral→idempotent f l-ntrl = l-ntrl f
{- Of course, the same is true for right-neutral
endomorphisms, but the above suffices for us.
We are now ready to prove that a standard identity is an
idempotent equivalence. -}
module std→idpt+eqv {y : Ob} (i : Hom y y)
(std-id : is-standard-id i) where
l-ntrl = fst std-id
r-ntrl = snd std-id
eqv : is-eqv i
eqv = (λ z → is-eq (λ g → g ⋄ i) (λ h → h) r-ntrl r-ntrl)
,
λ x → is-eq (λ f → i ⋄ f) (λ h → h) l-ntrl l-ntrl
idpt : is-idpt i
idpt = left-neutral→idempotent i l-ntrl
{- "Summary statement":
We now have everything in place to state that an
endomorphism `i` is an idempotent equivalence if and
only if it is a standard identity. -}
idpt+eqv⇔std : ∀{y} → (i : Hom y y) →
is-idpt+eqv i ⇔ is-standard-id i
idpt+eqv⇔std i = (⇒ , ⇐)
where
⇒ : is-idpt+eqv i → is-standard-id i
⇒ p = idpt+eqv→std.left-neutral i p , idpt+eqv→std.right-neutral i p
⇐ : is-standard-id i → is-idpt+eqv i
⇐ p = std→idpt+eqv.idpt i p , std→idpt+eqv.eqv i p
{- This implies that any two idempotent equivalences are equal. -}
idpt+eqv-unique : ∀{y} → (i₁ i₂ : Hom y y) →
is-idpt+eqv i₁ → is-idpt+eqv i₂ → i₁ == i₂
idpt+eqv-unique i₁ i₂ p₁ p₂ =
i₁
=⟨ ! (idpt+eqv→std.right-neutral i₂ p₂ i₁) ⟩
i₁ ⋄ i₂
=⟨ idpt+eqv→std.left-neutral i₁ p₁ i₂ ⟩
i₂
=∎
{- A useful property is 2-out-of-3 for equivalences:
If we have g ∘ f == h and two out of the three maps
{f, g, h} are equivalences, then so is the third.
Here, we only show (and need) one instance, namely
that it suffices if g and h are equivalences.
This is easy but a bit tedious. -}
eqv-2-out-of-3 : ∀{w x y} (f : Hom w x) (g : Hom x y)
→ is-eqv g → is-eqv (g ⋄ f) → is-eqv f
eqv-2-out-of-3 {w} {x} {y} f g (p₁ , p₂) (q₁ , q₂) =
(λ _ → -⋄f-is-eqv)
,
(λ _ → f⋄-is-eqv)
where
{- first part -}
-⋄f : {y : Ob} → Hom x y → Hom w y
-⋄f = λ h → h ⋄ f
-⋄g⁻¹ : {z : Ob} → Hom x z → Hom y z
-⋄g⁻¹ = is-equiv.g (p₁ _)
-⋄gf : {z : Ob} → Hom y z → Hom w z
-⋄gf = λ h → h ⋄ (g ⋄ f)
eq' : ∀{z} → -⋄gf {z} ∘ -⋄g⁻¹ == -⋄f {z}
eq' {z} = λ= (λ h →
(-⋄g⁻¹ h) ⋄ (g ⋄ f)
=⟨ ! ass ⟩
((-⋄g⁻¹ h) ⋄ g) ⋄ f
=⟨ ap (λ k → k ⋄ f) (is-equiv.f-g (p₁ _) _) ⟩
h ⋄ f
=∎
)
-⋄g⁻¹-equiv : ∀{z} → is-equiv (-⋄g⁻¹ {z})
-⋄g⁻¹-equiv = is-equiv-inverse (p₁ _)
-⋄f-is-eqv : ∀{z} → is-equiv (-⋄f {z})
-⋄f-is-eqv {z} = transport is-equiv eq' (q₁ _ ∘ise -⋄g⁻¹-equiv)
{- second part -}
f⋄- : {v : Ob} → Hom v w → Hom v x
f⋄- = λ h → f ⋄ h
g⁻¹⋄- : {v : Ob} → Hom v y → Hom v x
g⁻¹⋄- = is-equiv.g {f = λ h → g ⋄ h} (p₂ _)
gf⋄- : {v : Ob} → Hom v w → Hom v y
gf⋄- = λ h → (g ⋄ f) ⋄ h
eq : ∀{v} → g⁻¹⋄- {v} ∘ gf⋄- == f⋄- {v}
eq {v} = λ= (λ h →
(g⁻¹⋄- ∘ gf⋄-) h
=⟨ idp ⟩
g⁻¹⋄- ((g ⋄ f) ⋄ h)
=⟨ ap g⁻¹⋄- ass ⟩
g⁻¹⋄- (g ⋄ (f ⋄ h))
=⟨ is-equiv.g-f (p₂ _) (f ⋄ h) ⟩
(f ⋄ h)
=⟨ idp ⟩
f⋄- h
=∎
)
g⁻¹⋄-equiv : ∀{v} → is-equiv (g⁻¹⋄- {v})
g⁻¹⋄-equiv {v} = is-equiv-inverse (p₂ _)
f⋄-is-eqv : ∀{v} → is-equiv (f⋄- {v})
f⋄-is-eqv {v} = transport is-equiv eq (g⁻¹⋄-equiv ∘ise q₂ _)
{- Given an equivalence, we can define an idempotent
equivalence. This construction was already presented in
"Higher Univalent Categories via Complete Semi-Segal Types"
(Capriotti-Kraus, POPL'18) and is motivated by work of
Harpaz and Lurie in higher dimensional category theory. -}
module I {y z} (e : Hom y z) (p : is-eqv e) where
e⁻¹⋄- : ∀{x} → Hom x z → Hom x y
e⁻¹⋄- = is-equiv.g (snd p _)
e⋄- : ∀{x} → Hom x y → Hom x z
e⋄- = _⋄_ e
I : Hom y y
I = e⁻¹⋄- e
{- In comments, we write I(e) for the I constructed above
(e is a module parameter).
It is easy to see that I(e) is right neutral for e: -}
e⋄I : e ⋄ I == e
e⋄I = is-equiv.f-g (snd p _) e
{- Also easy (but more work):
I is left neutral in general. -}
l-ntrl : is-left-neutral I
l-ntrl f =
I ⋄ f
=⟨ ! (is-equiv.g-f (snd p _) _) ⟩
e⁻¹⋄- (e⋄- (I ⋄ f))
=⟨ ap e⁻¹⋄- (! ass) ⟩
e⁻¹⋄- ((e ⋄ I) ⋄ f)
=⟨ ap (λ g → e⁻¹⋄- (g ⋄ f)) e⋄I ⟩
e⁻¹⋄- (e ⋄ f)
=⟨ is-equiv.g-f (snd p _) _ ⟩
f
=∎
{- We do not need the other analogous properties. This
is enough to see that I is an idempotent equivalence. -}
I-is-idpt+eqv : is-idpt+eqv I
I-is-idpt+eqv = left-neutral→idempotent
I l-ntrl ,
eqv-2-out-of-3 I e p (transport is-eqv (! e⋄I) p)
{- If an endomorphism e is an equivalence, then it is
idempotent if and only if it is equal to I(e); and
this connection even forms an equivalence of types
-}
module e-vs-I {y : Ob} (e : Hom y y) (p : is-eqv e) where
open I
e-I-idpt : (e == I e p) ≃ is-idpt e
e-I-idpt =
e == I e p
≃⟨ ap-equiv (e⋄- e p , snd p _) e (I e p) ⟩
e ⋄ e == e ⋄ I e p
≃⟨ transport (λ expr →
(e ⋄ e == e ⋄ I e p) ≃ (e ⋄ e == expr)) (e⋄I e p) (ide _) ⟩
e ⋄ e == e
≃⟨ ide _ ⟩
is-idpt e
≃∎
{- Finally, put all the previous lemmas together to show that
the type of idempotent equivalences is a proposition. We do
this by showing that, if we assume that this type has one
element i₀, then i₀ is the only element. -}
module unique (y : Ob) (i₀ : Hom y y)
(idpt+eqv₀ : is-idpt+eqv i₀) where
open I
open e-vs-I
idpt₀ = fst idpt+eqv₀
eqv₀ = snd idpt+eqv₀
{- Using a chain of equivalences, we show that the type
of idempotent equivalences is trivial (given one
single idempotent equivalence, see the module
parameter). -}
idpt-to-=i₀ =
Σ (Hom y y) (λ i → is-idpt+eqv i)
≃⟨ ide {i = j} _ ⟩
Σ (Hom y y) (λ i → is-idpt i × is-eqv i)
≃⟨ Σ-emap-r (λ i → ×-comm) ⟩
Σ (Hom y y) (λ i → Σ (is-eqv i) λ eqv → (is-idpt i))
≃⟨ Σ-emap-r (λ i → Σ-emap-r λ eqv → e-I-idpt i eqv ⁻¹) ⟩
Σ (Hom y y) (λ i → Σ (is-eqv i) λ eqv → i == I i eqv)
≃⟨ Σ-emap-r (λ i → Σ-emap-r λ p → coe-equiv
(ap (λ i' → (i == i')) (
idpt+eqv-unique (I i p)
i₀
(I-is-idpt+eqv i p)
idpt+eqv₀))) ⟩
Σ (Hom y y) (λ i → Σ (is-eqv i) λ _ → i == i₀)
≃⟨ Σ-emap-r (λ i → ×-comm) ⟩
Σ (Hom y y) (λ i → Σ (i == i₀) λ _ → (is-eqv i))
≃⟨ Σ-assoc ⁻¹ ⟩
(Σ (Σ (Hom y y) (λ i → (i == i₀))) λ ip → (is-eqv (fst ip)))
≃⟨ Σ-emap-l {A = Unit}
{B = Σ (Hom y y) λ i → (i == i₀)}
(λ ip → (is-eqv (fst ip)))
(contr-equiv-Unit (pathto-is-contr i₀) ⁻¹) ⁻¹ ⟩
(Σ Unit λ _ → is-eqv i₀)
≃⟨ Σ₁-Unit ⟩
is-eqv i₀
≃⟨ contr-equiv-Unit (inhab-prop-is-contr eqv₀) ⟩
Unit
≃∎
{- In other words, the type of idempotent equivalences
is contractible. -}
unique-idpt+eqv : is-contr (Σ (Hom y y) (λ i → is-idpt+eqv i))
unique-idpt+eqv = equiv-preserves-level (idpt-to-=i₀ ⁻¹)
{- THEOREMS
========
With the help of the above lemmas, we show our main
results:
(1) A semicategory is a good category if and only if
it is a standard category.
(2) "Being a good category" is a propositional (proof-
irrelevant) property of a semicategory.
-}
good-iff-standard : ∀ {j₁ j₂} (C : SemiCategory j₁ j₂) →
is-good-category C ⇔ is-standard-category C
good-iff-standard C = ⇒ , ⇐
where
⇒ : is-good-category C → is-standard-category C
⇒ igc x = fst (igc x) , fst (idpt+eqv⇔std C _) (snd (igc x))
⇐ : is-standard-category C → is-good-category C
⇐ isc x = fst (isc x) , snd (idpt+eqv⇔std C _) (snd (isc x))
goodness-is-prop : ∀ {j₁ j₂} (C : SemiCategory j₁ j₂) →
is-prop (is-good-category C)
goodness-is-prop C = inhab-to-contr-is-prop λ idpt+eqvs →
WeakFunext.weak-λ= λ y → unique.unique-idpt+eqv C y
(fst (idpt+eqvs y))
(snd (idpt+eqvs y))