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 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 Circle.Integers open import 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}