Martin Escardo. 22 August 2021
Based on this discussion: https://twitter.com/EgbertRijke/status/1429443868450295810
\begin{code}
{-# OPTIONS --safe --without-K #-}
module NotionsOfDecidability.Digression where
open import MLTT.Plus-Properties
open import MLTT.Spartan
open import UF.Equiv
T : 𝓤 ̇ → 𝓤 ̇
T = is-decidable
η : (X : 𝓤 ̇ ) → X → T X
η X = inl
μ : (X : 𝓤 ̇ ) → T (T X) → T X
μ X (inl d) = d
μ X (inr u) = inr (λ x → u (inl x))
T-is-nonempty : (X : 𝓤 ̇ ) → is-nonempty (T X)
T-is-nonempty X u = u (inr (λ x → u (inl x)))
μη : (X : 𝓤 ̇ ) → μ X ∘ η (T X) ∼ id
μη X (inl x) = refl
μη X (inr u) = refl
ημ : (X : 𝓤 ̇ ) → η (T X) ∘ μ X ∼ id
ημ X (inl (inl x)) = refl
ημ X (inl (inr u)) = refl
ημ X (inr u) = 𝟘-elim (u (inr (λ x → u (inl x))))
μ-is-invertible : (X : 𝓤 ̇ ) → invertible (μ X)
μ-is-invertible X = η (T X) , ημ X , μη X
μ-≃ : (X : 𝓤 ̇ ) → T (T X) ≃ T X
μ-≃ X = qinveq (μ X) (μ-is-invertible X)
raw-T-algebras-are-non-empty : {X : 𝓤 ̇ } (α : T X → X) → is-nonempty X
raw-T-algebras-are-non-empty α u = u (α (inr u))
retraction-of-η-is-section : {A : 𝓤 ̇ } (α : T A → A)
→ α ∘ η A ∼ id
→ η A ∘ α ∼ id
retraction-of-η-is-section α h (inl a) = ap inl (h a)
retraction-of-η-is-section α h (inr u) = 𝟘-elim (raw-T-algebras-are-non-empty α u)
section-of-η-is-retraction : {A : 𝓤 ̇ } (α : T A → A)
→ η A ∘ α ∼ id
→ α ∘ η A ∼ id
section-of-η-is-retraction α k a = inl-lc (k (inl a))
η⁻¹ : {A : 𝓤 ̇ } → is-nonempty A → (T A → A)
η⁻¹ ϕ (inl a) = a
η⁻¹ ϕ (inr u) = 𝟘-elim (ϕ u)
η⁻¹-is-retraction : {A : 𝓤 ̇ } (ϕ : is-nonempty A) → η⁻¹ ϕ ∘ η A ∼ id
η⁻¹-is-retraction ϕ a = refl
η⁻¹-is-section : {A : 𝓤 ̇ } (ϕ : is-nonempty A) → η A ∘ η⁻¹ ϕ ∼ id
η⁻¹-is-section ϕ = retraction-of-η-is-section (η⁻¹ ϕ) (η⁻¹-is-retraction ϕ)
η-invertible-gives-non-empty : {X : 𝓤 ̇ } → invertible (η X) → is-nonempty X
η-invertible-gives-non-empty (α , _ , _) = raw-T-algebras-are-non-empty α
nonempty-gives-η-invertible : {X : 𝓤 ̇ } → is-nonempty X → invertible (η X)
nonempty-gives-η-invertible {𝓤} {X} ϕ = η⁻¹ ϕ , η⁻¹-is-retraction ϕ , η⁻¹-is-section ϕ
η-≃ : (X : 𝓤 ̇ ) → is-nonempty X → X ≃ T X
η-≃ X ϕ = qinveq (η X) (nonempty-gives-η-invertible ϕ)
retractions-of-η-are-invertible : {A : 𝓤 ̇ } (α : T A → A)
→ α ∘ η A ∼ id
→ invertible α
retractions-of-η-are-invertible {𝓤} {A} α h = η A , retraction-of-η-is-section α h , h
retractions-of-η-are-unique : {A : 𝓤 ̇ } (α : T A → A)
→ α ∘ η A ∼ id
→ (ϕ : is-nonempty A) → α ∼ η⁻¹ ϕ
retractions-of-η-are-unique α h ϕ (inl a) = h a
retractions-of-η-are-unique α h ϕ (inr u) = 𝟘-elim (ϕ u)
is-proto-algebra : 𝓤 ̇ → 𝓤 ̇
is-proto-algebra A = Σ α ꞉ (T A → A) , α ∘ η A ∼ id
proto-algebras-are-non-empty : {A : 𝓤 ̇ } → is-proto-algebra A → is-nonempty A
proto-algebras-are-non-empty (α , _) = raw-T-algebras-are-non-empty α
nonempty-types-are-proto-algebras : {A : 𝓤 ̇ } → is-nonempty A → is-proto-algebra A
nonempty-types-are-proto-algebras ϕ = η⁻¹ ϕ , η⁻¹-is-retraction ϕ
\end{code}