Martin Escardo and Paulo Oliva, April 2024
Lists without repetitions over a discrete types form a monad, as a
corollary of the fact that lists without repetitions over a discrete
type form the free discrete graphic monoid.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.FunExt
module DiscreteGraphicMonoids.Monad
(fe : Fun-Ext)
where
open import DiscreteGraphicMonoids.Free fe
open import DiscreteGraphicMonoids.LWRDGM fe
open import DiscreteGraphicMonoids.ListsWithoutRepetitions fe
open import DiscreteGraphicMonoids.Type
open import MLTT.Spartan
open import UF.DiscreteAndSeparated
module _ {X : 𝓤 ̇ }
{{X-is-discrete' : is-discrete' X}}
{Y : 𝓥 ̇ }
{{Y-is-discrete' : is-discrete' Y}}
where
ext⁻ : (X → List⁻ Y) → List⁻ X → List⁻ Y
ext⁻ = extension (List⁻-DGM Y)
unit⁻ : (f : X → List⁻ Y) → ext⁻ f ∘ η⁻ ∼ f
unit⁻ = triangle (List⁻-DGM Y)
module _ {X : 𝓤 ̇ }
{{X-is-discrete' : is-discrete' X}}
where
ext⁻-η⁻ : ext⁻ η⁻ ∼ 𝑖𝑑 (List⁻ X)
ext⁻-η⁻ = uniqueness (List⁻-DGM X)
η⁻
id
(id-is-hom (List⁻-DGM X))
(λ _ → refl)
module _ {X : 𝓤 ̇ }
{{X-is-discrete' : is-discrete' X}}
{Y : 𝓥 ̇ }
{{Y-is-discrete' : is-discrete' Y}}
{Z : 𝓦 ̇ }
{{Z-is-discrete' : is-discrete' Z}}
where
assoc⁻ : (g : Y → List⁻ Z) (f : X → List⁻ Y)
→ ext⁻ (ext⁻ g ∘ f) ∼ ext⁻ g ∘ ext⁻ f
assoc⁻ g f = III
where
H : List⁻ X → List⁻ Z
H = ext⁻ g ∘ ext⁻ f
I : is-hom (List⁻-DGM X) (List⁻-DGM Z) H
I = ∘-is-hom (List⁻-DGM X) (List⁻-DGM Y) (List⁻-DGM Z)
(ext⁻ f)
(ext⁻ g)
(extension-is-hom (List⁻-DGM Y) f)
(extension-is-hom (List⁻-DGM Z) g)
II = H ∘ η⁻ ∼⟨ ∼-refl ⟩
ext⁻ g ∘ ext⁻ f ∘ η⁻ ∼⟨ ∼-ap-∘ (ext⁻ g) (triangle (List⁻-DGM Y) f) ⟩
ext⁻ g ∘ f ∼∎
III : ext⁻ (ext⁻ g ∘ f) ∼ H
III = uniqueness (List⁻-DGM Z) (ext⁻ g ∘ f) H I II
\end{code}