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

\begin{code}

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

open import SyntheticHomotopyTheory.Circle.Integers

open import MLTT.Spartan
open import UF.DiscreteAndSeparated
open import UF.Equiv
open import UF.Sets
open import UF.Subsingletons
open import UF.Subsingletons-Properties

module SyntheticHomotopyTheory.Circle.Integers-Properties where

β„€-is-set : is-set β„€
β„€-is-set = +-is-set πŸ™ (β„• + β„•) (props-are-sets πŸ™-is-prop)
            (+-is-set β„• β„• β„•-is-set β„•-is-set)

succ-β„€ : β„€ β†’ β„€
succ-β„€ 𝟎              = pos 0
succ-β„€ (pos n)        = pos (succ n)
succ-β„€ (neg 0)        = 𝟎
succ-β„€ (neg (succ n)) = neg n

pred-β„€ : β„€ β†’ β„€
pred-β„€ 𝟎              = neg 0
pred-β„€ (pos 0)        = 𝟎
pred-β„€ (pos (succ n)) = pos n
pred-β„€ (neg n)        = neg (succ n)

succ-β„€-is-retraction : succ-β„€ ∘ pred-β„€ ∼ id
succ-β„€-is-retraction 𝟎              = refl
succ-β„€-is-retraction (pos zero)     = refl
succ-β„€-is-retraction (pos (succ n)) = refl
succ-β„€-is-retraction (neg n)        = refl

succ-β„€-is-section : pred-β„€ ∘ succ-β„€ ∼ id
succ-β„€-is-section 𝟎              = refl
succ-β„€-is-section (pos n)        = refl
succ-β„€-is-section (neg zero)     = refl
succ-β„€-is-section (neg (succ n)) = refl

succ-β„€-is-equiv : is-equiv succ-β„€
succ-β„€-is-equiv = qinvs-are-equivs succ-β„€
                   (pred-β„€ , succ-β„€-is-section , succ-β„€-is-retraction)

succ-β„€-≃ : β„€ ≃ β„€
succ-β„€-≃ = (succ-β„€ , succ-β„€-is-equiv)

pred-β„€-is-equiv : is-equiv pred-β„€
pred-β„€-is-equiv = ⌜⌝-is-equiv (≃-sym succ-β„€-≃)

\end{code}

We will consider iterations of succ-β„€ and pred-β„€ in defining addition on β„€ and
need some lemmas for working with those iterations.

\begin{code}
commute-with-iterated-function : {X : 𝓀 Μ‡ } (f g : X β†’ X)
                               β†’ f ∘ g ∼ g ∘ f
                               β†’ (n : β„•) β†’ f ∘ (g ^ n) ∼ (g ^ n) ∘ f
commute-with-iterated-function f g h zero     x = refl
commute-with-iterated-function f g h (succ n) x =
 (f ∘ g ∘ (g ^ n)) x =⟨ h ((g ^ n) x) ⟩
 (g ∘ f ∘ (g ^ n)) x =⟨ ap g (IH x)   ⟩
 (g ∘ (g ^ n) ∘ f) x ∎
  where
   IH : f ∘ (g ^ n) ∼ (g ^ n) ∘ f
   IH = commute-with-iterated-function f g h n

commute-with-iterated-functions : {X : 𝓀 Μ‡ } (f g : X β†’ X)
                                β†’ f ∘ g ∼ g ∘ f
                                β†’ (n m : β„•)
                                β†’ (f ^ n) ∘ (g ^ m) ∼ (g ^ m) ∘ (f ^ n)
commute-with-iterated-functions f g h n m =
 commute-with-iterated-function (f ^ n) g Ξ³ m
  where
   γ : (f ^ n) ∘ g ∼ g ∘ (f ^ n)
   Ξ³ x = (commute-with-iterated-function g f (Ξ» y β†’ h y ⁻¹) n x) ⁻¹

iterated-function-is-section : {X : 𝓀 Μ‡ } (s : X β†’ X) (r : X β†’ X)
                             β†’ r ∘ s ∼ id
                             β†’ (n : β„•) β†’ (r ^ n) ∘ (s ^ n) ∼ id
iterated-function-is-section s r ρ zero     x = refl
iterated-function-is-section s r ρ (succ n) x =
 (r ∘ (r ^ n) ∘ s ∘ (s ^ n)) x =⟨ I   ⟩
 (r ∘ (r ^ n) ∘ (s ^ n) ∘ s) x =⟨ II  ⟩
 (r ∘ s) x                     =⟨ ρ x ⟩
 x                             ∎
  where
   I  = ap (r ^ (succ n)) (commute-with-iterated-function s s (Ξ» x β†’ refl) n x)
   II = ap r (iterated-function-is-section s r ρ n (s x))

iterated-function-is-equiv : {X : 𝓀 Μ‡ } (f : X β†’ X)
                           β†’ is-equiv f
                           β†’ (n : β„•) β†’ is-equiv (f ^ n)
iterated-function-is-equiv f ((s , Ξ΅) , (r , Ξ·)) n =
 (((s ^ n) , (iterated-function-is-section s f Ξ΅ n)) ,
  ((r ^ n) , (iterated-function-is-section f r Ξ· n)))

commute-with-succ-β„€^n : (f : β„€ β†’ β„€)
                      β†’ (f ∘ succ-β„€ ∼ succ-β„€ ∘ f)
                      β†’ (n : β„•) β†’ f ∘ (succ-β„€ ^ n) ∼ (succ-β„€ ^ n) ∘ f
commute-with-succ-β„€^n f c = commute-with-iterated-function f succ-β„€ c

commute-with-pred-β„€ : (f : β„€ β†’ β„€)
                    β†’ (f ∘ succ-β„€ ∼ succ-β„€ ∘ f)
                    β†’ f ∘ pred-β„€ ∼ pred-β„€ ∘ f
commute-with-pred-β„€ f c z = equivs-are-lc succ-β„€ succ-β„€-is-equiv Ξ³
 where
  Ξ³ : succ-β„€ (f (pred-β„€ z)) = succ-β„€ (pred-β„€ (f z))
  Ξ³ = succ-β„€ (f (pred-β„€ z)) =⟨ (c (pred-β„€ z)) ⁻¹               ⟩
      f (succ-β„€ (pred-β„€ z)) =⟨ ap f (succ-β„€-is-retraction z)   ⟩
      f z                   =⟨ (succ-β„€-is-retraction (f z)) ⁻¹ ⟩
      succ-β„€ (pred-β„€ (f z)) ∎

succ-β„€-commutes-with-pred-β„€ : succ-β„€ ∘ pred-β„€ ∼ pred-β„€ ∘ succ-β„€
succ-β„€-commutes-with-pred-β„€ = commute-with-pred-β„€ succ-β„€ (Ξ» x β†’ refl)

pred-β„€-commutes-with-succ-β„€ : pred-β„€ ∘ succ-β„€ ∼ succ-β„€ ∘ pred-β„€
pred-β„€-commutes-with-succ-β„€ x = (succ-β„€-commutes-with-pred-β„€ x) ⁻¹

commute-with-pred-β„€^n : (f : β„€ β†’ β„€)
                      β†’ (f ∘ succ-β„€ ∼ succ-β„€ ∘ f)
                      β†’ (n : β„•) β†’ f ∘ (pred-β„€ ^ n) ∼ (pred-β„€ ^ n) ∘ f
commute-with-pred-β„€^n f c =
 commute-with-iterated-function f pred-β„€ (commute-with-pred-β„€ f c)

succ-β„€^n-is-retraction : (n : β„•) β†’ (succ-β„€ ^ n) ∘ (pred-β„€ ^ n) ∼ id
succ-β„€^n-is-retraction =
 iterated-function-is-section pred-β„€ succ-β„€ succ-β„€-is-retraction

succ-β„€^n-is-section : (n : β„•) β†’ (pred-β„€ ^ n) ∘ (succ-β„€ ^ n) ∼ id
succ-β„€^n-is-section =
 iterated-function-is-section succ-β„€ pred-β„€ succ-β„€-is-section

pos-is-succ-β„€-iterated : (n : β„•) β†’ pos n = (succ-β„€ ^ (succ n)) 𝟎
pos-is-succ-β„€-iterated zero     = refl
pos-is-succ-β„€-iterated (succ n) = ap succ-β„€ (pos-is-succ-β„€-iterated n)

neg-is-pred-β„€-iterated : (n : β„•) β†’ neg n = (pred-β„€ ^ (succ n)) 𝟎
neg-is-pred-β„€-iterated zero     = refl
neg-is-pred-β„€-iterated (succ n) = ap pred-β„€ (neg-is-pred-β„€-iterated n)

\end{code}

We are now ready to define addition on β„€ and prove its basic properties, such as
commutativity.

\begin{code}

_+β„€_ : β„€ β†’ β„€ β†’ β„€
_+β„€_ 𝟎       = id
_+β„€_ (pos n) = (succ-β„€ ^ (succ n))
_+β„€_ (neg n) = (pred-β„€ ^ (succ n))

+β„€-is-commutative : (x y : β„€) β†’ x +β„€ y = y +β„€ x
+β„€-is-commutative 𝟎 𝟎 = refl
+β„€-is-commutative 𝟎 (pos m) = pos-is-succ-β„€-iterated m
+β„€-is-commutative 𝟎 (neg m) = neg-is-pred-β„€-iterated m
+β„€-is-commutative (pos n) 𝟎 = (pos-is-succ-β„€-iterated n) ⁻¹
+β„€-is-commutative (neg n) 𝟎 = (neg-is-pred-β„€-iterated n) ⁻¹
+β„€-is-commutative (pos n) (pos m) =
 (succ-β„€ ^ succ n) (pos m)               =⟨ I    ⟩
 (succ-β„€ ^ succ n) ((succ-β„€ ^ succ m) 𝟎) =⟨ II   ⟩
 (succ-β„€ ^ succ m) ((succ-β„€ ^ succ n) 𝟎) =⟨ III  ⟩
 (succ-β„€ ^ succ m) (pos n)               =⟨refl⟩
 pos m +β„€ pos n                          ∎
  where
   I   = ap (succ-β„€ ^ (succ n)) (pos-is-succ-β„€-iterated m)
   II  = commute-with-iterated-functions succ-β„€ succ-β„€
          (Ξ» x β†’ refl) (succ n) (succ m) 𝟎
   III = ap (succ-β„€ ^ (succ m)) ((pos-is-succ-β„€-iterated n) ⁻¹)
+β„€-is-commutative (pos n) (neg m) =
 (succ-β„€ ^ succ n) (neg m)               =⟨ I   ⟩
 (succ-β„€ ^ succ n) ((pred-β„€ ^ succ m) 𝟎) =⟨ II  ⟩
 (pred-β„€ ^ succ m) ((succ-β„€ ^ succ n) 𝟎) =⟨ III ⟩
 (pred-β„€ ^ succ m) (pos n)               =⟨refl⟩
 neg m +β„€ pos n                          ∎
  where
   I   = ap (succ-β„€ ^ succ n) (neg-is-pred-β„€-iterated m)
   II  = commute-with-iterated-functions succ-β„€ pred-β„€
          succ-β„€-commutes-with-pred-β„€ (succ n) (succ m) 𝟎
   III = ap (pred-β„€ ^ succ m) ((pos-is-succ-β„€-iterated n) ⁻¹)
+β„€-is-commutative (neg n) (pos m) =
 (pred-β„€ ^ succ n) (pos m)               =⟨ I    ⟩
 (pred-β„€ ^ succ n) ((succ-β„€ ^ succ m) 𝟎) =⟨ II   ⟩
 (succ-β„€ ^ succ m) ((pred-β„€ ^ succ n) 𝟎) =⟨ III  ⟩
 (succ-β„€ ^ succ m) (neg n)               =⟨refl⟩
 pos m +β„€ neg n                          ∎
  where
   I   = ap (pred-β„€ ^ succ n) (pos-is-succ-β„€-iterated m)
   II  = commute-with-iterated-functions pred-β„€ succ-β„€
          pred-β„€-commutes-with-succ-β„€ (succ n) (succ m) 𝟎
   III = ap (succ-β„€ ^ succ m) ((neg-is-pred-β„€-iterated n) ⁻¹)
+β„€-is-commutative (neg n) (neg m) =
 (pred-β„€ ^ succ n) (neg m)               =⟨ I    ⟩
 (pred-β„€ ^ succ n) ((pred-β„€ ^ succ m) 𝟎) =⟨ II   ⟩
 (pred-β„€ ^ succ m) ((pred-β„€ ^ succ n) 𝟎) =⟨ III  ⟩
 (pred-β„€ ^ succ m) (neg n)               =⟨refl⟩
 neg m +β„€ neg n                          ∎
  where
   I   = ap (pred-β„€ ^ succ n) (neg-is-pred-β„€-iterated m)
   II  = commute-with-iterated-functions pred-β„€ pred-β„€
          (Ξ» x β†’ refl) (succ n) (succ m) 𝟎
   III = ap (pred-β„€ ^ succ m) ((neg-is-pred-β„€-iterated n) ⁻¹)

\end{code}

Next is negation of integers.

\begin{code}

─_ : β„€ β†’ β„€
─ 𝟎       = 𝟎
─ (pos n) = neg n
─ (neg n) = pos n

─-is-linv : (x : β„€) β†’ x +β„€ (─ x) = 𝟎
─-is-linv 𝟎 = refl
─-is-linv (pos n) =
 (succ-β„€ ^ succ n) (neg n)               =⟨ I  ⟩
 (succ-β„€ ^ succ n) ((pred-β„€ ^ succ n) 𝟎) =⟨ II ⟩
 𝟎                                       ∎
  where
   I  = ap (succ-β„€ ^ succ n) (neg-is-pred-β„€-iterated n)
   II = succ-β„€^n-is-retraction (succ n) 𝟎
─-is-linv (neg n) =
 (pred-β„€ ^ succ n) (pos n)               =⟨ I  ⟩
 (pred-β„€ ^ succ n) ((succ-β„€ ^ succ n) 𝟎) =⟨ II ⟩
 𝟎                                       ∎
  where
   I  = ap (pred-β„€ ^ succ n) (pos-is-succ-β„€-iterated n)
   II = succ-β„€^n-is-section (succ n) 𝟎

─-is-involutive : (x : β„€) β†’ ─ ─ x = x
─-is-involutive 𝟎       = refl
─-is-involutive (pos n) = refl
─-is-involutive (neg n) = refl

─-is-rinv : (x : β„€) β†’ (─ x) +β„€ x = 𝟎
─-is-rinv x = (─ x) +β„€ x =⟨ +β„€-is-commutative (─ x) x ⟩
              x +β„€ (─ x) =⟨ ─-is-linv x               ⟩
              𝟎          ∎

\end{code}

Finally, we prove some lemmas on adding/shifting by a fixed integer.

\begin{code}

+β„€-is-equiv-left : (x : β„€) β†’ is-equiv (Ξ» y β†’ x +β„€ y)
+β„€-is-equiv-left 𝟎       = id-is-equiv β„€
+β„€-is-equiv-left (pos n) = iterated-function-is-equiv succ-β„€ succ-β„€-is-equiv (succ n)
+β„€-is-equiv-left (neg n) = iterated-function-is-equiv pred-β„€ pred-β„€-is-equiv (succ n)

+β„€-is-equiv-right : (y : β„€) β†’ is-equiv (Ξ» x β†’ x +β„€ y)
+β„€-is-equiv-right y = equiv-closed-under-∼ (Ξ» x β†’ y +β„€ x) (Ξ» x β†’ x +β„€ y)
                  (+β„€-is-equiv-left y) (Ξ» x β†’ +β„€-is-commutative x y)

shift-if-commute-with-succ-β„€ : (f : β„€ β†’ β„€)
                             β†’ f ∘ succ-β„€ ∼ succ-β„€ ∘ f
                             β†’ f ∼ (Ξ» x β†’ x +β„€ f 𝟎)
shift-if-commute-with-succ-β„€ f h 𝟎 = refl
shift-if-commute-with-succ-β„€ f h (pos n) =
 f (pos n)                 =⟨ ap f (pos-is-succ-β„€-iterated n) ⟩
 f ((succ-β„€ ^ succ n) 𝟎)   =⟨ commute-with-iterated-function
                               f succ-β„€ h (succ n) 𝟎          ⟩
 (succ-β„€ ^ (succ n)) (f 𝟎) ∎
shift-if-commute-with-succ-β„€ f h (neg n) =
 f (neg n)                 =⟨ ap f (neg-is-pred-β„€-iterated n)                ⟩
 f ((pred-β„€ ^ succ n) 𝟎)   =⟨ commute-with-iterated-function
                               f pred-β„€ (commute-with-pred-β„€ f h) (succ n) 𝟎 ⟩
 (pred-β„€ ^ (succ n)) (f 𝟎) ∎

left-shift-commutes-with-succ-β„€ : (x : β„€)
                                β†’ (Ξ» y β†’ x +β„€ y) ∘ succ-β„€
                                ∼ succ-β„€ ∘ (Ξ» y β†’ x +β„€ y)
left-shift-commutes-with-succ-β„€ 𝟎 y = refl
left-shift-commutes-with-succ-β„€ (pos n) y =
 (commute-with-succ-β„€^n succ-β„€ (Ξ» _ β†’ refl) (succ n) y) ⁻¹
left-shift-commutes-with-succ-β„€ (neg n) y =
 (commute-with-pred-β„€^n succ-β„€ (Ξ» _ β†’ refl) (succ n) y) ⁻¹

right-shift-commutes-with-succ-β„€ : (y : β„€)
                                 β†’ (Ξ» x β†’ x +β„€ y) ∘ succ-β„€
                                 ∼ succ-β„€ ∘ (Ξ» x β†’ x +β„€ y)
right-shift-commutes-with-succ-β„€ y x =
 (succ-β„€ x) +β„€ y =⟨ +β„€-is-commutative (succ-β„€ x) y      ⟩
 y +β„€ (succ-β„€ x) =⟨ left-shift-commutes-with-succ-β„€ y x ⟩
 succ-β„€ (y +β„€ x) =⟨ ap succ-β„€ (+β„€-is-commutative y x)   ⟩
 succ-β„€ (x +β„€ y) ∎

is-equiv-if-commute-with-succ-β„€ : (f : β„€ β†’ β„€)
                                β†’ f ∘ succ-β„€ ∼ succ-β„€ ∘ f
                                β†’ is-equiv f
is-equiv-if-commute-with-succ-β„€ f h =
 equiv-closed-under-∼ (Ξ» x β†’ x +β„€ f 𝟎) f
  (+β„€-is-equiv-right (f 𝟎)) (shift-if-commute-with-succ-β„€ f h)

\end{code}