Coherently invertible maps
Content created by Fredrik Bakke, Egbert Rijke, Jonathan Prieto-Cubides, Julian KG, Raymond Baker, fernabnor and louismntnu.
Created on 2022-02-07.
Last modified on 2024-10-27.
module foundation-core.coherently-invertible-maps where
Imports
open import foundation.action-on-identifications-binary-functions open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.homotopy-algebra open import foundation.universe-levels open import foundation.whiskering-higher-homotopies-composition open import foundation.whiskering-homotopies-composition open import foundation-core.commuting-squares-of-homotopies open import foundation-core.function-types open import foundation-core.homotopies open import foundation-core.identity-types open import foundation-core.invertible-maps open import foundation-core.retractions open import foundation-core.sections open import foundation-core.whiskering-homotopies-concatenation
Idea
A (two-sided) inverse for a map
f : A → B
is a map g : B → A
equipped with
homotopies S : f ∘ g ~ id
and
R : g ∘ f ~ id
. Such data, however is structure on
the map f
, and not generally a property.
One way to make the type of inverses into a property is by adding a single
coherence condition between the homotopies of the inverse, asking that the
following diagram commmutes
S ·r f
--------->
f ∘ g ∘ f f.
--------->
f ·l R
We call such data a
coherently invertible map¶. I.e., a
coherently invertible map f : A → B
is a map equipped with a two-sided inverse
and this additional coherence.
There is also the alternative coherence condition we could add
R ·r g
--------->
g ∘ f ∘ g g.
--------->
g ·l S
We will colloquially refer to invertible maps equipped with this coherence as transpose coherently invertible maps.
Note. Coherently invertible maps are referred to as half adjoint equivalences¶ in [UF13].
On this page we will prove that every two-sided inverse g
of f
can be
promoted to a coherent two-sided inverse. Thus, for most properties of
coherently invertible maps, it suffices to consider the data of a two-sided
inverse. However, this coherence construction requires us to replace the section
homotopy (or retraction homotopy). For this reason we also give direct
constructions showing
- The identity map is coherently invertible.
- The composite of two coherently invertible maps is coherently invertible.
- The inverse of a coherently invertible map is coherently invertible.
- Every map homotopic to a coherently invertible map is coherently invertible.
- The 3-for-2 property of coherently invertible maps.
Each of these constructions appropriately preserve the data of the underlying two-sided inverse.
Definition
The predicate of being a coherently invertible map
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where coherence-is-coherently-invertible : (f : A → B) (g : B → A) (G : f ∘ g ~ id) (H : g ∘ f ~ id) → UU (l1 ⊔ l2) coherence-is-coherently-invertible f g G H = G ·r f ~ f ·l H is-coherently-invertible : (A → B) → UU (l1 ⊔ l2) is-coherently-invertible f = Σ ( B → A) ( λ g → Σ ( f ∘ g ~ id) ( λ G → Σ ( g ∘ f ~ id) ( λ H → coherence-is-coherently-invertible f g G H))) module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-coherently-invertible f) where map-inv-is-coherently-invertible : B → A map-inv-is-coherently-invertible = pr1 H is-section-map-inv-is-coherently-invertible : is-section f map-inv-is-coherently-invertible is-section-map-inv-is-coherently-invertible = pr1 (pr2 H) is-retraction-map-inv-is-coherently-invertible : is-retraction f map-inv-is-coherently-invertible is-retraction-map-inv-is-coherently-invertible = pr1 (pr2 (pr2 H)) coh-is-coherently-invertible : coherence-is-coherently-invertible f ( map-inv-is-coherently-invertible) ( is-section-map-inv-is-coherently-invertible) ( is-retraction-map-inv-is-coherently-invertible) coh-is-coherently-invertible = pr2 (pr2 (pr2 H)) is-invertible-is-coherently-invertible : is-invertible f pr1 is-invertible-is-coherently-invertible = map-inv-is-coherently-invertible pr1 (pr2 is-invertible-is-coherently-invertible) = is-section-map-inv-is-coherently-invertible pr2 (pr2 is-invertible-is-coherently-invertible) = is-retraction-map-inv-is-coherently-invertible section-is-coherently-invertible : section f pr1 section-is-coherently-invertible = map-inv-is-coherently-invertible pr2 section-is-coherently-invertible = is-section-map-inv-is-coherently-invertible retraction-is-coherently-invertible : retraction f pr1 retraction-is-coherently-invertible = map-inv-is-coherently-invertible pr2 retraction-is-coherently-invertible = is-retraction-map-inv-is-coherently-invertible
We will show that is-coherently-invertible
is a proposition in
foundation.coherently-invertible-maps
.
The type of coherently invertible maps
coherently-invertible-map : {l1 l2 : Level} → UU l1 → UU l2 → UU (l1 ⊔ l2) coherently-invertible-map A B = Σ (A → B) (is-coherently-invertible) module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : coherently-invertible-map A B) where map-coherently-invertible-map : A → B map-coherently-invertible-map = pr1 e is-coherently-invertible-map-coherently-invertible-map : is-coherently-invertible map-coherently-invertible-map is-coherently-invertible-map-coherently-invertible-map = pr2 e map-inv-coherently-invertible-map : B → A map-inv-coherently-invertible-map = map-inv-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) is-section-map-inv-coherently-invertible-map : map-coherently-invertible-map ∘ map-inv-coherently-invertible-map ~ id is-section-map-inv-coherently-invertible-map = is-section-map-inv-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) is-retraction-map-inv-coherently-invertible-map : map-inv-coherently-invertible-map ∘ map-coherently-invertible-map ~ id is-retraction-map-inv-coherently-invertible-map = is-retraction-map-inv-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) coh-coherently-invertible-map : coherence-is-coherently-invertible ( map-coherently-invertible-map) ( map-inv-coherently-invertible-map) ( is-section-map-inv-coherently-invertible-map) ( is-retraction-map-inv-coherently-invertible-map) coh-coherently-invertible-map = coh-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) section-coherently-invertible-map : section map-coherently-invertible-map section-coherently-invertible-map = section-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) retraction-coherently-invertible-map : retraction map-coherently-invertible-map retraction-coherently-invertible-map = retraction-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) is-invertible-coherently-invertible-map : is-invertible map-coherently-invertible-map is-invertible-coherently-invertible-map = is-invertible-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map) invertible-map-coherently-invertible-map : invertible-map A B pr1 invertible-map-coherently-invertible-map = map-coherently-invertible-map pr2 invertible-map-coherently-invertible-map = is-invertible-coherently-invertible-map
The predicate of being a transpose coherently invertible map
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where coherence-is-transpose-coherently-invertible : (f : A → B) (g : B → A) (G : f ∘ g ~ id) (H : g ∘ f ~ id) → UU (l1 ⊔ l2) coherence-is-transpose-coherently-invertible f g G H = H ·r g ~ g ·l G is-transpose-coherently-invertible : (A → B) → UU (l1 ⊔ l2) is-transpose-coherently-invertible f = Σ ( B → A) ( λ g → Σ ( f ∘ g ~ id) ( λ G → Σ ( g ∘ f ~ id) ( λ H → coherence-is-transpose-coherently-invertible f g G H))) module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-transpose-coherently-invertible f) where map-inv-is-transpose-coherently-invertible : B → A map-inv-is-transpose-coherently-invertible = pr1 H is-section-map-inv-is-transpose-coherently-invertible : f ∘ map-inv-is-transpose-coherently-invertible ~ id is-section-map-inv-is-transpose-coherently-invertible = pr1 (pr2 H) is-retraction-map-inv-is-transpose-coherently-invertible : map-inv-is-transpose-coherently-invertible ∘ f ~ id is-retraction-map-inv-is-transpose-coherently-invertible = pr1 (pr2 (pr2 H)) coh-is-transpose-coherently-invertible : coherence-is-transpose-coherently-invertible f ( map-inv-is-transpose-coherently-invertible) ( is-section-map-inv-is-transpose-coherently-invertible) ( is-retraction-map-inv-is-transpose-coherently-invertible) coh-is-transpose-coherently-invertible = pr2 (pr2 (pr2 H)) is-invertible-is-transpose-coherently-invertible : is-invertible f pr1 is-invertible-is-transpose-coherently-invertible = map-inv-is-transpose-coherently-invertible pr1 (pr2 is-invertible-is-transpose-coherently-invertible) = is-section-map-inv-is-transpose-coherently-invertible pr2 (pr2 is-invertible-is-transpose-coherently-invertible) = is-retraction-map-inv-is-transpose-coherently-invertible section-is-transpose-coherently-invertible : section f pr1 section-is-transpose-coherently-invertible = map-inv-is-transpose-coherently-invertible pr2 section-is-transpose-coherently-invertible = is-section-map-inv-is-transpose-coherently-invertible retraction-is-transpose-coherently-invertible : retraction f pr1 retraction-is-transpose-coherently-invertible = map-inv-is-transpose-coherently-invertible pr2 retraction-is-transpose-coherently-invertible = is-retraction-map-inv-is-transpose-coherently-invertible
We will show that is-transpose-coherently-invertible
is a proposition in
foundation.coherently-invertible-maps
.
The type of transpose coherently invertible maps
transpose-coherently-invertible-map : {l1 l2 : Level} → UU l1 → UU l2 → UU (l1 ⊔ l2) transpose-coherently-invertible-map A B = Σ (A → B) (is-transpose-coherently-invertible) module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : transpose-coherently-invertible-map A B) where map-transpose-coherently-invertible-map : A → B map-transpose-coherently-invertible-map = pr1 e is-transpose-coherently-invertible-map-transpose-coherently-invertible-map : is-transpose-coherently-invertible map-transpose-coherently-invertible-map is-transpose-coherently-invertible-map-transpose-coherently-invertible-map = pr2 e map-inv-transpose-coherently-invertible-map : B → A map-inv-transpose-coherently-invertible-map = map-inv-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) is-section-map-inv-transpose-coherently-invertible-map : ( map-transpose-coherently-invertible-map ∘ map-inv-transpose-coherently-invertible-map) ~ ( id) is-section-map-inv-transpose-coherently-invertible-map = is-section-map-inv-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) is-retraction-map-inv-transpose-coherently-invertible-map : ( map-inv-transpose-coherently-invertible-map ∘ map-transpose-coherently-invertible-map) ~ ( id) is-retraction-map-inv-transpose-coherently-invertible-map = is-retraction-map-inv-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) coh-transpose-coherently-invertible-map : coherence-is-transpose-coherently-invertible ( map-transpose-coherently-invertible-map) ( map-inv-transpose-coherently-invertible-map) ( is-section-map-inv-transpose-coherently-invertible-map) ( is-retraction-map-inv-transpose-coherently-invertible-map) coh-transpose-coherently-invertible-map = coh-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) section-transpose-coherently-invertible-map : section map-transpose-coherently-invertible-map section-transpose-coherently-invertible-map = section-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) retraction-transpose-coherently-invertible-map : retraction map-transpose-coherently-invertible-map retraction-transpose-coherently-invertible-map = retraction-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) is-invertible-transpose-coherently-invertible-map : is-invertible map-transpose-coherently-invertible-map is-invertible-transpose-coherently-invertible-map = is-invertible-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map) invertible-map-transpose-coherently-invertible-map : invertible-map A B pr1 invertible-map-transpose-coherently-invertible-map = map-transpose-coherently-invertible-map pr2 invertible-map-transpose-coherently-invertible-map = is-invertible-transpose-coherently-invertible-map
Invertible maps that are coherent are coherently invertible maps
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-invertible f) where coherence-is-invertible : UU (l1 ⊔ l2) coherence-is-invertible = coherence-is-coherently-invertible ( f) ( map-inv-is-invertible H) ( is-section-map-inv-is-invertible H) ( is-retraction-map-inv-is-invertible H) transpose-coherence-is-invertible : UU (l1 ⊔ l2) transpose-coherence-is-invertible = coherence-is-transpose-coherently-invertible ( f) ( map-inv-is-invertible H) ( is-section-map-inv-is-invertible H) ( is-retraction-map-inv-is-invertible H) is-coherently-invertible-coherence-is-invertible : coherence-is-invertible → is-coherently-invertible f is-coherently-invertible-coherence-is-invertible coh = ( map-inv-is-invertible H , is-section-map-inv-is-invertible H , is-retraction-map-inv-is-invertible H , coh) is-transpose-coherently-invertible-transpose-coherence-is-invertible : transpose-coherence-is-invertible → is-transpose-coherently-invertible f is-transpose-coherently-invertible-transpose-coherence-is-invertible coh = ( map-inv-is-invertible H , is-section-map-inv-is-invertible H , is-retraction-map-inv-is-invertible H , coh)
Properties
The inverse of a coherently invertible map is transpose coherently invertible and vice versa
The inverse of a coherently invertible map is transpose coherently invertible. Conversely, the inverse of a transpose coherently invertible map is coherently invertible. Since these are defined by simply moving data around, they are strict inverses to one another.
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-transpose-coherently-invertible-map-inv-is-coherently-invertible : {f : A → B} (H : is-coherently-invertible f) → is-transpose-coherently-invertible (map-inv-is-coherently-invertible H) is-transpose-coherently-invertible-map-inv-is-coherently-invertible {f} H = ( f , is-retraction-map-inv-is-coherently-invertible H , is-section-map-inv-is-coherently-invertible H , coh-is-coherently-invertible H) is-coherently-invertible-map-inv-is-transpose-coherently-invertible : {f : A → B} (H : is-transpose-coherently-invertible f) → is-coherently-invertible (map-inv-is-transpose-coherently-invertible H) is-coherently-invertible-map-inv-is-transpose-coherently-invertible {f} H = ( f , is-retraction-map-inv-is-transpose-coherently-invertible H , is-section-map-inv-is-transpose-coherently-invertible H , coh-is-transpose-coherently-invertible H) transpose-coherently-invertible-map-inv-coherently-invertible-map : coherently-invertible-map A B → transpose-coherently-invertible-map B A transpose-coherently-invertible-map-inv-coherently-invertible-map e = ( map-inv-coherently-invertible-map e , is-transpose-coherently-invertible-map-inv-is-coherently-invertible ( is-coherently-invertible-map-coherently-invertible-map e)) coherently-invertible-map-inv-transpose-coherently-invertible-map : transpose-coherently-invertible-map A B → coherently-invertible-map B A coherently-invertible-map-inv-transpose-coherently-invertible-map e = ( map-inv-transpose-coherently-invertible-map e , is-coherently-invertible-map-inv-is-transpose-coherently-invertible ( is-transpose-coherently-invertible-map-transpose-coherently-invertible-map ( e)))
Invertible maps are coherently invertible
This result is known as Vogt’s lemma in point-set topology. The construction follows Lemma 10.4.5 in [Rij22].
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-invertible f) where is-retraction-map-inv-is-coherently-invertible-is-invertible : map-inv-is-invertible H ∘ f ~ id is-retraction-map-inv-is-coherently-invertible-is-invertible = is-retraction-map-inv-is-invertible H abstract is-section-map-inv-is-coherently-invertible-is-invertible : f ∘ map-inv-is-invertible H ~ id is-section-map-inv-is-coherently-invertible-is-invertible = ( ( inv-htpy (is-section-map-inv-is-invertible H)) ·r ( f ∘ map-inv-is-invertible H)) ∙h ( ( ( f) ·l ( is-retraction-map-inv-is-invertible H) ·r ( map-inv-is-invertible H)) ∙h ( is-section-map-inv-is-invertible H)) abstract inv-coh-is-coherently-invertible-is-invertible : f ·l is-retraction-map-inv-is-coherently-invertible-is-invertible ~ is-section-map-inv-is-coherently-invertible-is-invertible ·r f inv-coh-is-coherently-invertible-is-invertible = left-transpose-htpy-concat ( ( is-section-map-inv-is-invertible H) ·r ( f ∘ map-inv-is-invertible H ∘ f)) ( f ·l is-retraction-map-inv-is-invertible H) ( ( ( f) ·l ( is-retraction-map-inv-is-invertible H) ·r ( map-inv-is-invertible H ∘ f)) ∙h ( is-section-map-inv-is-invertible H ·r f)) ( ( ( nat-htpy (is-section-map-inv-is-invertible H ·r f)) ·r ( is-retraction-map-inv-is-invertible H)) ∙h ( right-whisker-concat-htpy ( ( inv-preserves-comp-left-whisker-comp ( f) ( map-inv-is-invertible H ∘ f) ( is-retraction-map-inv-is-invertible H)) ∙h ( left-whisker-comp² ( f) ( inv-coh-htpy-id (is-retraction-map-inv-is-invertible H)))) ( is-section-map-inv-is-invertible H ·r f))) abstract coh-is-coherently-invertible-is-invertible : coherence-is-coherently-invertible ( f) ( map-inv-is-invertible H) ( is-section-map-inv-is-coherently-invertible-is-invertible) ( is-retraction-map-inv-is-coherently-invertible-is-invertible) coh-is-coherently-invertible-is-invertible = inv-htpy inv-coh-is-coherently-invertible-is-invertible is-coherently-invertible-is-invertible : is-coherently-invertible f is-coherently-invertible-is-invertible = ( map-inv-is-invertible H , is-section-map-inv-is-coherently-invertible-is-invertible , is-retraction-map-inv-is-coherently-invertible-is-invertible , coh-is-coherently-invertible-is-invertible)
We get the transpose version for free:
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-invertible f) where is-transpose-coherently-invertible-is-invertible : is-transpose-coherently-invertible f is-transpose-coherently-invertible-is-invertible = is-transpose-coherently-invertible-map-inv-is-coherently-invertible ( is-coherently-invertible-is-invertible ( is-invertible-map-inv-is-invertible H))
Coherently invertible maps are injective
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} where is-injective-is-coherently-invertible : (H : is-coherently-invertible f) {x y : A} → f x = f y → x = y is-injective-is-coherently-invertible H = is-injective-is-invertible ( is-invertible-is-coherently-invertible H) is-injective-is-transpose-coherently-invertible : (H : is-transpose-coherently-invertible f) {x y : A} → f x = f y → x = y is-injective-is-transpose-coherently-invertible H = is-injective-is-invertible ( is-invertible-is-transpose-coherently-invertible H)
Coherently invertible maps are embeddings
We show that is-injective-is-coherently-invertible
is a
section and
retraction of ap f
.
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} (H : is-coherently-invertible f) {x y : A} where abstract is-section-is-injective-is-coherently-invertible : ap f {x} {y} ∘ is-injective-is-coherently-invertible H ~ id is-section-is-injective-is-coherently-invertible p = ( ap-concat f ( inv (is-retraction-map-inv-is-coherently-invertible H x)) ( ( ap (map-inv-is-coherently-invertible H) p) ∙ ( is-retraction-map-inv-is-coherently-invertible H y))) ∙ ( ap-binary ( _∙_) ( ap-inv f (is-retraction-map-inv-is-coherently-invertible H x)) ( ( ap-concat f ( ap (map-inv-is-coherently-invertible H) p) ( is-retraction-map-inv-is-coherently-invertible H y)) ∙ ( ap-binary ( _∙_) ( inv (ap-comp f (map-inv-is-coherently-invertible H) p)) ( inv (coh-is-coherently-invertible H y))))) ∙ ( inv ( left-transpose-eq-concat ( ap f (is-retraction-map-inv-is-coherently-invertible H x)) ( p) ( ( ap (f ∘ map-inv-is-coherently-invertible H) p) ∙ ( is-section-map-inv-is-coherently-invertible H (f y))) ( ( ap-binary ( _∙_) ( inv (coh-is-coherently-invertible H x)) ( inv (ap-id p))) ∙ ( nat-htpy (is-section-map-inv-is-coherently-invertible H) p)))) abstract is-retraction-is-injective-is-coherently-invertible : is-injective-is-coherently-invertible H ∘ ap f {x} {y} ~ id is-retraction-is-injective-is-coherently-invertible refl = left-inv (is-retraction-map-inv-is-coherently-invertible H x) is-invertible-ap-is-coherently-invertible : is-invertible (ap f {x} {y}) is-invertible-ap-is-coherently-invertible = ( is-injective-is-coherently-invertible H , is-section-is-injective-is-coherently-invertible , is-retraction-is-injective-is-coherently-invertible) is-coherently-invertible-ap-is-coherently-invertible : is-coherently-invertible (ap f {x} {y}) is-coherently-invertible-ap-is-coherently-invertible = is-coherently-invertible-is-invertible ( is-invertible-ap-is-coherently-invertible)
Coherently invertible maps are transpose coherently invertible
The proof follows Lemma 4.2.2 in [UF13].
Proof. By naturality of homotopies we have
gfRg
gfgfg --------------------> gfg
| |
Rgfg | nat-htpy R ·r (R ·r g) | Rg
∨ ∨
gfg ----------------------> g.
Rg
We can paste the homotopy
g (inv-coh-htpy-id S) ∙ gHg : Sgfg ~ gfSg ~ gfRg
along the top edge of this naturality square obtaining the coherence square
gfgS
gfgfg -------> gfg
| |
Rgfg | | Rg
∨ ∨
gfg ---------> g.
Rg
There is also the naturality square
gfgS
gfgfg --------------------> gfg
| |
Rgfg | nat-htpy (R ·r g) ·r S | Rg
∨ ∨
gfg ----------------------> g.
gS
Now, by pasting these along the common edge Rgfg
, we obtain
gfgS gfgS
gfg <------- gfgfg -------> gfg
| | |
Rg | | Rgfg | Rg
∨ ∨ ∨
g <--------- gfg ---------> g.
Rg gS
After cancelling gfgS
and Rg
with themselves, we are left with Rg ~ gS
as
desired.
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) (g : B → A) (S : is-section f g) (R : is-retraction f g) (H : coherence-is-coherently-invertible f g S R) where abstract coh-transposition-coherence-is-coherently-invertible : (g ∘ f ∘ g) ·l S ~ (g ∘ f) ·l R ·r g coh-transposition-coherence-is-coherently-invertible = ( inv-preserves-comp-left-whisker-comp g (f ∘ g) S) ∙h ( left-whisker-comp² g (inv-coh-htpy-id S)) ∙h ( double-whisker-comp² g H g) ∙h ( preserves-comp-left-whisker-comp g f (R ·r g)) abstract naturality-square-transposition-coherence-is-coherently-invertible : coherence-square-homotopies ( R ·r (g ∘ f ∘ g)) ( (g ∘ f ∘ g) ·l S) ( R ·r g) ( R ·r g) naturality-square-transposition-coherence-is-coherently-invertible = ( ap-concat-htpy' ( R ·r g) ( coh-transposition-coherence-is-coherently-invertible)) ∙h ( inv-htpy (nat-htpy R ·r (R ·r g))) ∙h ( ap-concat-htpy ( R ·r (g ∘ f ∘ g)) ( left-unit-law-left-whisker-comp (R ·r g))) abstract coherence-transposition-coherence-is-coherently-invertible : coherence-is-transpose-coherently-invertible f g S R coherence-transposition-coherence-is-coherently-invertible = ( ap-concat-htpy' ( R ·r g) ( inv-htpy (left-inv-htpy ((g ∘ f ∘ g) ·l S)))) ∙h ( assoc-htpy (inv-htpy ((g ∘ f ∘ g) ·l S)) ((g ∘ f ∘ g) ·l S) (R ·r g)) ∙h ( ap-concat-htpy ( inv-htpy ((g ∘ f ∘ g) ·l S)) ( inv-htpy (nat-htpy (R ·r g) ·r S))) ∙h ( inv-htpy ( assoc-htpy ( inv-htpy ((g ∘ f ∘ g) ·l S)) ( R ·r (g ∘ f ∘ g)) ( g ·l S))) ∙h ( ap-concat-htpy' ( g ·l S) ( ( vertical-inv-coherence-square-homotopies ( R ·r (g ∘ f ∘ g)) ((g ∘ f ∘ g) ·l S) (R ·r g) (R ·r g) ( naturality-square-transposition-coherence-is-coherently-invertible)) ∙h ( right-inv-htpy (R ·r g))))
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} where coherence-transposition-is-coherently-invertible : (H : is-coherently-invertible f) → coherence-is-transpose-coherently-invertible ( f) ( map-inv-is-coherently-invertible H) ( is-section-map-inv-is-coherently-invertible H) ( is-retraction-map-inv-is-coherently-invertible H) coherence-transposition-is-coherently-invertible ( g , S , R , H) = coherence-transposition-coherence-is-coherently-invertible f g S R H transposition-is-coherently-invertible : is-coherently-invertible f → is-transpose-coherently-invertible f transposition-is-coherently-invertible H = is-transpose-coherently-invertible-transpose-coherence-is-invertible ( is-invertible-is-coherently-invertible H) ( coherence-transposition-is-coherently-invertible H)
Transpose coherently invertible maps are coherently invertible
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} where coherence-transposition-is-transpose-coherently-invertible : (H : is-transpose-coherently-invertible f) → coherence-is-coherently-invertible ( f) ( map-inv-is-transpose-coherently-invertible H) ( is-section-map-inv-is-transpose-coherently-invertible H) ( is-retraction-map-inv-is-transpose-coherently-invertible H) coherence-transposition-is-transpose-coherently-invertible H = coherence-transposition-is-coherently-invertible ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible H) transposition-is-transpose-coherently-invertible : is-transpose-coherently-invertible f → is-coherently-invertible f transposition-is-transpose-coherently-invertible H = is-coherently-invertible-coherence-is-invertible ( is-invertible-is-transpose-coherently-invertible H) ( coherence-transposition-is-transpose-coherently-invertible H) module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where transposition-coherently-invertible-map : coherently-invertible-map A B → transpose-coherently-invertible-map A B transposition-coherently-invertible-map (f , H) = ( f , transposition-is-coherently-invertible H) transposition-transpose-coherently-invertible-map : transpose-coherently-invertible-map A B → coherently-invertible-map A B transposition-transpose-coherently-invertible-map (f , H) = ( f , transposition-is-transpose-coherently-invertible H)
Coherently invertible maps are closed under homotopies
Proof. Assume given a coherently invertible map f
with inverse g
,
homotopies S : f ∘ g ~ id
, R : g ∘ f ~ id
and coherence C : Sf ~ fR
.
Moreover, assume the map f'
is homotopic to f
with homotopy H : f' ~ f
.
Then g
is also a two-sided inverse to f'
via the homotopies
S' := Hg ∙ S : f' ∘ g ~ id and R' := gH ∙ R : g ∘ f' ~ id.
Moreover, these witnesses are part of a coherent inverse to f'
. To show this,
we must construct a coherence C'
of the square
Hgf'
f'gf' -----> f'gf
| |
f'gH | | Sf'
∨ ∨
f'gf -------> f'.
f'R
We begin by observing that C
fits somewhere along the diagonal of this square
via the composite
Sf
HgH ------> H⁻¹
f'gf' ------> fgf C f ------> f'.
------>
fR
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f f' : A → B} (H : f' ~ f) (g : B → A) (S : f ∘ g ~ id) (R : g ∘ f ~ id) (C : S ·r f ~ f ·l R) where coh-coh-is-coherently-invertible-htpy : horizontal-concat-htpy' (H ·r g) H ∙h (S ·r f ∙h inv-htpy H) ~ horizontal-concat-htpy' (H ·r g) H ∙h (f ·l R ∙h inv-htpy H) coh-coh-is-coherently-invertible-htpy = left-whisker-concat-htpy ( horizontal-concat-htpy' (H ·r g) H) ( right-whisker-concat-htpy C (inv-htpy H))
Now the problem is reduced to constructing two homotopies
Hgf' ∙ Sf' ~ HgH ∙ Sf ∙ H⁻¹ and f'gH ∙ f'R ~ HgH ∙ fR ∙ H⁻¹.
By the two equivalent constructions of the horizontal composite HgH
Hgf' ∙ fgH ~ HgH ~ f'gH ∙ Hgf
constructing the two homotopies is equivalent to constructing coherences of the squares
fgH Hgf
fgf' -------> fgf f'gf -------> fgf
| | | |
Sf' | | Sf f'R | | fR
∨ ∨ ∨ ∨
f' ---------> f f' ---------> f.
H H
However, these squares are naturality squares, so we are done.
coh-section-is-coherently-invertible-htpy : (H ·r g ∙h S) ·r f' ~ horizontal-concat-htpy' (H ·r g) H ∙h ((S ·r f) ∙h inv-htpy H) coh-section-is-coherently-invertible-htpy = ( left-whisker-concat-htpy ( H ·r (g ∘ f')) ( right-transpose-htpy-concat (S ·r f') H ((f ∘ g) ·l H ∙h S ·r f) ( ( ap-concat-htpy ( S ·r f') ( inv-htpy (left-unit-law-left-whisker-comp H))) ∙h ( nat-htpy S ·r H)))) ∙h ( ( ap-concat-htpy ( H ·r (g ∘ f')) ( assoc-htpy ((f ∘ g) ·l H) (S ·r f) (inv-htpy H))) ∙h ( inv-htpy ( assoc-htpy (H ·r (g ∘ f')) ((f ∘ g) ·l H) ((S ·r f) ∙h inv-htpy H)))) coh-retraction-is-coherently-invertible-htpy : horizontal-concat-htpy' (H ·r g) H ∙h ((f ·l R) ∙h inv-htpy H) ~ f' ·l ((g ·l H) ∙h R) coh-retraction-is-coherently-invertible-htpy = ( ap-concat-htpy' ( f ·l R ∙h inv-htpy H) ( coh-horizontal-concat-htpy (H ·r g) H)) ∙h ( assoc-htpy ((f' ∘ g) ·l H) (H ·r (g ∘ f)) (f ·l R ∙h inv-htpy H)) ∙h ( ap-concat-htpy ( (f' ∘ g) ·l H) ( inv-htpy (assoc-htpy (H ·r (g ∘ f)) (f ·l R) (inv-htpy H)))) ∙h ( left-whisker-concat-htpy ( (f' ∘ g) ·l H) ( inv-htpy ( right-transpose-htpy-concat (f' ·l R) H ((H ·r (g ∘ f) ∙h f ·l R)) ( inv-htpy (nat-htpy H ·r R))))) ∙h ( ap-concat-htpy' ( f' ·l R) ( inv-preserves-comp-left-whisker-comp f' g H)) ∙h ( inv-htpy (distributive-left-whisker-comp-concat f' (g ·l H) R))
Finally, we concatenate the three coherences to obtain our desired result.
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f f' : A → B} where abstract coh-is-coherently-invertible-htpy : (H : f' ~ f) (F : is-coherently-invertible f) → coherence-is-coherently-invertible ( f') ( map-inv-is-coherently-invertible F) ( is-section-map-inv-is-invertible-htpy ( H) ( is-invertible-is-coherently-invertible F)) ( is-retraction-map-inv-is-invertible-htpy ( H) ( is-invertible-is-coherently-invertible F)) coh-is-coherently-invertible-htpy H F = ( coh-section-is-coherently-invertible-htpy H ( map-inv-is-coherently-invertible F) ( is-section-map-inv-is-coherently-invertible F) ( is-retraction-map-inv-is-coherently-invertible F) ( coh-is-coherently-invertible F)) ∙h ( coh-coh-is-coherently-invertible-htpy H ( map-inv-is-coherently-invertible F) ( is-section-map-inv-is-coherently-invertible F) ( is-retraction-map-inv-is-coherently-invertible F) ( coh-is-coherently-invertible F)) ∙h ( coh-retraction-is-coherently-invertible-htpy H ( map-inv-is-coherently-invertible F) ( is-section-map-inv-is-coherently-invertible F) ( is-retraction-map-inv-is-coherently-invertible F) ( coh-is-coherently-invertible F)) is-coherently-invertible-htpy : f' ~ f → is-coherently-invertible f → is-coherently-invertible f' is-coherently-invertible-htpy H F = is-coherently-invertible-coherence-is-invertible ( is-invertible-htpy H (is-invertible-is-coherently-invertible F)) ( coh-is-coherently-invertible-htpy H F) is-coherently-invertible-inv-htpy : f ~ f' → is-coherently-invertible f → is-coherently-invertible f' is-coherently-invertible-inv-htpy H = is-coherently-invertible-htpy (inv-htpy H) module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} {f : A → B} where is-coherently-invertible-htpy-coherently-invertible-map : (e : coherently-invertible-map A B) → f ~ map-coherently-invertible-map e → is-coherently-invertible f is-coherently-invertible-htpy-coherently-invertible-map (e , E) H = is-coherently-invertible-htpy H E is-coherently-invertible-inv-htpy-coherently-invertible-map : (e : coherently-invertible-map A B) → map-coherently-invertible-map e ~ f → is-coherently-invertible f is-coherently-invertible-inv-htpy-coherently-invertible-map (e , E) H = is-coherently-invertible-inv-htpy H E
The identity map is coherently invertible
module _ {l : Level} {A : UU l} where is-coherently-invertible-id : is-coherently-invertible (id {A = A}) is-coherently-invertible-id = is-coherently-invertible-coherence-is-invertible is-invertible-id refl-htpy id-coherently-invertible-map : coherently-invertible-map A A id-coherently-invertible-map = ( id , is-coherently-invertible-id) is-transpose-coherently-invertible-id : is-transpose-coherently-invertible (id {A = A}) is-transpose-coherently-invertible-id = is-transpose-coherently-invertible-map-inv-is-coherently-invertible ( is-coherently-invertible-id) id-transpose-coherently-invertible-map : transpose-coherently-invertible-map A A id-transpose-coherently-invertible-map = ( id , is-transpose-coherently-invertible-id)
Inversion of coherently invertible maps
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-coherently-invertible-map-inv-is-coherently-invertible : {f : A → B} (H : is-coherently-invertible f) → is-coherently-invertible (map-inv-is-coherently-invertible H) is-coherently-invertible-map-inv-is-coherently-invertible H = is-coherently-invertible-map-inv-is-transpose-coherently-invertible ( transposition-is-coherently-invertible H) is-transpose-coherently-invertible-map-inv-is-transpose-coherently-invertible : {f : A → B} (H : is-transpose-coherently-invertible f) → is-transpose-coherently-invertible ( map-inv-is-transpose-coherently-invertible H) is-transpose-coherently-invertible-map-inv-is-transpose-coherently-invertible H = transposition-is-coherently-invertible ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible H) inv-coherently-invertible-map : coherently-invertible-map A B → coherently-invertible-map B A inv-coherently-invertible-map (f , H) = ( map-inv-is-coherently-invertible H , is-coherently-invertible-map-inv-is-coherently-invertible H) inv-transpose-coherently-invertible-map : transpose-coherently-invertible-map A B → transpose-coherently-invertible-map B A inv-transpose-coherently-invertible-map (f , H) = ( map-inv-is-transpose-coherently-invertible H , is-transpose-coherently-invertible-map-inv-is-transpose-coherently-invertible ( H))
Composition of coherently invertible maps
module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (g : B → C) (f : A → B) (G : is-coherently-invertible g) (F : is-coherently-invertible f) where coh-is-coherently-invertible-comp : coherence-is-coherently-invertible ( g ∘ f) ( map-inv-is-invertible-comp g f ( is-invertible-is-coherently-invertible G) ( is-invertible-is-coherently-invertible F)) ( is-section-map-inv-is-invertible-comp g f ( is-invertible-is-coherently-invertible G) ( is-invertible-is-coherently-invertible F)) ( is-retraction-map-inv-is-invertible-comp g f ( is-invertible-is-coherently-invertible G) ( is-invertible-is-coherently-invertible F)) coh-is-coherently-invertible-comp = ( ap-concat-htpy ( ( g) ·l ( is-section-map-inv-is-coherently-invertible F) ·r ( map-inv-is-coherently-invertible G ∘ g ∘ f)) ( coh-is-coherently-invertible G ·r f)) ∙h ( right-whisker-comp² ( ( nat-htpy (g ·l is-section-map-inv-is-coherently-invertible F)) ·r ( is-retraction-map-inv-is-coherently-invertible G)) ( f)) ∙h ( ap-binary-concat-htpy ( inv-preserves-comp-left-whisker-comp ( g ∘ f) ( map-inv-is-coherently-invertible F) ( is-retraction-map-inv-is-coherently-invertible G ·r f)) ( ( left-whisker-comp² g (coh-is-coherently-invertible F)) ∙h ( preserves-comp-left-whisker-comp g f ( is-retraction-map-inv-is-coherently-invertible F)))) ∙h ( inv-htpy ( distributive-left-whisker-comp-concat ( g ∘ f) ( ( map-inv-is-coherently-invertible F) ·l ( is-retraction-map-inv-is-coherently-invertible G ·r f)) ( is-retraction-map-inv-is-coherently-invertible F))) is-coherently-invertible-comp : is-coherently-invertible (g ∘ f) is-coherently-invertible-comp = is-coherently-invertible-coherence-is-invertible ( is-invertible-comp g f ( is-invertible-is-coherently-invertible G) ( is-invertible-is-coherently-invertible F)) ( coh-is-coherently-invertible-comp) module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} (g : B → C) (f : A → B) (G : is-transpose-coherently-invertible g) (F : is-transpose-coherently-invertible f) where coh-is-transpose-coherently-invertible-comp : coherence-is-transpose-coherently-invertible ( g ∘ f) ( map-inv-is-invertible-comp g f ( is-invertible-is-transpose-coherently-invertible G) ( is-invertible-is-transpose-coherently-invertible F)) ( is-section-map-inv-is-invertible-comp g f ( is-invertible-is-transpose-coherently-invertible G) ( is-invertible-is-transpose-coherently-invertible F)) ( is-retraction-map-inv-is-invertible-comp g f ( is-invertible-is-transpose-coherently-invertible G) ( is-invertible-is-transpose-coherently-invertible F)) coh-is-transpose-coherently-invertible-comp = coh-is-coherently-invertible-comp ( map-inv-is-transpose-coherently-invertible F) ( map-inv-is-transpose-coherently-invertible G) ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible F) ( is-coherently-invertible-map-inv-is-transpose-coherently-invertible G) is-transpose-coherently-invertible-comp : is-transpose-coherently-invertible (g ∘ f) is-transpose-coherently-invertible-comp = is-transpose-coherently-invertible-transpose-coherence-is-invertible ( is-invertible-comp g f ( is-invertible-is-transpose-coherently-invertible G) ( is-invertible-is-transpose-coherently-invertible F)) ( coh-is-transpose-coherently-invertible-comp) module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {C : UU l3} where comp-coherently-invertible-map : coherently-invertible-map B C → coherently-invertible-map A B → coherently-invertible-map A C comp-coherently-invertible-map (g , G) (f , F) = ( g ∘ f , is-coherently-invertible-comp g f G F) comp-transpose-coherently-invertible-map : transpose-coherently-invertible-map B C → transpose-coherently-invertible-map A B → transpose-coherently-invertible-map A C comp-transpose-coherently-invertible-map (g , G) (f , F) = ( g ∘ f , is-transpose-coherently-invertible-comp g f G F)
The 3-for-2 property of coherently invertible maps
The 3-for-2 property¶ of coherently invertible maps asserts that for any commuting triangle of maps
h
A ------> B
\ /
f\ /g
\ /
∨ ∨
X,
if two of the three maps are coherently invertible, then so is the third.
We also record special cases of the 3-for-2 property of coherently invertible
maps, where we only assume maps g : B → X
and h : A → B
. In this special
case, we set f := g ∘ h
and the triangle commutes by refl-htpy
.
André Joyal proposed calling this property the 3-for-2 property, despite most mathematicians calling it the 2-out-of-3 property. The story goes that on the produce market is is common to advertise a discount as “3-for-2”. If you buy two apples, then you get the third for free. Similarly, if you prove that two maps in a commuting triangle are coherently invertible, then you get the third proof for free.
The left map in a commuting triangle is coherently invertible if the other two maps are
module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (f : A → X) (g : B → X) (h : A → B) (T : f ~ g ∘ h) where is-coherently-invertible-left-map-triangle : is-coherently-invertible h → is-coherently-invertible g → is-coherently-invertible f is-coherently-invertible-left-map-triangle H G = is-coherently-invertible-htpy T (is-coherently-invertible-comp g h G H)
The right map in a commuting triangle is coherently invertible if the other two maps are
module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (f : A → X) (g : B → X) (h : A → B) (T : f ~ g ∘ h) where is-coherently-invertible-right-map-triangle : is-coherently-invertible f → is-coherently-invertible h → is-coherently-invertible g is-coherently-invertible-right-map-triangle F H = is-coherently-invertible-htpy ( ( g ·l inv-htpy (is-section-map-inv-is-coherently-invertible H)) ∙h ( inv-htpy T ·r map-inv-is-coherently-invertible H)) ( is-coherently-invertible-comp ( f) ( map-inv-is-coherently-invertible H) ( F) ( is-coherently-invertible-map-inv-is-coherently-invertible H))
The top map in a commuting triangle is coherently invertible if the other two maps are
module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} (f : A → X) (g : B → X) (h : A → B) (T : f ~ g ∘ h) where is-coherently-invertible-top-map-triangle : is-coherently-invertible g → is-coherently-invertible f → is-coherently-invertible h is-coherently-invertible-top-map-triangle G F = is-coherently-invertible-htpy ( ( inv-htpy (is-retraction-map-inv-is-coherently-invertible G) ·r h) ∙h ( map-inv-is-coherently-invertible G ·l inv-htpy T)) ( is-coherently-invertible-comp ( map-inv-is-coherently-invertible G) ( f) ( is-coherently-invertible-map-inv-is-coherently-invertible G) ( F))
If a composite and its right factor are coherently invertible, then so is its left factor
module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} where is-coherently-invertible-left-factor : (g : B → X) (h : A → B) → is-coherently-invertible (g ∘ h) → is-coherently-invertible h → is-coherently-invertible g is-coherently-invertible-left-factor g h GH H = is-coherently-invertible-right-map-triangle (g ∘ h) g h refl-htpy GH H
If a composite and its left factor are coherently invertible, then so is its right factor
module _ {l1 l2 l3 : Level} {A : UU l1} {B : UU l2} {X : UU l3} where is-coherently-invertible-right-factor : (g : B → X) (h : A → B) → is-coherently-invertible g → is-coherently-invertible (g ∘ h) → is-coherently-invertible h is-coherently-invertible-right-factor g h G GH = is-coherently-invertible-top-map-triangle (g ∘ h) g h refl-htpy G GH
Any section of a coherently invertible map is coherently invertible
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-coherently-invertible-is-section : {f : A → B} {g : B → A} → is-coherently-invertible f → f ∘ g ~ id → is-coherently-invertible g is-coherently-invertible-is-section {f = f} {g} F H = is-coherently-invertible-top-map-triangle id f g ( inv-htpy H) ( F) ( is-coherently-invertible-id)
Any retraction of a coherently invertible map is coherently invertible
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} where is-coherently-invertible-is-retraction : {f : A → B} {g : B → A} → is-coherently-invertible f → (g ∘ f) ~ id → is-coherently-invertible g is-coherently-invertible-is-retraction {f = f} {g} F H = is-coherently-invertible-right-map-triangle id g f ( inv-htpy H) ( is-coherently-invertible-id) ( F)
If a section of f
is coherently invertible, then f
is coherently invertible
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) where is-coherently-invertible-is-coherently-invertible-section : (s : section f) → is-coherently-invertible (map-section f s) → is-coherently-invertible f is-coherently-invertible-is-coherently-invertible-section (g , G) S = is-coherently-invertible-is-retraction S G
If a retraction of f
is coherently invertible, then f
is coherently invertible
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (f : A → B) where abstract is-coherently-invertible-is-coherently-invertible-retraction : (r : retraction f) → is-coherently-invertible (map-retraction f r) → is-coherently-invertible f is-coherently-invertible-is-coherently-invertible-retraction (g , G) R = is-coherently-invertible-is-section R G
Any section of a coherently invertible map is homotopic to its inverse
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : coherently-invertible-map A B) where htpy-map-inv-coherently-invertible-map-section : (f : section (map-coherently-invertible-map e)) → map-inv-coherently-invertible-map e ~ map-section (map-coherently-invertible-map e) f htpy-map-inv-coherently-invertible-map-section = htpy-map-inv-invertible-map-section ( invertible-map-coherently-invertible-map e)
Any retraction of a coherently invertible map is homotopic to its inverse
module _ {l1 l2 : Level} {A : UU l1} {B : UU l2} (e : coherently-invertible-map A B) where htpy-map-inv-coherently-invertible-map-retraction : (f : retraction (map-coherently-invertible-map e)) → map-inv-coherently-invertible-map e ~ map-retraction (map-coherently-invertible-map e) f htpy-map-inv-coherently-invertible-map-retraction = htpy-map-inv-invertible-map-retraction ( invertible-map-coherently-invertible-map e)
References
- [Rij22]
- Egbert Rijke. Introduction to Homotopy Type Theory. 12 2022. arXiv:2212.11082.
- [UF13]
- The Univalent Foundations Program. Homotopy Type Theory: Univalent Foundations of Mathematics. Institute for Advanced Study, 2013. URL: https://homotopytypetheory.org/book/, arXiv:1308.0729.
See also
- For the notion of biinvertible maps see
foundation.equivalences
. - For the notion of maps with contractible fibers see
foundation.contractible-maps
. - For the notion of path-split maps see
foundation.path-split-maps
.
External links
- Adjoint equivalences at 1lab
- adjoint equivalence at Lab
Recent changes
- 2024-10-27. Fredrik Bakke. Functoriality of morphisms of arrows (#1130).
- 2024-04-25. Fredrik Bakke. chore: Fix arrowheads in character diagrams (#1124).
- 2024-04-17. Fredrik Bakke. Splitting idempotents (#1105).
- 2024-03-20. Fredrik Bakke. chore: Janitorial work in foundation (#1086).
- 2024-03-12. Fredrik Bakke. Bibliographies (#1058).