Martin Escardo, 17 May 2018,
while visiting the Hausdorff Research Institute for Mathematics in Bonn
This is an "improvement method" I learned from Peter Lumsdaine, 7th
July 2017 at the Newton Institute in Cambridge, adapted from an Agda
rendering by Andy Pitts of Peter's Coq code from 14th October 2015.
Given an identity system (Id, refl , J) with no given "computation
rule" for J, Peter produces another identity system (Id, refl , J' ,
J'-comp) with a "propositional computation rule" J'-comp for J'.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Universes
module Various.Lumsdaine
{𝓤}
(Id : ∀ {X : 𝓤 ̇ } → X → X → 𝓤 ̇ )
(refl : ∀ {X : 𝓤 ̇ } {x : X} → Id x x)
(J : ∀ {X : 𝓤 ̇ } (x : X) (A : (y : X) → Id x y → 𝓤 ̇ )
→ A x refl → (y : X) (p : Id x y) → A y p)
where
private
record Σ {𝓤 𝓥} {X : 𝓤 ̇ } (Y : X → 𝓥 ̇ ) : 𝓤 ⊔ 𝓥 ̇ where
constructor _,_
field
pr₁ : X
pr₂ : Y pr₁
open Σ
Sigma : {𝓤 𝓥 : Universe} (X : 𝓤 ̇ ) (Y : X → 𝓥 ̇ ) → 𝓤 ⊔ 𝓥 ̇
Sigma X Y = Σ Y
syntax Sigma A (λ x → b) = Σ x ꞉ A , b
infixr -1 Sigma
id : {X : 𝓤 ̇ } → X → X
id x = x
lc-maps : (X Y : 𝓤 ̇ ) → 𝓤 ̇
lc-maps X Y = Σ f ꞉ (X → Y) , ({x x' : X} → Id (f x) (f x') → Id x x')
id-lc-maps : {X : 𝓤 ̇ } → lc-maps X X
id-lc-maps = (id , id)
module _ {X : 𝓤 ̇ }
{x : X}
(A : (y : X) → Id x y → 𝓤 ̇ )
where
private
g : {t z : X} (p : Id x t) (q : Id x z) → lc-maps (A t p) (A z q)
g {t} {z} p q = J x B (J x C id-lc-maps t p) z q
where
B : (y : X) → Id x y → 𝓤 ̇
B y q = lc-maps (A t p) (A y q)
C : (y : X) → Id x y → 𝓤 ̇
C y p = lc-maps (A y p) (A x refl)
h : (b : A x refl) {y : X} (p : Id x y)
→ Σ x ꞉ A y p , Id (pr₁ (g p p) x) (pr₁ (g refl p) b)
h b {y} p = J x B (b , refl) y p
where
B : (y : X) (p : Id x y) → 𝓤 ̇
B y p = Σ x ꞉ A y p , Id (pr₁ (g p p) x) (pr₁ (g refl p) b)
J' : A x refl → (y : X) (p : Id x y) → A y p
J' b y p = pr₁ (h b p)
J'-comp : (b : A x refl) → Id (J' b x refl) b
J'-comp b = pr₂ (g refl refl) (pr₂ (h b refl))
\end{code}