Nicolai Kraus 2012.
This is adapted to our TypeTopology development by Martin Escardo, but
we keep Nicolai's original proof.
The main result is that the type of fixed-points of a weakly constant
endomap is a proposition, in pure MLTT without HoTT/UF extensions.
1. Nicolai Kraus, Martín Escardó, Thierry Coquand & Thorsten Altenkirch.
Generalizations of Hedberg’s Theorem.
TLCA 2013
https://doi.org/10.1007/978-3-642-38946-7_14
2. Nicolai Kraus, Martín Escardó, Thierry Coquand & Thorsten Altenkirch.
Notions of Anonymous Existence in Martin-Löf Type Theory.
Logical Methods in Computer Science, March 24, 2017, Volume 13, Issue 1.
https://doi.org/10.23638/LMCS-13(1:15)2017
\begin{code}
{-# OPTIONS --safe --without-K #-}
module UF.KrausLemma where
open import MLTT.Spartan
open import UF.Base
open import UF.Hedberg
open import UF.Subsingletons
key-lemma : {X Y : 𝓤 ̇ } (f : X → Y) (g : wconstant f) {x y : X} (p : x = y)
→ ap f p = (g x x)⁻¹ ∙ g x y
key-lemma f g {x} refl = sym-is-inverse (g x x)
key-insight : {X Y : 𝓤 ̇ } (f : X → Y)
→ wconstant f
→ {x : X} (p : x = x) → ap f p = refl
key-insight f g p = key-lemma f g p ∙ (sym-is-inverse (g _ _))⁻¹
transport-ids-along-ids
: {X Y : 𝓤 ̇ }
{x y : X}
(p : x = y)
(h k : X → Y)
(q : h x = k x)
→ transport (λ - → h - = k -) p q = (ap h p)⁻¹ ∙ q ∙ ap k p
transport-ids-along-ids refl h k q = refl-left-neutral ⁻¹
transport-ids-along-ids'
: {X : 𝓤 ̇ }
{x : X}
(p : x = x)
(f : X → X)
(q : x = f x)
→ transport (λ - → - = f -) p q = (p ⁻¹ ∙ q) ∙ ap f p
transport-ids-along-ids' {𝓤} {X} {x} p f q = γ
where
g : x = x → x = f x
g r = r ⁻¹ ∙ q ∙ (ap f p)
γ : transport (λ - → - = f -) p q = p ⁻¹ ∙ q ∙ ap f p
γ = transport-ids-along-ids p id f q ∙ ap g ((ap-id-is-id' p)⁻¹)
\end{code}
The following is what we refer to as Kraus Lemma:
\begin{code}
fix-is-prop : {X : 𝓤 ̇ } (f : X → X) → wconstant f → is-prop (fix f)
fix-is-prop {𝓤} {X} f g (x , p) (y , q) =
(x , p) =⟨ to-Σ-= (r , refl) ⟩
(y , p') =⟨ to-Σ-= (s , t) ⟩
(y , q) ∎
where
r : x = y
r = x =⟨ p ⟩
f x =⟨ g x y ⟩
f y =⟨ q ⁻¹ ⟩
y ∎
p' : y = f y
p' = transport (λ - → - = f -) r p
s : y = y
s = y =⟨ p' ⟩
f y =⟨ q ⁻¹ ⟩
y ∎
q' : y = f y
q' = transport (λ - → - = f -) s p'
t : q' = q
t = q' =⟨ I ⟩
(s ⁻¹ ∙ p') ∙ ap f s =⟨ II ⟩
s ⁻¹ ∙ (p' ∙ ap f s) =⟨ III ⟩
s ⁻¹ ∙ (p' ∙ refl) =⟨ IV ⟩
s ⁻¹ ∙ p' =⟨ refl ⟩
(p' ∙ (q ⁻¹))⁻¹ ∙ p' =⟨ V ⟩
((q ⁻¹)⁻¹ ∙ (p' ⁻¹)) ∙ p' =⟨ VI ⟩
(q ∙ (p' ⁻¹)) ∙ p' =⟨ VII ⟩
q ∙ ((p' ⁻¹) ∙ p') =⟨ VIII ⟩
q ∙ refl =⟨ IX ⟩
q ∎
where
I = transport-ids-along-ids' s f p'
II = ∙assoc (s ⁻¹) p' (ap f s)
III = ap (λ - → s ⁻¹ ∙ (p' ∙ -)) (key-insight f g s)
IV = ap (λ - → s ⁻¹ ∙ -) ((refl-right-neutral p')⁻¹)
V = ap (λ - → - ∙ p') ((⁻¹-contravariant p' (q ⁻¹))⁻¹)
VI = ap (λ - → (- ∙ (p' ⁻¹)) ∙ p') (⁻¹-involutive q)
VII = ∙assoc q (p' ⁻¹) p'
VIII = ap (λ - → q ∙ -) ((sym-is-inverse p')⁻¹)
IX = (refl-right-neutral q)⁻¹
\end{code}