Tom de Jong, 1-18 March 2021
We show that the induction principle for ๐ยน with propositional computation rules
follows from the universal property of ๐ยน.
This is claimed at the end of Section 6.2 in the HoTT Book and follows from a
general result by Sojakova in her PhD Thesis "Higher Inductive Types as
Homotopy-Initial Algebras" (CMU-CS-16-125). The proof of the general result is
quite complicated (see for instance Lemma 105 in the PhD thesis) and the
development below offers an alternative proof for ๐ยน.
\begin{code}
{-# OPTIONS --safe --without-K #-}
open import MLTT.Spartan
open import UF.Base
open import UF.Equiv
open import UF.FunExt
open import UF.Sets
open import UF.Sets-Properties
open import UF.Subsingletons
module SyntheticHomotopyTheory.Circle.Induction where
\end{code}
First some preliminaries on the free loop space.
\begin{code}
๐ : (X : ๐ค ฬ ) โ ๐ค ฬ
๐ X = ฮฃ x ๊ X , x ๏ผ x
๐-functor : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } (f : X โ Y) โ ๐ X โ ๐ Y
๐-functor f (x , p) = f x , ap f p
๐-functor-id : {X : ๐ค ฬ } โ ๐-functor id โผ id {๐ค} {๐ X}
๐-functor-id {๐ค} {X} (x , p) = to-ฮฃ-๏ผ (refl , ฮณ p)
where
ฮณ : {y z : X} (q : y ๏ผ z) โ transport (ฮป - โ y ๏ผ -) q refl ๏ผ q
ฮณ refl = refl
๐-functor-comp : {X : ๐ค ฬ } {Y : ๐ฅ ฬ } {Z : ๐ฆ ฬ } (f : X โ Y) (g : Y โ Z)
โ ๐-functor g โ ๐-functor f โผ ๐-functor (g โ f)
๐-functor-comp f g (x , p) = to-ฮฃ-๏ผ (refl , (ap-ap f g p))
ap-๐-functor-lemma : {A : ๐ค ฬ } {B : ๐ฅ ฬ } (f g : A โ B)
{a : A} (p : a ๏ผ a) {b : B} (q : b ๏ผ b)
(u : ๐-functor f (a , p) ๏ผ (b , q))
(v : ๐-functor g (a , p) ๏ผ (b , q))
(w : (f , u) ๏ผ (g , v))
โ ap (ฮป - โ ๐-functor - (a , p)) (ap prโ w) ๏ผ u โ v โปยน
ap-๐-functor-lemma f g p q refl v refl = refl
happly-๐-functor-lemma : {A : ๐ค ฬ } {B : ๐ฅ ฬ } (f g : A โ B)
{a : A} (p : a ๏ผ a) {b : B} (q : b ๏ผ b)
(u : ๐-functor f (a , p) ๏ผ (b , q))
(v : ๐-functor g (a , p) ๏ผ (b , q))
(w : (f , u) ๏ผ (g , v))
โ happly (ap prโ w) a ๏ผ (ap prโ u) โ (ap prโ v) โปยน
happly-๐-functor-lemma f g p q refl v refl = refl
\end{code}
Next we introduce the circle ๐ยน with its point base, its loop at base and its
universal property.
\begin{code}
module _
(๐ยน : ๐ค ฬ )
(base : ๐ยน)
(loop : base ๏ผ base)
where
๐ยน-universal-map : (A : ๐ฅ ฬ )
โ (๐ยน โ A) โ ๐ A
๐ยน-universal-map A f = (f base , ap f loop)
module _
(๐ยน-universal-property : {๐ฅ : Universe} (A : ๐ฅ ฬ )
โ is-equiv (๐ยน-universal-map A))
where
๐ยน-uniqueness-principle : {A : ๐ฅ ฬ } (a : A) (p : a ๏ผ a)
โ โ! r ๊ (๐ยน โ A) , (r base , ap r loop) ๏ผ (a , p)
๐ยน-uniqueness-principle {๐ฅ} {A} a p =
equivs-are-vv-equivs (๐ยน-universal-map A)
(๐ยน-universal-property A) (a , p)
๐ยน-at-most-one-function : {A : ๐ฅ ฬ } (a : A) (p : a ๏ผ a)
โ is-prop (ฮฃ r ๊ (๐ยน โ A) , (r base , ap r loop) ๏ผ (a , p))
๐ยน-at-most-one-function a p = singletons-are-props (๐ยน-uniqueness-principle a p)
\end{code}
The recursion principle for ๐ยน with its computation rule follows immediately
from the universal property of ๐ยน.
\begin{code}
๐ยน-rec : {A : ๐ฅ ฬ } (a : A) (p : a ๏ผ a)
โ ๐ยน โ A
๐ยน-rec {๐ฅ} {A} a p = โ!-witness (๐ยน-uniqueness-principle a p)
๐ยน-rec-comp : {A : ๐ฅ ฬ } (a : A) (p : a ๏ผ a)
โ ๐-functor (๐ยน-rec a p) (base , loop) ๏ผ[ ๐ A ] (a , p)
๐ยน-rec-comp {๐ฅ} {A} a p = โ!-is-witness (๐ยน-uniqueness-principle a p)
๐ยน-rec-on-base : {A : ๐ฅ ฬ } (a : A) (p : a ๏ผ a)
โ ๐ยน-rec a p base ๏ผ a
๐ยน-rec-on-base a p = ap prโ (๐ยน-rec-comp a p)
๐ยน-rec-on-loop : {A : ๐ฅ ฬ } (a : A) (p : a ๏ผ a)
โ transport (ฮป - โ - ๏ผ -) (๐ยน-rec-on-base a p)
(ap (๐ยน-rec a p) loop)
๏ผ p
๐ยน-rec-on-loop a p = from-ฮฃ-๏ผ' (๐ยน-rec-comp a p)
\end{code}
The induction principle for ๐ยน also follows quite directly. The idea is to turn
a type family A over ๐ยน to the type ฮฃ A and consider a nondependent map ๐ยน โ ฮฃ A
as a substitute for the dependent function (x : ๐ยน) โ A x.
What is significantly harder is showing that it obeys the computation rules.
\begin{code}
module ๐ยน-induction
(A : ๐ยน โ ๐ฅ ฬ )
(a : A base)
(l : transport A loop a ๏ผ a)
where
lโบ : (base , a) ๏ผ[ ฮฃ A ] (base , a)
lโบ = to-ฮฃ-๏ผ (loop , l)
r : ๐ยน โ ฮฃ A
r = ๐ยน-rec (base , a) lโบ
\end{code}
Next we show that r is a retraction of prโ : ฮฃ A โ ๐ยน. This tells us that
r (x) = (x , prโ (r x)), so that we can define ๐ยน-induction by transport.
\begin{code}
r-retraction-lemma : ๐-functor (prโ โ r) (base , loop) ๏ผ[ ๐ ๐ยน ] (base , loop)
r-retraction-lemma =
((prโ โ r) base , ap (prโ โ r) loop) ๏ผโจ I โฉ
๐-functor prโ (r base , ap r loop) ๏ผโจ II โฉ
(base , ap prโ (to-ฮฃ-๏ผ (loop , l))) ๏ผโจ III โฉ
(base , loop) โ
where
I = to-ฮฃ-๏ผ (refl , ((ap-ap r prโ loop) โปยน))
II = ap (๐-functor prโ) (๐ยน-rec-comp (base , a) lโบ)
III = to-ฮฃ-๏ผ (refl , (ap-prโ-to-ฮฃ-๏ผ (loop , l)))
r-is-retraction-of-prโ : prโ โ r ๏ผ id
r-is-retraction-of-prโ = ap prโ (๐ยน-at-most-one-function base loop
(prโ โ r , r-retraction-lemma)
(id , to-ฮฃ-๏ผ (refl , ap-id-is-id loop)))
๐ยน-induction : (x : ๐ยน) โ A x
๐ยน-induction x = transport A (happly r-is-retraction-of-prโ x) (prโ (r x))
\end{code}
Next we set out to prove the computation rules for ๐ยน-induction.
\begin{code}
ฯ : ๐ยน โ ฮฃ A
ฯ x = (x , ๐ยน-induction x)
r-comp : (r base , ap r loop) ๏ผ[ ๐ (ฮฃ A) ] ((base , a) , lโบ)
r-comp = ๐ยน-rec-comp (base , a) lโบ
ฯ-r-homotopy : ฯ โผ r
ฯ-r-homotopy x = to-ฮฃ-๏ผ ((ฮณโ โปยน) , ฮณโ)
where
ฮณโ : prโ (r x) ๏ผ prโ (ฯ x)
ฮณโ = happly r-is-retraction-of-prโ x
ฮณโ = transport A (ฮณโ โปยน) (prโ (ฯ x)) ๏ผโจ refl โฉ
transport A (ฮณโ โปยน) (transport A ฮณโ (prโ (r x))) ๏ผโจ I โฉ
transport A (ฮณโ โ ฮณโ โปยน) (prโ (r x)) ๏ผโจ II โฉ
transport A refl (prโ (r x)) ๏ผโจ refl โฉ
prโ (r x) โ
where
I = (transport-โ A ฮณโ (ฮณโ โปยน)) โปยน
II = ap (ฮป - โ transport A - (prโ (r x))) ((right-inverse ฮณโ) โปยน)
ฯ-and-r-on-base-and-loop : (ฯ base , ap ฯ loop) ๏ผ[ ๐ (ฮฃ A) ] (r base , ap r loop)
ฯ-and-r-on-base-and-loop = to-ฮฃ-๏ผ (ฯ-r-homotopy base , ฮณ)
where
ฮณ = transport (ฮป - โ - ๏ผ -) (ฯ-r-homotopy base) (ap ฯ loop) ๏ผโจ I โฉ
ฯ-r-homotopy base โปยน โ ap ฯ loop โ ฯ-r-homotopy base ๏ผโจ II โฉ
ap r loop โ
where
I = transport-along-๏ผ (ฯ-r-homotopy base) (ap ฯ loop)
II = homotopies-are-natural'' ฯ r ฯ-r-homotopy {base} {base} {loop}
ฯ-comp : (ฯ base , ap ฯ loop) ๏ผ[ ๐ (ฮฃ A) ] ((base , a) , lโบ)
ฯ-comp = ฯ-and-r-on-base-and-loop โ r-comp
\end{code}
Looking at ฯ-comp, we see that ฯ base = (base , ๐ยน-induction base) ๏ผ (base , a),
which looks promising, for if we can show that the equality in the first
component is refl, then ๐ยน-induction base ๏ผ a would follow. So that's exactly
what we do next.
\begin{code}
ฯ-comp-lemma : ap prโ (ap prโ ฯ-comp) ๏ผ refl
ฯ-comp-lemma =
ap prโ (ap prโ ฯ-comp) ๏ผโจ I โฉ
ap (prโ โ prโ) ฯ-comp ๏ผโจ II โฉ
ap (prโ โ prโ) ฯ-and-r-on-base-and-loop โ ap (prโ โ prโ) r-comp ๏ผโจ III โฉ
p โปยน โ p ๏ผโจ IV โฉ
refl โ
where
p = happly r-is-retraction-of-prโ base
I = ap-ap prโ prโ ฯ-comp
II = ap-โ (prโ โ prโ) ฯ-and-r-on-base-and-loop r-comp
IV = left-inverse p
III = apโ _โ_ ฮณโ ฮณโ
where
ฮณโ : ap (prโ โ prโ) ฯ-and-r-on-base-and-loop ๏ผ p โปยน
ฮณโ = ap (prโ โ prโ) ฯ-and-r-on-base-and-loop ๏ผโจ Iโ โฉ
ap prโ (ap prโ ฯ-and-r-on-base-and-loop) ๏ผโจ IIโ โฉ
ap prโ (ฯ-r-homotopy base) ๏ผโจ IIIโ โฉ
p โปยน โ
where
Iโ = (ap-ap prโ prโ ฯ-and-r-on-base-and-loop) โปยน
IIโ = ap (ap prโ) (ap-prโ-to-ฮฃ-๏ผ (ฯ-r-homotopy base , _))
IIIโ = ap-prโ-to-ฮฃ-๏ผ ((p โปยน) , _)
ฮณโ : ap (prโ โ prโ) r-comp ๏ผ p
ฮณโ = ฯ โปยน
where
ฮบ = r-retraction-lemma
ฯ = p ๏ผโจ Iโ โฉ
ap prโ ฮบ โ ap ฯ (to-ฮฃ-๏ผ (refl , ap-id-is-id loop)) โปยน ๏ผโจ IIโ โฉ
ap prโ ฮบ โ refl โปยน ๏ผโจ refl โฉ
ap prโ ฮบ ๏ผโจ IIIโ โฉ
ap prโ (ap prโ r-comp) ๏ผโจ IVโ โฉ
ap (prโ โ prโ) r-comp โ
where
ฯ : ๐ (๐ยน) โ ๐ยน
ฯ = prโ
Iโ = happly-๐-functor-lemma (prโ โ r) id loop loop
ฮบ (to-ฮฃ-๏ผ (refl , ap-id-is-id loop))
(๐ยน-at-most-one-function base loop
(prโ โ r , r-retraction-lemma)
(id , to-ฮฃ-๏ผ (refl , ap-id-is-id loop)))
IIโ = ap (ฮป - โ ap prโ ฮบ โ - โปยน)
(ap-prโ-to-ฮฃ-๏ผ {๐ค} {๐ค} {๐ยน} {ฮป - โ (- ๏ผ -)} {_} {_}
(refl , ap-id-is-id loop))
IVโ = ap-ap prโ prโ r-comp
IIIโ = ap prโ ฮบ ๏ผโจ refl โฉ
ap prโ (ฮบโ โ (ฮบโ โ ฮบโ)) ๏ผโจ I' โฉ
ap prโ ฮบโ โ ap prโ (ฮบโ โ ฮบโ) ๏ผโจ II' โฉ
refl โ ap prโ (ฮบโ โ ฮบโ) ๏ผโจ III' โฉ
ap prโ (ฮบโ โ ฮบโ) ๏ผโจ IV' โฉ
ap prโ ฮบโ โ ap prโ ฮบโ ๏ผโจ V' โฉ
ap prโ ฮบโ โ refl ๏ผโจ refl โฉ
ap prโ ฮบโ ๏ผโจ VI' โฉ
ap (prโ โ ๐-functor prโ) r-comp ๏ผโจ refl โฉ
ap (prโ โ prโ) r-comp ๏ผโจ VII' โฉ
ap prโ (ap prโ r-comp) โ
where
ฮบโ = to-ฮฃ-๏ผ (refl , ((ap-ap r prโ loop) โปยน))
ฮบโ = ap (๐-functor prโ) r-comp
ฮบโ = to-ฮฃ-๏ผ (refl , (ap-prโ-to-ฮฃ-๏ผ (loop , l)))
I' = ap-โ prโ ฮบโ (ฮบโ โ ฮบโ)
II' = ap (_โ (ap prโ (ฮบโ โ ฮบโ)))
(ap-prโ-to-ฮฃ-๏ผ {๐ค} {๐ค} {๐ยน} {ฮป - โ (- ๏ผ -)} {_} {_}
(refl , ((ap-ap r prโ loop) โปยน)))
III' = refl-left-neutral
IV' = ap-โ prโ ฮบโ ฮบโ
V' = ap ((ap prโ ฮบโ) โ_)
(ap-prโ-to-ฮฃ-๏ผ {๐ค} {๐ค} {๐ยน} {ฮป - โ (- ๏ผ -)} {_} {_}
(refl , ap-prโ-to-ฮฃ-๏ผ (loop , l)))
VI' = ap-ap (๐-functor prโ) prโ r-comp
VII' = (ap-ap prโ prโ r-comp) โปยน
๐ยน-induction-on-base : ๐ยน-induction base ๏ผ a
๐ยน-induction-on-base =
transport (ฮป - โ transport A - (๐ยน-induction base) ๏ผ a) ฯ-comp-lemma ฮณ
where
ฮณ : transport A (ap prโ (ap prโ ฯ-comp)) (๐ยน-induction base) ๏ผ a
ฮณ = from-ฮฃ-๏ผ' (ap prโ ฯ-comp)
\end{code}
This takes care of the first computation rule for ๐ยน-induction. We can
get a fairly direct proof of the second computation rule (the one for
loop) by assuming that base ๏ผ base is a set, because this tells us
that every element of loop ๏ผ loop must be refl.
We can satisfy this assumption for our intended application (see
CircleConstruction.lagda), because for the construction involving โค-torsors it's
is quite easy to prove that base ๏ผ base is a set.
However, for completeness sake, below we also show that assuming function
extensionality and univalence, it is possible to prove that base ๏ผ base is a
set, by using both computation rules for ๐ยน-rec and the first computation rule
for ๐ยน-induction.
\begin{code}
๐ยน-induction-on-loop-lemma : (loop , transport (ฮป - โ transport A loop - ๏ผ -)
๐ยน-induction-on-base
(apd ๐ยน-induction loop))
๏ผ (loop , l)
๐ยน-induction-on-loop-lemma =
(fromto-ฮฃ-๏ผ (loop , transport (ฮป - โ transport A loop - ๏ผ -) ฯ ฯ)) โปยน
โ (ap from-ฮฃ-๏ผ ฮณ) โ (fromto-ฮฃ-๏ผ (loop , l))
where
ฯ = ๐ยน-induction-on-base
ฯ = apd ๐ยน-induction loop
ฮณ : to-ฮฃ-๏ผ (loop , transport (ฮป - โ transport A loop - ๏ผ -) ฯ ฯ)
๏ผ to-ฮฃ-๏ผ (loop , l)
ฮณ = to-ฮฃ-๏ผ (loop , transport (ฮป - โ transport A loop - ๏ผ -) ฯ ฯ) ๏ผโจ I โฉ
transport (ฮป - โ - ๏ผ -) (to-ฮฃ-๏ผ (refl , ฯ)) (to-ฮฃ-๏ผ (loop , ฯ)) ๏ผโจ II โฉ
transport (ฮป - โ - ๏ผ -) (ap prโ ฯ-comp) (to-ฮฃ-๏ผ (loop , ฯ)) ๏ผโจ III โฉ
transport (ฮป - โ - ๏ผ -) (ap prโ ฯ-comp) (ap ฯ loop) ๏ผโจ IV โฉ
to-ฮฃ-๏ผ (loop , l) โ
where
I = h loop ฯ ฯ
where
h : {X : ๐ฆ ฬ } {Y : X โ ๐ฃ ฬ } {x : X} (p : x ๏ผ x) {y y' : Y x}
(q : y ๏ผ y') (q' : transport Y p y ๏ผ y)
โ to-ฮฃ-๏ผ (p , transport (ฮป - โ transport Y p - ๏ผ -) q q')
๏ผ transport (ฮป - โ - ๏ผ -) (to-ฮฃ-๏ผ (refl , q)) (to-ฮฃ-๏ผ (p , q'))
h p refl q' = refl
II = ap (ฮป - โ transport (ฮป - โ - ๏ผ -) - (to-ฮฃ-๏ผ (loop , ฯ))) h
where
h = to-ฮฃ-๏ผ (refl , ฯ) ๏ผโจ I' โฉ
to-ฮฃ-๏ผ (from-ฮฃ-๏ผ (ap prโ ฯ-comp)) ๏ผโจ II' โฉ
ap prโ ฯ-comp โ
where
I' = (ap to-ฮฃ-๏ผ (to-ฮฃ-๏ผ (ฯ-comp-lemma , refl))) โปยน
II' = tofrom-ฮฃ-๏ผ (ap prโ ฯ-comp)
III = ap (transport (ฮป - โ - ๏ผ -) (ap prโ ฯ-comp)) (h ๐ยน-induction loop)
where
h : {X : ๐ฆ ฬ } {Y : X โ ๐ฃ ฬ } (f : (x : X) โ Y x)
{x x' : X} (p : x ๏ผ x')
โ to-ฮฃ-๏ผ (p , apd f p) ๏ผ ap (ฮป x โ (x , f x)) p
h f refl = refl
IV = from-ฮฃ-๏ผ' ฯ-comp
module _
(base-sethood : is-set (base ๏ผ base))
where
๐ยน-induction-on-loop : transport (ฮป - โ transport A loop - ๏ผ -)
๐ยน-induction-on-base (apd ๐ยน-induction loop)
๏ผ l
๐ยน-induction-on-loop =
ap-prโ-refl-lemma (ฮป - โ transport A - a ๏ผ a) ๐ยน-induction-on-loop-lemma ฮณ
where
ฮณ : ap prโ ๐ยน-induction-on-loop-lemma ๏ผ refl
ฮณ = base-sethood (ap prโ ๐ยน-induction-on-loop-lemma) refl
๐ยน-induction-comp : (๐ยน-induction base , apd ๐ยน-induction loop)
๏ผ[ ฮฃ y ๊ A base , transport A loop y ๏ผ y ] (a , l)
๐ยน-induction-comp = to-ฮฃ-๏ผ (๐ยน-induction-on-base , ๐ยน-induction-on-loop)
\end{code}
As promised above, here follows a proof, assuming function
extensionality and univalence, that base ๏ผ base is a set, using both
computation rules for ๐ยน-rec and the first computation rule for
๐ยน-induction.
The proof uses the encode-decode method (Section 8.1.4 of the HoTT
Book) to show that base ๏ผ base is a retract of โค. Since sets are
closed under retracts, the claim follows.
\begin{code}
open import SyntheticHomotopyTheory.Circle.Integers
open import SyntheticHomotopyTheory.Circle.Integers-Properties
open import UF.Univalence
module _
(ua : is-univalent ๐คโ)
where
succ-โค-๏ผ : โค ๏ผ โค
succ-โค-๏ผ = eqtoid ua โค โค succ-โค-โ
code : ๐ยน โ ๐คโ ฬ
code = ๐ยน-rec โค succ-โค-๏ผ
\end{code}
Using the first computation rule for ๐ยน-rec:
\begin{code}
code-on-base : code base ๏ผ โค
code-on-base = ๐ยน-rec-on-base โค succ-โค-๏ผ
โค-to-code-base : โค โ code base
โค-to-code-base = Idtofun (code-on-base โปยน)
code-base-to-โค : code base โ โค
code-base-to-โค = Idtofun code-on-base
transport-code-loop-is-succ-โค : code-base-to-โค
โ transport code loop
โ โค-to-code-base
๏ผ succ-โค
transport-code-loop-is-succ-โค =
ฮด โ transport code loop โ ฮต ๏ผโจ I โฉ
ฮด โ transport id acl โ ฮต ๏ผโจ refl โฉ
Idtofun cob โ Idtofun acl โ Idtofun (cob โปยน) ๏ผโจ II โฉ
Idtofun cob โ Idtofun (cob โปยน โ acl) ๏ผโจ III โฉ
Idtofun (cob โปยน โ acl โ cob) ๏ผโจ IV โฉ
Idtofun succ-โค-๏ผ ๏ผโจ V โฉ
succ-โค โ
where
cob = code-on-base
acl = ap code loop
ฮต = โค-to-code-base
ฮด = code-base-to-โค
I = ap (ฮป - โ ฮด โ - โ ฮต) (transport-ap' id code loop)
II = ap (_โ_ (Idtofun cob)) ((Idtofun-โ ua (cob โปยน) acl) โปยน)
III = (Idtofun-โ ua (cob โปยน โ acl) cob) โปยน
\end{code}
Using the second computation rule for ๐ยน-rec
\begin{code}
IV = ap Idtofun ((transport-along-๏ผ cob acl) โปยน
โ (๐ยน-rec-on-loop โค succ-โค-๏ผ))
V = Idtofun-eqtoid ua succ-โค-โ
transport-code-loopโปยน-is-pred-โค : code-base-to-โค
โ transport code (loop โปยน)
โ โค-to-code-base
โผ pred-โค
transport-code-loopโปยน-is-pred-โค x = equivs-are-lc succ-โค succ-โค-is-equiv ฮณ
where
ฮณ : (succ-โค โ code-base-to-โค โ transport code (loop โปยน) โ โค-to-code-base) x
๏ผ (succ-โค โ pred-โค) x
ฮณ = (succ-โค โ ฮด โ tโปยน โ ฮต) x ๏ผโจ I โฉ
(ฮด โ t โ ฮต โ ฮด โ tโปยน โ ฮต) x ๏ผโจ II โฉ
(ฮด โ t โ tโปยน โ ฮต) x ๏ผโจ III โฉ
(ฮด โ ฮต) x ๏ผโจ IV โฉ
x ๏ผโจ V โฉ
(succ-โค โ pred-โค) x โ
where
ฮต = โค-to-code-base
ฮด = code-base-to-โค
tโปยน = transport code (loop โปยน)
t = transport code loop
I = happly (transport-code-loop-is-succ-โค โปยน) ((ฮด โ tโปยน โ ฮต) x)
II = ap (ฮด โ t) (Idtofun-section code-on-base (tโปยน (ฮต x)))
III = ap ฮด (back-and-forth-transport loop)
IV = Idtofun-retraction code-on-base x
V = (succ-โค-is-retraction x) โปยน
transport-code-loopโปยน-is-pred-โค' : transport code (loop โปยน)
โผ โค-to-code-base โ pred-โค โ code-base-to-โค
transport-code-loopโปยน-is-pred-โค' x =
transport code (loop โปยน) x ๏ผโจ I โฉ
(ฮต โ ฮด โ transport code (loop โปยน)) x ๏ผโจ II โฉ
(ฮต โ ฮด โ transport code (loop โปยน) โ ฮต โ ฮด) x ๏ผโจ III โฉ
(ฮต โ pred-โค โ ฮด) x โ
where
ฮต = โค-to-code-base
ฮด = code-base-to-โค
I = (Idtofun-section code-on-base (transport code (loop โปยน) x)) โปยน
II = ap (ฮต โ ฮด โ transport code (loop โปยน))
((Idtofun-section code-on-base x) โปยน)
III = ap ฮต (transport-code-loopโปยน-is-pred-โค (ฮด x))
encode : (x : ๐ยน) โ (base ๏ผ x) โ code x
encode x p = transport code p (โค-to-code-base ๐)
iterated-path : {X : ๐ฆ ฬ } {x : X} โ x ๏ผ x โ โ โ x ๏ผ x
iterated-path p zero = refl
iterated-path p (succ n) = p โ iterated-path p n
iterated-path-comm : {X : ๐ฆ ฬ } {x : X} (p : x ๏ผ x) (n : โ)
โ iterated-path p n โ p ๏ผ p โ iterated-path p n
iterated-path-comm p zero = refl โ p ๏ผโจ refl-left-neutral โฉ
p ๏ผโจ refl โฉ
p โ refl โ
iterated-path-comm p (succ n) = p โ iterated-path p n โ p ๏ผโจ I โฉ
p โ (iterated-path p n โ p) ๏ผโจ II โฉ
p โ (p โ iterated-path p n) โ
where
I = โassoc p (iterated-path p n) p
II = ap (p โ_) (iterated-path-comm p n)
loops : โค โ base ๏ผ base
loops ๐ = refl
loops (pos n) = iterated-path loop (succ n)
loops (neg n) = iterated-path (loop โปยน) (succ n)
module _
(fe : funext ๐คโ ๐ค)
where
open import UF.Lower-FunExt
loops-lemma : (_โ loop) โ loops โ pred-โค ๏ผ loops
loops-lemma = dfunext fe h
where
h : (k : โค) โ loops (pred-โค k) โ loop ๏ผ loops k
h ๐ = loop โปยน โ refl โ loop ๏ผโจ refl โฉ
loop โปยน โ loop ๏ผโจ left-inverse loop โฉ
refl โ
h (pos n) = g n
where
g : (n : โ) โ loops (pred-โค (pos n)) โ loop ๏ผ loops (pos n)
g zero = iterated-path-comm loop zero
g (succ n) = iterated-path-comm loop (succ n)
h (neg n) =
loop โปยน โ (loop โปยน โ iterated-path (loop โปยน) n) โ loop ๏ผโจ I' โฉ
loop โปยน โ (iterated-path (loop โปยน) n โ loop โปยน) โ loop ๏ผโจ II' โฉ
loop โปยน โ iterated-path (loop โปยน) n โ (loop โปยน โ loop) ๏ผโจ III' โฉ
loop โปยน โ iterated-path (loop โปยน) n โ
where
I' = ap (ฮป - โ loop โปยน โ - โ loop)
((iterated-path-comm (loop โปยน) n) โปยน)
II' = โassoc (loop โปยน) (iterated-path (loop โปยน) n โ loop โปยน) loop
โ ap (loop โปยน โ_)
(โassoc (iterated-path (loop โปยน) n) (loop โปยน) loop)
โ (โassoc (loop โปยน) (iterated-path (loop โปยน) n)
(loop โปยน โ loop)) โปยน
III' = ap ((loop โปยน โ iterated-path (loop โปยน) n) โ_)
(left-inverse loop)
transport-loops-lemma : transport (ฮป - โ code - โ base ๏ผ -) loop
(loops โ code-base-to-โค)
๏ผ (loops โ code-base-to-โค)
transport-loops-lemma =
transport (ฮป - โ code - โ base ๏ผ -) loop f ๏ผโจ I โฉ
transport (ฮป - โ base ๏ผ -) loop โ f โ transport code (loop โปยน) ๏ผโจ II โฉ
(_โ loop) โ f โ transport code (loop โปยน) ๏ผโจ III โฉ
(_โ loop) โ loops โ ฮด โ ฮต โ pred-โค โ ฮด ๏ผโจ IV โฉ
(_โ loop) โ loops โ pred-โค โ ฮด ๏ผโจ V โฉ
loops โ ฮด โ
where
ฮต : โค โ code base
ฮต = โค-to-code-base
ฮด : code base โ โค
ฮด = code-base-to-โค
f : code base โ base ๏ผ base
f = loops โ ฮด
I = transport-along-โ code (_๏ผ_ base) loop f
II = refl
III = ap ((_โ loop) โ f โ_)
(dfunext (lower-funext ๐คโ ๐ค fe) transport-code-loopโปยน-is-pred-โค')
IV = ap (ฮป - โ (_โ loop) โ loops โ - โ pred-โค โ ฮด)
(dfunext (lower-funext ๐คโ ๐ค fe) (Idtofun-retraction code-on-base))
V = ap (_โ ฮด) loops-lemma
open ๐ยน-induction (ฮป - โ code - โ base ๏ผ -)
(loops โ code-base-to-โค)
transport-loops-lemma
decode : (x : ๐ยน) โ code x โ base ๏ผ x
decode = ๐ยน-induction
decode-encode : (x : ๐ยน) (p : base ๏ผ x) โ decode x (encode x p) ๏ผ p
decode-encode base refl =
decode base (encode base refl) ๏ผโจ refl โฉ
decode base (transport code refl (โค-to-code-base ๐)) ๏ผโจ refl โฉ
decode base (โค-to-code-base ๐) ๏ผโจ I โฉ
loops (code-base-to-โค (โค-to-code-base ๐)) ๏ผโจ II โฉ
loops ๐ ๏ผโจ refl โฉ
refl โ
where
\end{code}
Using the first computation rule for ๐ยน-induction
\begin{code}
I = happly ๐ยน-induction-on-base (โค-to-code-base ๐)
II = ap loops (Idtofun-retraction code-on-base ๐)
open import UF.Retracts
ฮฉ๐ยน-is-set : is-set (base ๏ผ base)
ฮฉ๐ยน-is-set = subtypes-of-sets-are-sets' (encode base)
(sections-are-lc (encode base)
((decode base) , (decode-encode base)))
(transport is-set (code-on-base โปยน) โค-is-set)
module ๐ยน-induction'
{๐ฅ : Universe}
(A : ๐ยน โ ๐ฅ ฬ )
(a : A base)
(l : transport A loop a ๏ผ a)
(fe : funext ๐คโ ๐ค)
(ua : is-univalent ๐คโ)
where
open ๐ยน-induction A a l
๐ยน-induction-on-loop' : transport (ฮป - โ transport A loop - ๏ผ -)
๐ยน-induction-on-base (apd ๐ยน-induction loop)
๏ผ l
๐ยน-induction-on-loop' = ๐ยน-induction-on-loop (ฮฉ๐ยน-is-set ua fe)
๐ยน-induction-comp' : (๐ยน-induction base , apd ๐ยน-induction loop)
๏ผ[ ฮฃ y ๊ A base , transport A loop y ๏ผ y ] (a , l)
๐ยน-induction-comp' = ๐ยน-induction-comp (ฮฉ๐ยน-is-set ua fe)
\end{code}