Todd Waugh Ambridge, January 2024

# Uniform continuity of signed-digit operations

\begin{code}
{-# OPTIONS --without-K --safe #-}

open import MLTT.Spartan

open import UF.FunExt
open import Notation.Order
open import Naturals.Order

open import TWA.Thesis.Chapter2.Sequences
open import TWA.Thesis.Chapter5.SignedDigit

module TWA.Thesis.Chapter6.SignedDigitContinuity (fe : FunExt) where

open import TWA.Thesis.Chapter3.ClosenessSpaces fe
open import TWA.Thesis.Chapter3.ClosenessSpaces-Examples fe
open import TWA.Thesis.Chapter6.SequenceContinuity fe
\end{code}

## Negation

\begin{code}
neg-ucontinuous' : seq-f-ucontinuous¹ neg
neg-ucontinuous' = map-ucontinuous' flip

neg-ucontinuous
 : f-ucontinuous 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace neg
neg-ucontinuous
 = seq-f-ucontinuous¹-to-closeness
    𝟛-is-discrete 𝟛-is-discrete
    neg neg-ucontinuous'
\end{code}

## Binary midpoint

\begin{code}
div2-ucontinuous' : seq-f-ucontinuous¹ div2
div2-ucontinuous' zero = 0 , λ α β _ k ()
div2-ucontinuous' (succ ε) = succ (succ ε) , γ ε
 where
  γ : (ε : )  (α β :   𝟝)  (α ∼ⁿ β) (succ (succ ε))
      (div2 α ∼ⁿ div2 β) (succ ε)
  γ ε α β α∼ⁿβ 0  = ap  -  pr₁ (div2-aux - (α 1))) (α∼ⁿβ 0 )
                    ap  -  pr₁ (div2-aux (β 0) -)) (α∼ⁿβ 1 )
  γ (succ ε) α β α∼ⁿβ (succ k) = γ ε α' β' α∼ⁿβ' k
   where
    α' = pr₂ (div2-aux (α 0) (α 1))  (tail (tail α))
    β' = pr₂ (div2-aux (β 0) (β 1))  (tail (tail β))
    α∼ⁿβ' : (α' ∼ⁿ β') (succ (succ ε))
    α∼ⁿβ' 0  = ap  -  pr₂ (div2-aux - (α 1))) (α∼ⁿβ 0 )
               ap  -  pr₂ (div2-aux (β 0) -)) (α∼ⁿβ 1 )
    α∼ⁿβ' (succ j) = α∼ⁿβ (succ (succ j))

mid-ucontinuous' : seq-f-ucontinuous² mid
mid-ucontinuous' = seq-f-ucontinuous¹²-comp div2 add2
                    div2-ucontinuous' (zipWith-ucontinuous' _+𝟛_)

mid-ucontinuous
 : f-ucontinuous
    (×-ClosenessSpace 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace)
    𝟛ᴺ-ClosenessSpace (uncurry mid)
mid-ucontinuous
 = seq-f-ucontinuous²-to-closeness
    𝟛-is-discrete 𝟛-is-discrete 𝟛-is-discrete
    mid mid-ucontinuous'

mid-l-ucontinuous
 : (y : 𝟛ᴺ)
  f-ucontinuous 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace  x  mid x y)
mid-l-ucontinuous y
 = seq-f-ucontinuous¹-to-closeness
    𝟛-is-discrete 𝟛-is-discrete
     x  mid x y)
    (seq-f-ucontinuous²-left mid mid-ucontinuous' y)

mid-r-ucontinuous
 : (x : 𝟛ᴺ)
  f-ucontinuous 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace  y  mid x y)
mid-r-ucontinuous x
 = seq-f-ucontinuous¹-to-closeness
    𝟛-is-discrete 𝟛-is-discrete
     y  mid x y)
    (seq-f-ucontinuous²-right mid mid-ucontinuous' x)
\end{code}

## Infinitary midpoint

\begin{code}
bigMid'-ucontinuous' : seq-f-ucontinuousᴺ bigMid'
bigMid'-ucontinuous' ε =  ε , d≤δ ε , γ ε
 where
  d :   
  d 0 = 0
  d (succ ε) = succ (succ ε)
  δ :   
  δ 0 = 0
  δ (succ ε) = succ (succ (succ (δ ε)))
   :    × 
   ε = d ε , δ ε
  d≤δ : (n : )  d n  δ n
  d≤δ 0 = ≤-refl 0
  d≤δ 1 = 
  d≤δ (succ (succ n))
   = ≤-trans n (succ (δ n)) (succ (succ (succ (δ n))))
      (d≤δ (succ n))
      (≤-trans (δ n) (succ (δ n)) (succ (succ (δ n)))
       (≤-succ (δ n)) (≤-succ (succ (δ n))))
  pr₁δs< : (n : )  d n < d (succ n)
  pr₁δs< zero = 
  pr₁δs< (succ n) = ≤-refl n
  γ : (ε : )  (x₁ x₂ : (  𝟛ᴺ))
     ((n : )  n < d ε  (x₁ n ∼ⁿ x₂ n) (δ ε))
     (bigMid' x₁ ∼ⁿ bigMid' x₂) ε
  γ (succ ε) αs βs αs∼ⁿβs zero k<ε
   = ap  -  (- +𝟛 -) +𝟝 (αs 0 1 +𝟛 αs 1 0)) (αs∼ⁿβs 0  0 )
    ap  -  (βs 0 0 +𝟛 βs 0 0) +𝟝 (- +𝟛 αs 1 0)) (αs∼ⁿβs 0  1 )
    ap  -  (βs 0 0 +𝟛 βs 0 0) +𝟝 (βs 0 1 +𝟛 -)) (αs∼ⁿβs 1  0 )
  γ (succ (succ ε)) αs βs αs∼ⁿβs (succ k)
   = γ (succ ε) αs' βs' αs∼ⁿβs' k
   where
    αs' = mid (tail (tail (αs 0))) (tail (αs 1))  tail (tail αs)
    βs' = mid (tail (tail (βs 0))) (tail (βs 1))  tail (tail βs)
    αs∼ⁿβs' : (n : )  n < d (succ ε)
             (αs' n ∼ⁿ βs' n) (δ (succ ε))
    αs∼ⁿβs' zero n<d i i<d
     = pr₂ (mid-ucontinuous' (δ (succ ε)))
        (tail (tail (αs 0))) (tail (tail (βs 0)))
        (tail       (αs 1) ) (tail       (βs 1) )
         i  αs∼ⁿβs zero  (succ (succ i)))
         i i≤δϵ  αs∼ⁿβs 1  (succ i)
        (≤-trans i _ _ i≤δϵ (≤-succ (δ ε)))) i i<d
    αs∼ⁿβs' (succ n) n<d i i≤δϵ
     = αs∼ⁿβs (succ (succ n)) n<d i
        (≤-trans i (succ (succ (δ ε)))
                   (succ (succ (succ (succ (succ (δ ε))))))
          i≤δϵ (≤-+ (δ ε) 3))

div4-ucontinuous' : seq-f-ucontinuous¹ div4
div4-ucontinuous' zero = 0 , λ α β _ k ()
div4-ucontinuous' (succ ε) = succ (succ ε) , γ ε
 where
  γ : (ε : )  (α β :   𝟡)  (α ∼ⁿ β) (succ (succ ε))
      (div4 α ∼ⁿ div4 β) (succ ε)
  γ ε α β α∼ⁿβ 0  = ap  -  pr₁ (div4-aux - (α 1))) (α∼ⁿβ 0 )
                    ap  -  pr₁ (div4-aux (β 0) -)) (α∼ⁿβ 1 )
  γ (succ ε) α β α∼ⁿβ (succ k) = γ ε α' β' α∼ⁿβ' k
   where
    α' = pr₂ (div4-aux (α 0) (α 1))  (tail (tail α))
    β' = pr₂ (div4-aux (β 0) (β 1))  (tail (tail β))
    α∼ⁿβ' : (α' ∼ⁿ β') (succ (succ ε))
    α∼ⁿβ' 0  = ap  -  pr₂ (div4-aux - (α 1))) (α∼ⁿβ 0 )
               ap  -  pr₂ (div4-aux (β 0) -)) (α∼ⁿβ 1 )
    α∼ⁿβ' (succ j) = α∼ⁿβ (succ (succ j))

bigMid-ucontinuous' : seq-f-ucontinuousᴺ bigMid
bigMid-ucontinuous' ε =  , d≤δ , ϕ
 where
  γ = bigMid'-ucontinuous' (pr₁ (div4-ucontinuous' ε))
   :  × 
   = pr₁ γ
  d≤δ : pr₁   pr₂ 
  d≤δ = pr₁ (pr₂ γ)
  ϕ : (x₁ x₂ :   𝟛ᴺ)
     ((n : )  n < pr₁   ((x₁ n) ∼ⁿ (x₂ n)) (pr₂ ))
     (bigMid x₁ ∼ⁿ bigMid x₂) ε
  ϕ αs βs αs∼ⁿβs
   = pr₂ (div4-ucontinuous' ε)
      (bigMid' αs) (bigMid' βs)
      (pr₂ (pr₂ γ) αs βs αs∼ⁿβs)
\end{code}

## Multiplication

\begin{code}
mul-ucontinuous' : seq-f-ucontinuous² mul
mul-ucontinuous' ε = δ ε , γ ε where
  δ :    × 
  δ ε = pr₁ (bigMid-ucontinuous' ε)
  γ : (ε : )  (α₁ α₂ : 𝟛ᴺ) (β₁ β₂ : 𝟛ᴺ)
     (α₁ ∼ⁿ α₂) (pr₁ (δ ε))  (β₁ ∼ⁿ β₂) (pr₂ (δ ε))
     (mul α₁ β₁ ∼ⁿ mul α₂ β₂) ε
  γ ε α₁ α₂ β₁ β₂ α∼ β∼
   = pr₂ (pr₂ (bigMid-ucontinuous' ε))
      (zipWith digitMul α₁  _  β₁))
      (zipWith digitMul α₂  _  β₂))
       n n<d k k<δ  ap (_*𝟛 β₁ k) (α∼ n n<d)
                      ap (α₂ n *𝟛_) (β∼ k k<δ))

mul-ucontinuous
 : f-ucontinuous
     (×-ClosenessSpace 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace)
     𝟛ᴺ-ClosenessSpace (uncurry mul)
mul-ucontinuous
 = seq-f-ucontinuous²-to-closeness
    𝟛-is-discrete 𝟛-is-discrete 𝟛-is-discrete
    mul mul-ucontinuous'

mul-l-ucontinuous
 : (y : 𝟛ᴺ)
  f-ucontinuous 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace  x  mul x y)
mul-l-ucontinuous y
 = seq-f-ucontinuous¹-to-closeness
    𝟛-is-discrete 𝟛-is-discrete
     x  mul x y)
    (seq-f-ucontinuous²-left mul mul-ucontinuous' y)

mul-b-ucontinuous
 : f-ucontinuous 𝟛ᴺ-ClosenessSpace 𝟛ᴺ-ClosenessSpace  x  mul x x)
mul-b-ucontinuous
 = seq-f-ucontinuous¹-to-closeness
    𝟛-is-discrete 𝟛-is-discrete
     x  mul x x)
    (seq-f-ucontinuous²-both mul mul-ucontinuous')
\end{code}