Martin Escardo. 2018, 2023, 2024, 2026.
An incarnation of the delay monad.
The short 2018-2024 code was from from SquashedCantor, moved here on
16th September 2026.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import UF.FunExt
module TypeTopology.DelayMonad (fe : FunExt) where
open import CoNaturals.Type
open import CoNaturals.UniversalProperty fe
open import MLTT.Plus-Properties
open import MLTT.Spartan
open import MLTT.Two-Properties
open import Naturals.Sequence fe
open import Naturals.UniversalProperty
open import Notation.CanonicalMap
open import UF.Base
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.Sets
open import UF.Sets-Properties
open import UF.Singleton-Properties
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.Subsingletons-Properties
private
fe' : Fun-Ext
fe' {π€} {π₯} = fe π€ π₯
\end{code}
A delayed element of X is a "time" u : ββ together with a partial
element of X, which is defined when u is finite.
\begin{code}
π» : π€ Μ β π€ Μ
π» X = Ξ£ u κ ββ , (is-finite u β X)
π»-time : {X : π€ Μ } β π» X β ββ
π»-time (u , Ο) = u
π»-value : {X : π€ Μ } (π : π» X) β is-finite (π»-time π) β X
π»-value (u , Ο) = Ο
\end{code}
The following two abbreviations for the transport of finiteness, moved
here from SquashedCantor on 17th September 2026, are used repeatedly
below.
\begin{code}
transport-finite : {u v : ββ} (p : u οΌ v) β is-finite u β is-finite v
transport-finite = transport is-finite
transport-finiteβ»ΒΉ : {u v : ββ} (p : u οΌ v) β is-finite v β is-finite u
transport-finiteβ»ΒΉ = transportβ»ΒΉ is-finite
transport-value : (X : π€ Μ ) {u v : ββ}
(p : u οΌ v)
β (is-finite u β X)
β (is-finite v β X)
transport-value X = transport (Ξ» - β is-finite - β X)
\end{code}
Added 20th December 2023.
The delay monad structure.
\begin{code}
Ξ·π» : {X : π€ Μ } β X β π» X
Ξ·π» x = (Zero , Ξ» _ β x)
Ξ΄π» : {X : π€ Μ } β π» X β π» X
Ξ΄π» (u , f) = (Succ u , f β is-finite-down u)
\end{code}
TODO. Prove the (wild) monad laws.
Added 9th January 2024.
\begin{code}
π»-functor : {X : π€ Μ } {Y : π₯ Μ }
β (X β Y)
β (π» X β π» Y)
π»-functor f (u , Ο) = (u , f β Ο)
π»-functor-id : {X : π€ Μ }
β π»-functor (ππ X) βΌ ππ (π» X)
π»-functor-id d = refl
π»-functor-β : {X : π€ Μ } {Y : π₯ Μ } {Z : π¦ Μ }
(f : X β Y) (g : Y β Z)
β π»-functor (g β f) οΌ π»-functor g β π»-functor f
π»-functor-β f g = refl
π»-functor-id-οΌ : {X : π€ Μ }
β π»-functor (ππ X) οΌ ππ (π» X)
π»-functor-id-οΌ = refl
π»-functor-β-οΌ : {X : π€ Μ } {Y : π₯ Μ } {Z : π¦ Μ }
(f : X β Y) (g : Y β Z)
β π»-functor (g β f) οΌ π»-functor g β π»-functor f
π»-functor-β-οΌ f g = refl
π»-is-set : {X : π€ Μ }
β is-set X
β is-set (π» X)
π»-is-set {π€} {X} X-is-set = Ξ£-is-set
(ββ-is-set fe')
(Ξ» u β Ξ -is-set fe' (Ξ» Ο β X-is-set))
to-π»-οΌ : {X : π€ Μ }
(u u' : ββ)
(Ο : is-finite u β X)
(Ο' : is-finite u' β X)
β (Ξ£ p κ u οΌ u' , Ο οΌ Ο' β transport-finite p)
β (u , Ο) οΌ[ π» X ] (u' , Ο')
to-π»-οΌ {π€} {X} u u Ο Ο (refl , refl) = refl
from-π»-οΌ : {X : π€ Μ }
(u u' : ββ)
(Ο : is-finite u β X)
(Ο' : is-finite u' β X)
β (u , Ο) οΌ[ π» X ] (u' , Ο')
β Ξ£ p κ u οΌ u' , (Ο οΌ Ο' β transport-finite p)
from-π»-οΌ {π€} {X} u u Ο Ο refl = (refl , refl)
\end{code}
Added 16th September 2026.
A delayed element is either its value, when the time is zero, or the
delayed element with the time decreased by one.
\begin{code}
π»-out : {X : π€ Μ } β π» X β X + π» X
π»-out (u , Ο) = π-equality-cases
(Ξ» (z : is-Zero u)
β inl (Ο (Zero-is-finite' fe' u z)))
(Ξ» (p : is-positive u)
β inr (Pred u , Ο β is-finite-up' fe' u))
π»-outβ : {X : π€ Μ } (u : ββ) (Ο : is-finite u β X) (z : is-Zero u)
β π»-out (u , Ο) οΌ inl (Ο (Zero-is-finite' fe' u z))
π»-outβ u Ο = π-equality-casesβ
π»-outβ : {X : π€ Μ } (u : ββ) (Ο : is-finite u β X) (p : is-positive u)
β π»-out (u , Ο) οΌ inr (Pred u , Ο β is-finite-up' fe' u)
π»-outβ u Ο = π-equality-casesβ
\end{code}
We now show that the type π» X is a final coalgebra of the functor X + (-),
with the structure map π»-out defined above.
\begin{code}
is-π»-coalgebra-map : {X : π€ Μ } {Y : π₯ Μ }
β (Y β X + Y)
β (Y β π» X)
β π€ β π₯ Μ
is-π»-coalgebra-map k h = π»-out β h βΌ +functor id h β k
\end{code}
That is, h is a coalgebra map when the following diagram commutes.
k
Y ------------------> X + Y
| |
| |
h | | X + h
| |
| |
v v
π» X -----------------> X + π» X
π»-out
The map π»-out is an equivalence, with the following inverse π»-in, so
that a coalgebra map can be presented with π»-in in place of it.
\begin{code}
π»-in : {X : π€ Μ } β X + π» X β π» X
π»-in (inl x) = (Zero , Ξ» _ β x)
π»-in (inr (u , Ο)) = (Succ u , Ο β is-finite-down u)
π»-out-π»-in : {X : π€ Μ } (w : X + π» X) β π»-out (π»-in w) οΌ w
π»-out-π»-in (inl x) = I
where
I = π»-out (Zero , (Ξ» _ β x)) οΌβ¨ π»-outβ Zero (Ξ» _ β x) refl β©
inl x β
π»-out-π»-in (inr (u , Ο)) = II
where
II = π»-out (Succ u , Ο β is-finite-down u) οΌβ¨ IIβ β©
(inr (Pred (Succ u) ,
Ο β is-finite-down u β is-finite-up' fe' (Succ u))) οΌβ¨ IIβ β©
inr (u , Ο) β
where
h : (Ο : is-finite u)
β Ο (is-finite-down u (is-finite-up' fe' (Succ u) Ο)) οΌ Ο Ο
h Ο = ap Ο (being-finite-is-prop fe' u _ _)
IIβ = π»-outβ (Succ u) (Ο β is-finite-down u) refl
IIβ = ap inr (to-π»-οΌ _ _ _ _ (refl , dfunext fe' h))
π»-in-π»-out : {X : π€ Μ } (d : π» X) β π»-in (π»-out d) οΌ d
π»-in-π»-out (u , Ο) = π-equality-cases I II
where
I : is-Zero u β π»-in (π»-out (u , Ο)) οΌ (u , Ο)
I z = π»-in (π»-out (u , Ο)) οΌβ¨ ap π»-in (π»-outβ u Ο z) β©
π»-in (inl (Ο (Zero-is-finite' fe' u z))) οΌβ¨ Iβ β©
(u , Ο) β
where
Iβ = to-π»-οΌ _ _ _ _
(((is-Zero-equal-Zero fe' z)β»ΒΉ) ,
dfunext fe' (Ξ» Ο β ap Ο (being-finite-is-prop fe' u _ _)))
II : is-positive u β π»-in (π»-out (u , Ο)) οΌ (u , Ο)
II p = π»-in (π»-out (u , Ο)) οΌβ¨ ap π»-in (π»-outβ u Ο p) β©
π»-in (inr (Pred u , Ο β is-finite-up' fe' u)) οΌβ¨ IIβ β©
(u , Ο) β
where
IIβ = to-π»-οΌ _ _ _ _
(((positive-equal-Succ fe' p)β»ΒΉ) ,
dfunext fe' (Ξ» Ο β ap Ο (being-finite-is-prop fe' u _ _)))
π»-out-is-equiv : {X : π€ Μ } β is-equiv (π»-out {π€} {X})
π»-out-is-equiv = qinvs-are-equivs π»-out (π»-in , π»-in-π»-out , π»-out-π»-in)
π»-flip : {X : π€ Μ } (d : π» X) (w : X + π» X)
β (π»-out d οΌ w) β (d οΌ π»-in w)
π»-flip d w = (π»-out d οΌ w) ββ¨ I β©
(π»-out d οΌ π»-out (π»-in w)) ββ¨ II β©
(d οΌ π»-in w) β
where
I = β-sym (transport-β (Ξ» - β π»-out d οΌ -) (π»-out-π»-in w))
II = β-sym (ap π»-out , ap-is-equiv π»-out π»-out-is-equiv)
\end{code}
For a coalgebra k : Y β X + Y, we show that the type
Ξ£ h κ (Y β π» X) , is-π»-coalgebra-map k h
is a singleton, by a chain of type equivalences, as follows, where
item n is established by the definition stepβ in the code below.
1. For h : Y β π» X and y : Y, because π»-out is an equivalence, the type
π»-out (h y) οΌ +functor id h (k y)
is equivalent to the type
h y οΌ π»-in (+functor id h (k y)).
2. A map h : Y β π» X amounts to a time function t : Y β ββ together
with values Ξ½ : Value t, where, for any t : Y β ββ,
Value t = (y : Y) β is-finite (t y) β X,
via h = pair t Ξ½, with
pair t Ξ½ y = (t y , Ξ½ y).
3. For y : Y, the element
π»-in (+functor id (pair t Ξ½) (k y)) : π» X
is equal, by cases on k y, to the pair
(time t (k y) , value t Ξ½ (k y)),
where the functions
time t : X + Y β ββ,
value t Ξ½ : (w : X + Y) β is-finite (time t w) β X
give the time Zero and the value x for w = inl x, and the time
Succ (t y') and the value of Ξ½ at y' for w = inr y', so that, for
h = pair t Ξ½, the equation of step 1 becomes
pair t Ξ½ y οΌ (time t (k y) , value t Ξ½ (k y)).
4. Splitting the equation of step 3 into a time part and a value part,
and collecting the time parts, the type of coalgebra maps becomes the
type of quadruples (t , e , Ξ½ , q), where
t : Y β ββ,
e : t βΌ time* t,
Ξ½ : Value t,
q : value-condition t Ξ½ e,
with time* t y = time t (k y).
5. The type t βΌ time* t of step 4 is equivalent to the type
is-homomorphism kΜ
t,
where kΜ
: Y β π + Y is k followed by the map that forgets values,
because both types are propositions, as ββ is a set.
6. The type of pairs (t , e) is a singleton, which amounts to the
finality of ββ as a coalgebra of the functor 1 + (-).
7. Fix t : Y β ββ and e : t βΌ time* t. A witness that t y is finite is
a natural number n together with an identification ΞΉ n οΌ t y, and
so a function Ξ½ : Value t amounts to a function a : Ξ A, whose
argument is the size n of the witness, where
A n = (y : Y) β ΞΉ n οΌ t y β X.
8. For Ξ½ : Value t, the value condition on Ξ½ is equivalent to the
fixed-point condition
Ξ½ y Ο οΌ value* Ξ½ y Ο,
for all y : Y and all witnesses Ο that t y is finite, where
value* Ξ½ y Ο = value t Ξ½ (k y) (e* y Ο)
and e* y transports such a witness along e y. This condition is
then split by the size n of Ο into the fixed-point condition at
size n, for each n : β.
9. For the function a : Ξ A of step 7 corresponding to Ξ½, the fixed-point
conditions at sizes 0 and succ n say that
a 0 οΌ aβ,
a (succ n) οΌ Ο n (a n),
where the value
aβ : A 0
and the induction step function
Ο : (n : β) β A n β A (succ n)
are defined by cases on k y.
10. That is, the function a is defined by induction from aβ and Ο. By
the dependent universal property of β as a natural numbers object with
codomain A, for any aβ : A 0 and any induction step function
Ο : (n : β) β A n β A (succ n), there is a unique a : Ξ A defined by
induction from them, and so the type
Ξ£ Ξ½ κ Value t , value-condition t Ξ½ e
of pairs (Ξ½ , q) is a singleton.
11. The type
Ξ£ (t , e) κ (Ξ£ t κ (Y β ββ) , t βΌ time* t) ,
Ξ£ Ξ½ κ Value t , value-condition t Ξ½ e,
to which the type of coalgebra maps is equivalent by steps 1-4, is a
sum of the singletons of step 10 over the singleton of step 6, and
hence is a singleton, which completes the proof.
\begin{code}
private
forget-value : {X : π€ Μ } {Y : π₯ Μ } β X + Y β π {π€β} + Y
forget-value (inl x) = inl β
forget-value (inr y) = inr y
module _ {X : π€ Μ } {Y : π₯ Μ } (k : Y β X + Y) where
private
kΜ
: Y β π {π€β} + Y
kΜ
= forget-value β k
Value : (Y β ββ) β π€ β π₯ Μ
Value t = (y : Y) β is-finite (t y) β X
time : (Y β ββ) β X + Y β ββ
time t (inl x) = Zero
time t (inr y') = Succ (t y')
time* : (Y β ββ) β (Y β ββ)
time* t y = time t (k y)
value : (t : Y β ββ)
β Value t
β (w : X + Y)
β is-finite (time t w)
β X
value t Ξ½ (inl x) Ο = x
value t Ξ½ (inr y') Ο = Ξ½ y' (is-finite-down (t y') Ο)
value-inl : (t : Y β ββ)
(Ξ½ : Value t)
(y : Y) (x : X)
β k y οΌ inl x
β (Ο : is-finite (time t (k y)))
β value t Ξ½ (k y) Ο οΌ x
value-inl t Ξ½ y x q = transportβ»ΒΉ E q (Ξ» Ο β refl)
where
E : X + Y β π€ Μ
E w = (Ο : is-finite (time t w)) β value t Ξ½ w Ο οΌ x
value-inr : (t : Y β ββ)
(Ξ½ : Value t)
(y y' : Y)
β k y οΌ inr y'
β (Ο : is-finite (time t (k y))) (s : time t (k y) οΌ Succ (t y'))
β value t Ξ½ (k y) Ο
οΌ Ξ½ y' (is-finite-down (t y') (transport-finite s Ο))
value-inr t Ξ½ y y' q = transportβ»ΒΉ E q e
where
E : X + Y β π€ Μ
E w = (Ο : is-finite (time t w)) (s : time t w οΌ Succ (t y'))
β value t Ξ½ w Ο
οΌ Ξ½ y' (is-finite-down (t y') (transport-finite s Ο))
e : E (inr y')
e Ο s = ap (Ξ» - β Ξ½ y' (is-finite-down (t y') -))
(being-finite-is-prop fe' (Succ (t y'))
Ο (transport-finite s Ο))
pair : (t : Y β ββ) β Value t β (Y β π» X)
pair t Ξ½ y = (t y , Ξ½ y)
coalgebra-condition : (Y β π» X) β π€ β π₯ Μ
coalgebra-condition h = Ξ y κ Y , h y οΌ π»-in (+functor id h (k y))
\end{code}
This says the following diagram commutes, which is the diagram for
is-π»-coalgebra-map with its bottom arrow inverted.
k
Y ------------------> X + Y
| |
| |
h | | X + h
| |
| |
v v
π» X <----------------- X + π» X
π»-in
\begin{code}
π»-in-equation : (t : Y β ββ)
(Ξ½ : Value t)
(w : X + Y)
β π»-in (+functor id (pair t Ξ½) w) οΌ (time t w , value t Ξ½ w)
π»-in-equation t Ξ½ (inl x) = refl
π»-in-equation t Ξ½ (inr y') = refl
\end{code}
When h is pair t Ξ½, so that h has time t and values Ξ½, the composite of
X + h with π»-in, which is the right-hand and bottom edges of the above
diagram, is the pairing of the time map with the value map.
X + pair t Ξ½
X + Y ----------------------> X + π» X
\ |
\ |
\ | π»-in
\ |
\ |
\ v
------------------> π» X
(time t , value t Ξ½)
\begin{code}
stepβ : (h : Y β π» X) β is-π»-coalgebra-map k h β coalgebra-condition h
stepβ h = Ξ -cong fe' fe' (Ξ» y β π»-flip (h y) (+functor id h (k y)))
stepβ : (Ξ£ h κ (Y β π» X) , coalgebra-condition h)
β (Ξ£ (t , Ξ½) κ (Ξ£ t κ (Y β ββ) , Value t) ,
coalgebra-condition (pair t Ξ½))
stepβ = Ξ£-bicong _ _ Ξ Ξ£-distr-β (Ξ» h β β-refl _)
stepβ : (t : Y β ββ) (Ξ½ : Value t) β coalgebra-condition (pair t Ξ½)
β (Ξ y κ Y , pair t Ξ½ y οΌ (time t (k y) , value t Ξ½ (k y)))
stepβ t Ξ½ = Ξ -cong fe' fe'
(Ξ» y β transport-β
(Ξ» - β pair t Ξ½ y οΌ -)
(π»-in-equation t Ξ½ (k y)))
value-condition : (t : Y β ββ) β Value t β t βΌ time* t β π€ β π₯ Μ
value-condition t Ξ½ e = Ξ y κ Y , transport-value X (e y) (Ξ½ y)
οΌ value t Ξ½ (k y)
stepβ : (t : Y β ββ) (Ξ½ : Value t)
β (Ξ y κ Y , pair t Ξ½ y οΌ (time t (k y) , value t Ξ½ (k y)))
β (Ξ£ e κ t βΌ time* t , value-condition t Ξ½ e)
stepβ t Ξ½ = (Ξ y κ Y , pair t Ξ½ y οΌ (time t (k y) , value t Ξ½ (k y))) ββ¨ I β©
(Ξ y κ Y , Ξ£ p κ (t y οΌ time* t y) ,
transport-value X p (Ξ½ y) οΌ value t Ξ½ (k y)) ββ¨ II β©
(Ξ£ e κ t βΌ time* t , value-condition t Ξ½ e) β
where
I = Ξ -cong fe' fe' (Ξ» y β Ξ£-οΌ-β)
II = Ξ Ξ£-distr-β
time-SUCC : (t : Y β ββ) (w : X + Y)
β time t w οΌ SUCC (π+ t (forget-value w))
time-SUCC t (inl x) = refl
time-SUCC t (inr y') = refl
being-fixed-point-of-time*-is-prop : (t : Y β ββ) β is-prop (t βΌ time* t)
being-fixed-point-of-time*-is-prop t = Ξ -is-prop fe' (Ξ» y β ββ-is-set fe')
being-homomorphism-is-prop : (t : Y β ββ) β is-prop (is-homomorphism kΜ
t)
being-homomorphism-is-prop t =
Ξ -is-set fe' (Ξ» _ β +-is-set π ββ (props-are-sets π-is-prop) (ββ-is-set fe'))
stepβ
: (t : Y β ββ) β (t βΌ time* t) β is-homomorphism kΜ
t
stepβ
t = logically-equivalent-props-are-equivalent
(being-fixed-point-of-time*-is-prop t)
(being-homomorphism-is-prop t)
f
g
where
f : t βΌ time* t β is-homomorphism kΜ
t
f e = coalg-mophismβ kΜ
t (dfunext fe' (Ξ» y β
t y οΌβ¨ e y β©
time* t y οΌβ¨ time-SUCC t (k y) β©
SUCC (π+ t (kΜ
y)) β))
g : is-homomorphism kΜ
t β t βΌ time* t
g a y = t y οΌβ¨ happly (coalg-mophismβ kΜ
t a) y β©
SUCC (π+ t (kΜ
y)) οΌβ¨ (time-SUCC t (k y))β»ΒΉ β©
time* t y β
stepβ : β! t κ (Y β ββ) , t βΌ time* t
stepβ = equiv-to-singleton
(Ξ£-cong stepβ
)
(PRED-is-the-homotopy-final-coalgebra kΜ
)
module _ (t : Y β ββ) (e : t βΌ time* t) where
A : β β π€ β π₯ Μ
A n = (y : Y) β ΞΉ n οΌ t y β X
stepβ : Value t β ((n : β) β A n)
stepβ = ((y : Y) β is-finite (t y) β X) ββ¨ I β©
((y : Y) (n : β) β ΞΉ n οΌ t y β X) ββ¨ Ξ -flip β©
((n : β) β A n) β
where
I = Ξ -cong fe' fe' (Ξ» y β curry-uncurry fe)
e* : (y : Y) β is-finite (t y) β is-finite (time* t y)
e* y = transport-finite (e y)
value* : Value t β Value t
value* Ξ½ y Ο = value t Ξ½ (k y) (e* y Ο)
value-condition-β : (Ξ½ : Value t) β value-condition t Ξ½ e β (Ξ½ β value* Ξ½)
value-condition-β Ξ½ = Ξ -cong fe' fe' IV
where
I : (y : Y)
β (transport-value X (e y) (Ξ½ y) οΌ value t Ξ½ (k y))
β (Ξ½ y β transport-finite ((e y)β»ΒΉ) οΌ value t Ξ½ (k y))
I y = transport-β (Ξ» - β - οΌ value t Ξ½ (k y))
(transport-along-β' is-finite (e y) (Ξ½ y))
II : (y : Y)
β (Ξ½ y β transport-finite ((e y)β»ΒΉ) οΌ value t Ξ½ (k y))
β (Ξ Ο κ is-finite (time t (k y)) ,
Ξ½ y (transport-finite ((e y)β»ΒΉ) Ο) οΌ value t Ξ½ (k y) Ο)
II y = β-funext fe' _ _
III : (y : Y)
β (Ξ Ο κ is-finite (time t (k y)) ,
Ξ½ y (transport-finite ((e y)β»ΒΉ) Ο) οΌ value t Ξ½ (k y) Ο)
β (Ξ Ο κ is-finite (t y) , Ξ½ y Ο οΌ value* Ξ½ y Ο)
III y =
(Ξ Ο κ is-finite (time t (k y)) ,
Ξ½ y (transport-finite ((e y)β»ΒΉ) Ο) οΌ value t Ξ½ (k y) Ο) ββ¨ IIIβ β©
(Ξ Ο κ is-finite (t y) ,
Ξ½ y (transport-finite ((e y)β»ΒΉ) (e* y Ο)) οΌ value* Ξ½ y Ο) ββ¨ IIIβ β©
(Ξ Ο κ is-finite (t y) , Ξ½ y Ο οΌ value* Ξ½ y Ο) β
where
IIIβ = β-sym (Ξ -change-of-variable-β fe _ (transport-β is-finite (e y)))
IIIβ = Ξ -cong fe' fe' (Ξ» Ο β
transport-β
(Ξ» - β - οΌ value* Ξ½ y Ο)
(ap (Ξ½ y) (being-finite-is-prop fe' (t y) _ Ο)))
IV : (y : Y)
β (transport-value X (e y) (Ξ½ y) οΌ value t Ξ½ (k y))
β (Ξ Ο κ is-finite (t y) , Ξ½ y Ο οΌ value* Ξ½ y Ο)
IV y =
(transport-value X (e y) (Ξ½ y) οΌ value t Ξ½ (k y)) ββ¨ I y β©
(Ξ½ y β transport-finite ((e y)β»ΒΉ) οΌ value t Ξ½ (k y)) ββ¨ II y β©
(Ξ Ο κ is-finite (time t (k y)) ,
Ξ½ y (transport-finite ((e y)β»ΒΉ) Ο) οΌ value t Ξ½ (k y) Ο) ββ¨ III y β©
(Ξ Ο κ is-finite (t y) , Ξ½ y Ο οΌ value* Ξ½ y Ο) β
fixed-point-of-value*-at : Value t β β β π€ β π₯ Μ
fixed-point-of-value*-at Ξ½ n = Ξ y κ Y ,
Ξ p κ (ΞΉ n οΌ t y) ,
Ξ½ y (n , p) οΌ value* Ξ½ y (n , p)
fixed-point-of-value*-β : (Ξ½ : Value t)
β (Ξ½ β value* Ξ½)
β (Ξ n κ β , fixed-point-of-value*-at Ξ½ n)
fixed-point-of-value*-β Ξ½ =
Ξ½ β value* Ξ½ ββ¨ I β©
((y : Y) (n : β) (p : ΞΉ n οΌ t y)
β Ξ½ y (n , p) οΌ value* Ξ½ y (n , p)) ββ¨ Ξ -flip β©
(Ξ n κ β , fixed-point-of-value*-at Ξ½ n) β
where
I = Ξ -cong fe' fe' (Ξ» y β curry-uncurry fe)
stepβ : (Ξ½ : Value t)
β value-condition t Ξ½ e β (Ξ n κ β , fixed-point-of-value*-at Ξ½ n)
stepβ Ξ½ =
value-condition t Ξ½ e ββ¨ value-condition-β Ξ½ β©
Ξ½ β value* Ξ½ ββ¨ fixed-point-of-value*-β Ξ½ β©
(Ξ n κ β , fixed-point-of-value*-at Ξ½ n) β
zero-impossible : (y y' : Y) β k y οΌ inr y' β ΞΉ 0 β t y
zero-impossible y y' q p = Zero-not-Succ
(Zero οΌβ¨ p β©
t y οΌβ¨ e y β©
time t (k y) οΌβ¨ ap (time t) q β©
Succ (t y') β)
succ-impossible : (y : Y) (x : X) β k y οΌ inl x β (n : β) β ΞΉ (succ n) β t y
succ-impossible y x q n p = Succ-not-Zero
(ΞΉ (succ n) οΌβ¨ p β©
t y οΌβ¨ e y β©
time t (k y) οΌβ¨ ap (time t) q β©
Zero β)
down : (y y' : Y) β k y οΌ inr y' β (n : β) β ΞΉ (succ n) οΌ t y β ΞΉ n οΌ t y'
down y y' q n p = Succ-lc
(ΞΉ (succ n) οΌβ¨ p β©
t y οΌβ¨ e y β©
time t (k y) οΌβ¨ ap (time t) q β©
Succ (t y') β)
aβ-cases : (y : Y) (w : X + Y) β k y οΌ w β ΞΉ 0 οΌ t y β X
aβ-cases y (inl x) q p = x
aβ-cases y (inr y') q p = π-elim (zero-impossible y y' q p)
aβ : A 0
aβ y = aβ-cases y (k y) refl
aβ-cases-equation : (y : Y) (w : X + Y) (q : k y οΌ w) (p : ΞΉ 0 οΌ t y)
β aβ y p οΌ aβ-cases y w q p
aβ-cases-equation y w refl p = refl
Ο-cases : (y : Y) (w : X + Y)
β k y οΌ w β (n : β) β A n β ΞΉ (succ n) οΌ t y β X
Ο-cases y (inl x) q n aβ p = π-elim (succ-impossible y x q n p)
Ο-cases y (inr y') q n aβ p = aβ y' (down y y' q n p)
Ο : (n : β) β A n β A (succ n)
Ο n aβ y p = Ο-cases y (k y) refl n aβ p
Ο-cases-equation : (y : Y) (w : X + Y) (q : k y οΌ w)
(n : β) (aβ : A n) (p : ΞΉ (succ n) οΌ t y)
β Ο n aβ y p οΌ Ο-cases y w q n aβ p
Ο-cases-equation y w refl n aβ p = refl
value*-at-0-is-aβ : (Ξ½ : Value t)
(y : Y) (p : ΞΉ 0 οΌ t y)
β value* Ξ½ y (0 , p) οΌ aβ y p
value*-at-0-is-aβ Ξ½ y p = equality-cases (k y) I II
where
I : (x : X) β k y οΌ inl x β value* Ξ½ y (0 , p) οΌ aβ y p
I x q = value* Ξ½ y (0 , p) οΌβ¨ value-inl t Ξ½ y x q (e* y (0 , p)) β©
x οΌβ¨ (aβ-cases-equation y (inl x) q p)β»ΒΉ β©
aβ y p β
II : (y' : Y) β k y οΌ inr y' β value* Ξ½ y (0 , p) οΌ aβ y p
II y' q = π-elim (zero-impossible y y' q p)
value*-at-succ-is-Ο : (Ξ½ : Value t)
(n : β) (y : Y) (p : ΞΉ (succ n) οΌ t y)
β value* Ξ½ y (succ n , p)
οΌ Ο n (Ξ» yβ pβ β Ξ½ yβ (n , pβ)) y p
value*-at-succ-is-Ο Ξ½ n y p = equality-cases (k y) I II
where
aβ : A n
aβ yβ pβ = Ξ½ yβ (n , pβ)
I : (x : X) β k y οΌ inl x β value* Ξ½ y (succ n , p) οΌ Ο n aβ y p
I x q = π-elim (succ-impossible y x q n p)
II : (y' : Y) β k y οΌ inr y' β value* Ξ½ y (succ n , p) οΌ Ο n aβ y p
II y' q = value* Ξ½ y (succ n , p) οΌβ¨ IIβ β©
Ξ½ y' (is-finite-down (t y') Ο) οΌβ¨ IIβ β©
Ξ½ y' (n , down y y' q n p) οΌβ¨ IIβ β©
Ο n aβ y p β
where
Ο : is-finite (Succ (t y'))
Ο = transport-finite (ap (time t) q) (e* y (succ n , p))
IIβ = value-inr t Ξ½ y y' q (e* y (succ n , p)) (ap (time t) q)
IIβ = ap (Ξ½ y') (being-finite-is-prop fe' (t y')
(is-finite-down (t y') Ο) (n , down y y' q n p))
IIβ = (Ο-cases-equation y (inr y') q n aβ p)β»ΒΉ
fixed-point-of-value*-at-0-β : (Ξ½ : Value t)
β fixed-point-of-value*-at Ξ½ 0
β (β stepβ β Ξ½ 0 οΌ aβ)
fixed-point-of-value*-at-0-β Ξ½ =
fixed-point-of-value*-at Ξ½ 0 ββ¨ I β©
(Ξ y κ Y , Ξ p κ (ΞΉ 0 οΌ t y) , Ξ½ y (0 , p) οΌ aβ y p) ββ¨ β-sym II β©
(β stepβ β Ξ½ 0 οΌ aβ) β
where
I = Ξ -cong fe' fe' (Ξ» y β Ξ -cong fe' fe' (Ξ» p β
transport-β (Ξ» - β Ξ½ y (0 , p) οΌ -) (value*-at-0-is-aβ Ξ½ y p)))
II : (β stepβ β Ξ½ 0 οΌ aβ)
β (Ξ y κ Y , Ξ p κ (ΞΉ 0 οΌ t y) , Ξ½ y (0 , p) οΌ aβ y p)
II = β-funextβ fe' fe' _ _
fixed-point-of-value*-at-succ-β
: (Ξ½ : Value t) (n : β)
β fixed-point-of-value*-at Ξ½ (succ n)
β (β stepβ β Ξ½ (succ n) οΌ Ο n (β stepβ β Ξ½ n))
fixed-point-of-value*-at-succ-β Ξ½ n
= fixed-point-of-value*-at Ξ½ (succ n) ββ¨ I β©
(Ξ y κ Y , Ξ p κ (ΞΉ (succ n) οΌ t y) ,
Ξ½ y (succ n , p) οΌ Ο n (β stepβ β Ξ½ n) y p) ββ¨ II β©
(β stepβ β Ξ½ (succ n) οΌ Ο n (β stepβ β Ξ½ n)) β
where
I = Ξ -cong fe' fe' (Ξ» y β Ξ -cong fe' fe' (Ξ» p β
transport-β
(Ξ» - β Ξ½ y (succ n , p) οΌ -)
(value*-at-succ-is-Ο Ξ½ n y p)))
II = β-sym (β-funextβ fe' fe' _ _)
is-defined-by-induction : ((n : β) β A n) β π€ β π₯ Μ
is-defined-by-induction a = (a 0 οΌ aβ) Γ ((n : β) β a (succ n) οΌ Ο n (a n))
stepβ : (Ξ½ : Value t)
β (Ξ n κ β , fixed-point-of-value*-at Ξ½ n)
β is-defined-by-induction (β stepβ β Ξ½)
stepβ Ξ½ =
(Ξ n κ β , fixed-point-of-value*-at Ξ½ n) ββ¨ I β©
(fixed-point-of-value*-at Ξ½ 0
Γ (Ξ n κ β , fixed-point-of-value*-at Ξ½ (succ n))) ββ¨ II β©
is-defined-by-induction (β stepβ β Ξ½) β
where
I = head-tail-β {π€ β π₯} {fixed-point-of-value*-at Ξ½}
II = Γ-cong
(fixed-point-of-value*-at-0-β Ξ½)
(Ξ -cong fe' fe' (fixed-point-of-value*-at-succ-β Ξ½))
stepββ : β! Ξ½ κ Value t , value-condition t Ξ½ e
stepββ = equiv-to-singleton (Ξ£-bicong _ _ stepβ Ο) (β-is-nno-dep fe' A aβ Ο)
where
Ο : (Ξ½ : Value t)
β value-condition t Ξ½ e β is-defined-by-induction (β stepβ β Ξ½)
Ο Ξ½ = value-condition t Ξ½ e ββ¨ stepβ Ξ½ β©
(Ξ n κ β , fixed-point-of-value*-at Ξ½ n) ββ¨ stepβ Ξ½ β©
is-defined-by-induction (β stepβ β Ξ½) β
stepββ : β! (t , e) κ (Ξ£ t κ (Y β ββ) , t βΌ time* t) ,
Ξ£ Ξ½ κ Value t , value-condition t Ξ½ e
stepββ = Ξ£-is-singleton stepβ (Ξ» (t , e) β stepββ t e)
\end{code}
Putting the above steps together, we get our desired result.
\begin{code}
π»-is-final-coalgebra : β! h κ (Y β π» X) , is-π»-coalgebra-map k h
π»-is-final-coalgebra = s
where
e = (Ξ£ h κ (Y β π» X) , is-π»-coalgebra-map k h) ββ¨ by-stepβ β©
(Ξ£ h κ (Y β π» X) , coalgebra-condition h) ββ¨ stepβ β©
(Ξ£ (t , Ξ½) κ (Ξ£ t κ (Y β ββ) , Value t) ,
coalgebra-condition (pair t Ξ½)) ββ¨ Ξ£-assoc β©
(Ξ£ t κ (Y β ββ) , Ξ£ Ξ½ κ Value t ,
coalgebra-condition (pair t Ξ½)) ββ¨ by-stepβ β©
(Ξ£ t κ (Y β ββ) , Ξ£ Ξ½ κ Value t , Ξ y κ Y ,
pair t Ξ½ y οΌ (time t (k y) , value t Ξ½ (k y))) ββ¨ by-stepβ β©
(Ξ£ t κ (Y β ββ) , Ξ£ Ξ½ κ Value t ,
Ξ£ e κ t βΌ time* t , value-condition t Ξ½ e) ββ¨ I β©
(Ξ£ t κ (Y β ββ) , Ξ£ e κ t βΌ time* t ,
Ξ£ Ξ½ κ Value t , value-condition t Ξ½ e) ββ¨ II β©
(Ξ£ (t , e) κ (Ξ£ t κ (Y β ββ) , t βΌ time* t) ,
Ξ£ Ξ½ κ Value t , value-condition t Ξ½ e) β
where
by-stepβ = Ξ£-cong stepβ
by-stepβ = Ξ£-cong (Ξ» - β Ξ£-cong (stepβ -))
by-stepβ = Ξ£-cong (Ξ» - β Ξ£-cong (stepβ -))
I = Ξ£-cong (Ξ» - β Ξ£-flip)
II = β-sym Ξ£-assoc
s : is-singleton (Ξ£ h κ (Y β π» X) , is-π»-coalgebra-map k h)
s = equiv-to-singleton e stepββ
\end{code}