Tom de Jong
Reboot: 22 January 2021
Earlier version: 18 September 2020

We show that the type of integers enjoys the symmetric induction principle, as
used in constructing the circle as the type of โ„ค-torsors. The symmetric
induction principle appears as Theorem 3.13 in "Construction of the circle in
UniMath" by Bezem, Buchholtz, Grayson and Shulman
(doi:10.1016/j.jpaa.2021.106687).

\begin{code}

{-# OPTIONS --safe --without-K #-}

open import Naturals.UniversalProperty

open import Circle.Integers
open import Circle.Integers-Properties

open import MLTT.Spartan
open import UF.Embeddings
open import UF.Equiv
open import UF.EquivalenceExamples
open import UF.FunExt
open import UF.Subsingletons

module Circle.Integers-SymmetricInduction where

โ„ค-symmetric-induction : {๐“ค : Universe}
                      โ†’ funext ๐“คโ‚€ ๐“ค
                      โ†’ (A : โ„ค โ†’ ๐“ค ฬ‡ )
                        (f : (z : โ„ค) โ†’ A z โ‰ƒ A (succ-โ„ค z))
                      โ†’ (ฮฃ h ๊ž‰ ฮ  A , ((z : โ„ค) โ†’ h (succ-โ„ค z) ๏ผ โŒœ f z โŒ (h z)))
                      โ‰ƒ A ๐ŸŽ
โ„ค-symmetric-induction {๐“ค} fe A f =
 (ฮฃ h ๊ž‰ ฮ  A , Qโ‚ h)                                               โ‰ƒโŸจ I    โŸฉ
 (ฮฃ h ๊ž‰ (ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) ร— ฮ  (A โˆ˜ inr)) , Qโ‚ (gโ‚ h))                  โ‰ƒโŸจ II   โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ฮฃ hแตฃ ๊ž‰ ฮ  (A โˆ˜ inr) , Qโ‚ (gโ‚ (hโ‚’ , hแตฃ)))    โ‰ƒโŸจ III  โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ฮฃ hแตฃ ๊ž‰ (ฮ  (A โˆ˜ pos) ร— ฮ  (A โˆ˜ neg)),
                         Qโ‚‚ hโ‚’ (gโ‚‚ hแตฃ))                           โ‰ƒโŸจ IV   โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ฮฃ hโ‚š ๊ž‰ ฮ  (A โˆ˜ pos) ,
                       ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚‚ hโ‚’ (gโ‚‚ (hโ‚š , hโ‚™))) โ‰ƒโŸจ V    โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ฮฃ hโ‚š ๊ž‰ ฮ  (A โˆ˜ pos) ,
                       ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚š (hโ‚’ โ‹†) hโ‚š
                                          ร— Qโ‚™' (hโ‚’ โ‹†) hโ‚™)        โ‰ƒโŸจ VI   โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ((ฮฃ hโ‚š ๊ž‰ ฮ  (A โˆ˜ pos) , Qโ‚š (hโ‚’ โ‹†) hโ‚š)
                     ร—  (ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚™' (hโ‚’ โ‹†) hโ‚™)))    โ‰ƒโŸจ VII  โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ๐Ÿ™ ร— (ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚™' (hโ‚’ โ‹†) hโ‚™))  โ‰ƒโŸจ VIII โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚™' (hโ‚’ โ‹†) hโ‚™)        โ‰ƒโŸจ IX   โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚™ (hโ‚’ โ‹†) hโ‚™)         โ‰ƒโŸจ X    โŸฉ
 (ฮฃ hโ‚’ ๊ž‰ ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) , ๐Ÿ™)                                         โ‰ƒโŸจ XI   โŸฉ
 ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ)                                                      โ‰ƒโŸจ XII  โŸฉ
 A ๐ŸŽ โ– 
  where
   โŒœ๐ŸŽโŒ : ๐Ÿ™ {๐“คโ‚€} โ†’ โ„ค
   โŒœ๐ŸŽโŒ _ = ๐ŸŽ
   Qโ‚ : ฮ  A โ†’ ๐“ค ฬ‡
   Qโ‚ h = (z : โ„ค) โ†’ h (succ-โ„ค z) ๏ผ โŒœ f z โŒ (h z)
   gโ‚ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) ร— ฮ  (A โˆ˜ inr) โ†’ ฮ  A
   gโ‚ = โŒœ ฮ ร—+ fe โŒ
   Qโ‚‚ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ) โ†’ ฮ  (A โˆ˜ inr) โ†’ ๐“ค ฬ‡
   Qโ‚‚ hโ‚’ hแตฃ = Qโ‚ (gโ‚ (hโ‚’ , hแตฃ))
   gโ‚‚ : ฮ  (A โˆ˜ pos) ร— ฮ  (A โˆ˜ neg) โ†’ ฮ  (A โˆ˜ inr)
   gโ‚‚ = โŒœ ฮ ร—+ fe โŒ
   Qโ‚š : A ๐ŸŽ โ†’ ฮ  (A โˆ˜ pos) โ†’ ๐“ค ฬ‡
   Qโ‚š aโ‚’ hโ‚š = (hโ‚š 0 ๏ผ โŒœ f ๐ŸŽ โŒ aโ‚’)
            ร— ((n : โ„•) โ†’ hโ‚š (succ n) ๏ผ โŒœ f (pos n) โŒ (hโ‚š n))
   Qโ‚™' : A ๐ŸŽ โ†’ ฮ  (A โˆ˜ neg) โ†’ ๐“ค ฬ‡
   Qโ‚™' aโ‚€ hโ‚™ = (aโ‚€ ๏ผ โŒœ f (neg 0) โŒ (hโ‚™ 0))
             ร— ((n : โ„•) โ†’ hโ‚™ n ๏ผ โŒœ f (neg (succ n)) โŒ (hโ‚™ (succ n)))
   Qโ‚™ : A ๐ŸŽ โ†’ ฮ  (A โˆ˜ neg) โ†’ ๐“ค ฬ‡
   Qโ‚™ aโ‚’ hโ‚™ = (hโ‚™ 0 ๏ผ โŒœ (f (neg 0)) โŒโปยน aโ‚’)
            ร— ((n : โ„•) โ†’ hโ‚™ (succ n) ๏ผ โŒœ (f (neg (succ n))) โŒโปยน (hโ‚™ n))
   I    = โ‰ƒ-sym (ฮฃ-change-of-variable Qโ‚ gโ‚ (โŒœโŒ-is-equiv (ฮ ร—+ fe)))
   II   = ฮฃ-assoc
   III  = ฮฃ-cong
          (ฮป hโ‚’ โ†’ โ‰ƒ-sym (ฮฃ-change-of-variable (Qโ‚‚ hโ‚’) gโ‚‚ (โŒœโŒ-is-equiv (ฮ ร—+ fe))))
   IV   = ฮฃ-cong (ฮป _ โ†’ ฮฃ-assoc)
   V    = ฮฃ-cong ฮป hโ‚’ โ†’ ฮฃ-cong (ฮป hโ‚š โ†’ ฮฃ-cong (ฮป hโ‚™ โ†’ ฮณ hโ‚’ hโ‚š hโ‚™))
    where
     ฮณ : (hโ‚’ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ))  (hโ‚š : ฮ  (A โˆ˜ pos)) (hโ‚™ : ฮ  (A โˆ˜ neg))
       โ†’ Qโ‚‚ hโ‚’ (gโ‚‚ (hโ‚š , hโ‚™)) โ‰ƒ Qโ‚š (hโ‚’ โ‹†) hโ‚š ร— Qโ‚™' (hโ‚’ โ‹†) hโ‚™
     ฮณ hโ‚’ hโ‚š hโ‚™ = qinveq ฯ† (ฯˆ , ฮท , ฮต)
      where
       ฯ† : Qโ‚‚ hโ‚’ (gโ‚‚ (hโ‚š , hโ‚™)) โ†’ Qโ‚š (hโ‚’ โ‹†) hโ‚š ร— Qโ‚™' (hโ‚’ โ‹†) hโ‚™
       ฯ† q = ((q ๐ŸŽ , q โˆ˜ pos) , (q (neg 0) , q โˆ˜ neg โˆ˜ succ))
       ฯˆ : (Qโ‚š (hโ‚’ โ‹†) hโ‚š ร— Qโ‚™' (hโ‚’ โ‹†) hโ‚™) โ†’ Qโ‚‚ hโ‚’ (gโ‚‚ (hโ‚š , hโ‚™))
       ฯˆ ((qโ‚’ , qโ‚š) , (qโ‚’' , qโ‚™')) = c
        where
         c : Qโ‚‚ hโ‚’ (gโ‚‚ (hโ‚š , hโ‚™))
         c ๐ŸŽ              = qโ‚’
         c (pos n)        = qโ‚š n
         c (neg zero)     = qโ‚’'
         c (neg (succ n)) = qโ‚™' n
       ฮต : ฯ† โˆ˜ ฯˆ โˆผ id
       ฮต q = refl
       ฮท : ฯˆ โˆ˜ ฯ† โˆผ id
       ฮท q = dfunext fe c
        where
         c : (z : โ„ค) โ†’ (ฯˆ (ฯ† q)) z ๏ผ q (z)
         c ๐ŸŽ              = refl
         c (pos n)        = refl
         c (neg zero)     = refl
         c (neg (succ n)) = refl
   VI   = ฮฃ-cong ฮณ
    where
     ฮณ : (hโ‚’ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ))
       โ†’ (ฮฃ hโ‚š ๊ž‰ ฮ  (A โˆ˜ pos) , ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚š (hโ‚’ โ‹†) hโ‚š ร— Qโ‚™' (hโ‚’ โ‹†) hโ‚™)
       โ‰ƒ (  (ฮฃ hโ‚š ๊ž‰ ฮ  (A โˆ˜ pos) , Qโ‚š (hโ‚’ โ‹†) hโ‚š)
          ร— (ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚™' (hโ‚’ โ‹†) hโ‚™))
     ฮณ hโ‚’ = ฮฃ-interchange
   VII  = ฮฃ-cong (ฮป hโ‚’ โ†’ ร—-cong (singleton-โ‰ƒ-๐Ÿ™ {๐“ค} {๐“คโ‚€} (ฮณ hโ‚’)) (โ‰ƒ-refl _))
    where
     ฮณ : (hโ‚’ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ))
       โ†’ is-singleton ((ฮฃ hโ‚š ๊ž‰ ฮ  (A โˆ˜ pos) , Qโ‚š  (hโ‚’ โ‹†) hโ‚š))
     ฮณ hโ‚’ = (โ„•-is-nno-dep fe (A โˆ˜ pos) aโ‚€ s)
      where
       aโ‚€ : A (pos 0)
       aโ‚€ = โŒœ (f ๐ŸŽ) โŒ (hโ‚’ โ‹†)
       s : (n : โ„•) โ†’ A (pos n) โ†’ A (pos (succ n))
       s n = โŒœ f (pos n) โŒ
   VIII = ฮฃ-cong (ฮป hโ‚’ โ†’ ๐Ÿ™-lneutral)
   IX   = ฮฃ-cong (ฮป hโ‚’ โ†’ ฮฃ-cong (ฮป hโ‚™ โ†’ ฮณ hโ‚’ hโ‚™))
    where
     ฮณ : (hโ‚’ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ)) (hโ‚™ : ฮ  (A โˆ˜ neg))
       โ†’ Qโ‚™' (hโ‚’ โ‹†) hโ‚™ โ‰ƒ Qโ‚™ (hโ‚’ โ‹†) hโ‚™
     ฮณ hโ‚’ hโ‚™ = ร—-cong ฮณโ‚€ (ฮ -cong fe fe ฮณโ‚™)
      where
       fโ‚€ = โŒœ f (neg 0) โŒ
       fโ‚€โปยน = โŒœ (f (neg 0)) โŒโปยน
       eโ‚€ : is-equiv fโ‚€
       eโ‚€ = โŒœโŒ-is-equiv (f (neg 0))
       ฮณโ‚€ : (hโ‚’ โ‹† ๏ผ fโ‚€ (hโ‚™ 0))
          โ‰ƒ (hโ‚™ 0 ๏ผ fโ‚€โปยน (hโ‚’ โ‹†))
       ฮณโ‚€ = (hโ‚’ โ‹† ๏ผ fโ‚€ (hโ‚™ 0))             โ‰ƒโŸจ Iโ‚€   โŸฉ
            (fโ‚€ (hโ‚™ 0) ๏ผ hโ‚’ โ‹†)             โ‰ƒโŸจ IIโ‚€  โŸฉ
            (fโ‚€ (hโ‚™ 0) ๏ผ fโ‚€ (fโ‚€โปยน (hโ‚’ โ‹†))) โ‰ƒโŸจ IIIโ‚€ โŸฉ
            (hโ‚™ 0 ๏ผ fโ‚€โปยน (hโ‚’ โ‹†)) โ– 
        where
         Iโ‚€   = ๏ผ-flip
         IIโ‚€  = ๏ผ-cong-r (fโ‚€ (hโ‚™ 0)) (hโ‚’ โ‹†)
                 ((inverses-are-sections fโ‚€ eโ‚€ (hโ‚’ โ‹†)) โปยน)
         IIIโ‚€ = embedding-criterion-converse fโ‚€
                 (equivs-are-embeddings fโ‚€ eโ‚€)
                 (hโ‚™ 0) (fโ‚€โปยน (hโ‚’ โ‹†))
       fโ‚™ : (n : โ„•) โ†’ A (neg (succ n)) โ†’ A (neg n)
       fโ‚™ n = โŒœ f (neg (succ n)) โŒ
       eโ‚™ : (n : โ„•) โ†’ is-equiv (fโ‚™ n)
       eโ‚™ n = โŒœโŒ-is-equiv (f (neg (succ n)))
       fโ‚™โปยน : (n : โ„•) โ†’ A (neg n) โ†’ A (neg (succ n))
       fโ‚™โปยน n = โŒœ (f (neg (succ n))) โŒโปยน
       ฮณโ‚™ : (n : โ„•)
          โ†’ (hโ‚™ n ๏ผ fโ‚™ n (hโ‚™ (succ n)))
          โ‰ƒ (hโ‚™ (succ n) ๏ผ fโ‚™โปยน n (hโ‚™ n))
       ฮณโ‚™ n = (hโ‚™ n ๏ผ fโ‚™ n (hโ‚™ (succ n)))                 โ‰ƒโŸจ Iโ‚™ โŸฉ
              (fโ‚™ n (hโ‚™ (succ n)) ๏ผ hโ‚™ n)                 โ‰ƒโŸจ IIโ‚™ โŸฉ
              (fโ‚™ n (hโ‚™ (succ n)) ๏ผ fโ‚™ n (fโ‚™โปยน n (hโ‚™ n))) โ‰ƒโŸจ IIIโ‚™ โŸฉ
              (hโ‚™ (succ n) ๏ผ fโ‚™โปยน n (hโ‚™ n))               โ– 
        where
         Iโ‚™   = ๏ผ-flip
         IIโ‚™  = ๏ผ-cong-r (fโ‚™ n (hโ‚™ (succ n))) (hโ‚™ n)
                 ((inverses-are-sections (fโ‚™ n) (eโ‚™ n) (hโ‚™ n)) โปยน)
         IIIโ‚™ = embedding-criterion-converse (fโ‚™ n)
                 (equivs-are-embeddings (fโ‚™ n) (eโ‚™ n))
                 (hโ‚™ (succ n)) (fโ‚™โปยน n (hโ‚™ n))
   X    = ฮฃ-cong (ฮป hโ‚’ โ†’ singleton-โ‰ƒ-๐Ÿ™ {๐“ค} {๐“คโ‚€} (ฮณ hโ‚’))
    where
     ฮณ : (hโ‚’ : ฮ  (A โˆ˜ โŒœ๐ŸŽโŒ))
       โ†’ is-singleton ((ฮฃ hโ‚™ ๊ž‰ ฮ  (A โˆ˜ neg) , Qโ‚™  (hโ‚’ โ‹†) hโ‚™))
     ฮณ hโ‚’ = (โ„•-is-nno-dep fe (A โˆ˜ neg) aโ‚€ s)
      where
       aโ‚€ : A (neg 0)
       aโ‚€ = โŒœ (f (neg 0)) โŒโปยน (hโ‚’ โ‹†)
       s : (n : โ„•) โ†’ A (neg n) โ†’ A (neg (succ n))
       s n = โŒœ (f (neg (succ n))) โŒโปยน
   XI   = ๐Ÿ™-rneutral
   XII  = โ‰ƒ-sym (๐Ÿ™โ†’ fe)

\end{code}