Martin Escardo 2012.
Based on [1] and [2].
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.ExitPropTrunc where
open import MLTT.Spartan
open import UF.Base
open import UF.Hedberg
open import UF.KrausLemma
open import UF.PropTrunc
open import UF.Subsingletons
to-fix : {X : 𝓤 ̇ } (f : X → X) → wconstant f → X → fix f
to-fix f g x = (f x , g x (f x))
from-to-fix : {X : 𝓤 ̇ } (f : X → X) (κ : wconstant f)
→ from-fix f ∘ to-fix f κ ∼ f
from-to-fix f κ w = refl
to-from-fix : {X : 𝓤 ̇ } (f : X → X) (κ : wconstant f)
→ to-fix f κ ∘ from-fix f ∼ id
to-from-fix f κ _ = fix-is-prop f κ _ _
has-split-support' : 𝓤 ̇ → 𝓤 ⁺ ̇
has-split-support' {𝓤} X = Σ P ꞉ 𝓤 ̇ , is-prop P × (X ↔ P)
fix-has-split-support' : {X : 𝓤 ̇ }
→ collapsible X
→ has-split-support' X
fix-has-split-support' {𝓤} {X} (f , κ) =
fix f , fix-is-prop f κ , to-fix f κ , from-fix f
has-prop-truncation : (𝓥 : Universe) → 𝓤 ̇ → (𝓤 ⊔ 𝓥)⁺ ̇
has-prop-truncation {𝓤} 𝓥 X =
Σ X' ꞉ 𝓤 ̇ , is-prop X'
× (X → X')
× ((P : 𝓥 ̇ ) → is-prop P → (X → P) → X' → P)
split-truncation : {X : 𝓤 ̇ }
→ has-split-support' X
→ ∀ 𝓥 → has-prop-truncation 𝓥 X
split-truncation {𝓤} {X} (X' , i , f , g) V = X' , i , f , λ P j h x' → h (g x')
collapsible-has-prop-truncation : {X : 𝓤 ̇ }
→ collapsible X
→ ∀ 𝓥 → has-prop-truncation 𝓥 X
collapsible-has-prop-truncation {𝓤} {X} c =
split-truncation (fix-has-split-support' c)
module split-support-and-collapsibility (pe : propositional-truncations-exist) where
open PropositionalTruncation pe
has-split-support : 𝓤 ̇ → 𝓤 ̇
has-split-support X = ∥ X ∥ → X
has-split-support→ : {X : 𝓤 ̇ } → has-split-support X → has-split-support' X
has-split-support→ {𝓤} {X} f = ∥ X ∥ , ∥∥-is-prop , (λ x → ∣ x ∣) , f
has-split-support← : {X : 𝓤 ̇ } → has-split-support' X → has-split-support X
has-split-support← {𝓤} {X} (P , P-is-prop , g , f) = f ∘ ∥∥-rec P-is-prop g
\end{code}
TODO. Are the above two functions mutually inverse and hence we get an
equivalence?
\begin{code}
collapsible-gives-split-support : {X : 𝓤 ̇ }
→ collapsible X
→ has-split-support X
collapsible-gives-split-support {𝓤} {X} (f , κ) s = x
where
g : ∥ X ∥ → fix f
g = ∥∥-rec (fix-is-prop f κ) (to-fix f κ)
x : X
x = from-fix f (g s)
exit-prop-trunc : {X : 𝓤 ̇ }
→ (f : X → X)
→ wconstant f
→ ∥ X ∥ → X
exit-prop-trunc f κ = collapsible-gives-split-support (f , κ)
exit-prop-trunc-is-fixed : {X : 𝓤 ̇ }
(f : X → X)
(κ : wconstant f)
(s : ∥ X ∥)
→ f (exit-prop-trunc f κ s) = exit-prop-trunc f κ s
exit-prop-trunc-is-fixed f κ s =
(from-fix-is-fixed f (∥∥-rec (fix-is-prop f κ) (to-fix f κ) s))⁻¹
split-support-gives-collapsible : {X : 𝓤 ̇ }
→ has-split-support X
→ collapsible X
split-support-gives-collapsible {𝓤} {X} g = γ
where
f : X → X
f x = g ∣ x ∣
κ : (x y : X) → f x = f y
κ x y = ap g (∥∥-is-prop ∣ x ∣ ∣ y ∣)
γ : collapsible X
γ = f , κ
\end{code}
Added 23rd September 2024. Perhaps the following is better notation
for the above.
\begin{code}
∥_∥⌜_⌝ : (X : 𝓤 ̇ ) → collapsible X → 𝓤 ̇
∥ X ∥⌜ f , w ⌝ = fix f
∥∥⌜_⌝-is-prop : {X : 𝓤 ̇ } (c : collapsible X) → is-prop ∥ X ∥⌜ c ⌝
∥∥⌜ f , w ⌝-is-prop = fix-is-prop f w
∣_∣⌜_⌝ : {X : 𝓤 ̇ } → X → (c : collapsible X) → ∥ X ∥⌜ c ⌝
∣ x ∣⌜ f , w ⌝ = to-fix f w x
\end{code}
Notice that recursion principle doesn't require the family A to be
prop-valued, which allows us to exit truncations.
\begin{code}
∥∥⌜_⌝-rec : {X : 𝓤 ̇ } (c : collapsible X) {A : 𝓥 ̇ }
→ (X → A) → ∥ X ∥⌜ c ⌝ → A
∥∥⌜ c ⌝-rec {A} g (x , φ) = g x
∣∣⌜_⌝-exit : {X : 𝓤 ̇ } (c : collapsible X) → ∥ X ∥⌜ c ⌝ → X
∣∣⌜ c ⌝-exit = ∥∥⌜ c ⌝-rec id
infix 0 ∥_∥⌜_⌝
infix 0 ∣_∣⌜_⌝
module propositional-truncation-of-decidable-type
(pt : propositional-truncations-exist)
where
open propositional-truncations-exist pt public
module _ {X : 𝓤 ̇ } (c : collapsible X) where
∥∥⌜_⌝-to-∥∥ : ∥ X ∥⌜ c ⌝ → ∥ X ∥
∥∥⌜_⌝-to-∥∥ = ∥∥⌜ c ⌝-rec ∣_∣
∥∥-to-∥∥⌜_⌝ : ∥ X ∥ → ∥ X ∥⌜ c ⌝
∥∥-to-∥∥⌜_⌝ = ∥∥-rec (∥∥⌜ c ⌝-is-prop) ∣_∣⌜ c ⌝
collapsible-types-have-split-support : ∥ X ∥ → X
collapsible-types-have-split-support s = ∣∣⌜ c ⌝-exit (∥∥-to-∥∥⌜_⌝ s)
\end{code}
TODO. Perhaps rewrite all uses of this file to use the new notation,
and get rid of the original old notation.