BoehmVerification

Todd Waugh Ambridge, January 2024

# Ternary Boehm encodings of real numbers

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

open import Integers.Addition renaming (_+_ to _ℤ+_;  _-_ to _ℤ-_)
open import Integers.Negation renaming (-_ to ℤ-_ )
open import Integers.Order
open import Integers.Type
open import MLTT.Spartan
open import Notation.Order
open import UF.FunExt
open import UF.Powerset hiding (𝕋)
open import UF.PropTrunc
open import UF.Subsingletons
open import UF.Subsingletons-FunExt
open import UF.SubtypeClassifier

open import TWA.Thesis.Chapter5.BoehmStructure
 hiding (downLeft; downMid; downRight; upRight; upLeft; _below_)
open import TWA.Thesis.AndrewSneap.DyadicRationals
 renaming (normalise to ι)
open import TWA.Thesis.Chapter5.Integers
open import TWA.Thesis.Chapter5.SignedDigit

module TWA.Thesis.Chapter5.BoehmVerification
  (pt : propositional-truncations-exist)
  (fe : FunExt)
  (pe : PropExt)
  (dy : Dyadics)
  where

open PropositionalTruncation pt
open Dyadics dy
  renaming ( _ℤ[1/2]+_ to _+𝔻_ ; ℤ[1/2]-_ to -_ ; _ℤ[1/2]-_ to _-_
           ; _ℤ[1/2]*_ to _*_ )

open import TWA.Thesis.AndrewSneap.DyadicReals pe pt fe dy
open import TWA.Thesis.Chapter3.ClosenessSpaces fe hiding (⟨_⟩ ; ι)
open import TWA.Thesis.Chapter3.ClosenessSpaces-Examples fe

## Structural operations and properties

downLeft downMid downRight : ℤ → ℤ
downLeft  k = (k ℤ+ k)
downMid   k = (k ℤ+ k) +pos 1
downRight k = (k ℤ+ k) +pos 2

upRight upLeft : ℤ → ℤ
upRight k = sign k (num k /2)
upLeft  k = upRight (predℤ k)

_below_ : ℤ → ℤ → 𝓤₀ ̇
a below b = downLeft b ≤ a ≤ downRight b

ternary : (ℤ → ℤ) → 𝓤₀ ̇
ternary x = (δ : ℤ) → x (succℤ δ) below x δ

𝕋 : 𝓤₀ ̇
𝕋 = Σ x ꞉ (ℤ → ℤ) , ternary x

ℤ[1/2]ᴵ : 𝓤₀ ̇
ℤ[1/2]ᴵ = Σ (l , r) ꞉ (ℤ[1/2] × ℤ[1/2]) , l ≤ r

ld rd : ℤ[1/2]ᴵ → ℤ[1/2]
ld ((l , r) , _) = l
rd ((l , r) , _) = r

ld≤rd : (p : ℤ[1/2]ᴵ) → ld p ≤ rd p
ld≤rd ((l , r) , l≤r) = l≤r

_covers_ : ℤ[1/2]ᴵ → ℤ[1/2]ᴵ → 𝓤₀ ̇
a covers b = (ld a ≤ ld b) × (rd b ≤ rd a)

covers-refl : (ab : ℤ[1/2]ᴵ) → ab covers ab
covers-refl ab = ≤-refl (ld ab) , ≤-refl (rd ab)

covers-trans : (a b c : ℤ[1/2]ᴵ) → a covers b → b covers c → a covers c
covers-trans a b c (l≤₁ , r≤₁) (l≤₂ , r≤₂)
 = trans' (ld a) (ld b) (ld c) l≤₁ l≤₂
 , trans' (rd c ) (rd b) (rd a) r≤₂ r≤₁

nested positioned : (ℤ → ℤ[1/2]ᴵ) → 𝓤₀ ̇
nested      ζ = (n : ℤ) → (ζ n) covers (ζ (succℤ n))
positioned     ζ = (ϵ : ℤ[1/2]) → is-positive ϵ
              → Σ n ꞉ ℤ , (rd (ζ n) - ld (ζ n)) ≤ ϵ

fully-nested' : (ℤ → ℤ[1/2]ᴵ) → ℕ → 𝓤₀ ̇
fully-nested' ζ k = (n : ℤ) → (ζ n) covers (ζ (n +pos k))

fully-nested : (ℤ → ℤ[1/2]ᴵ) → 𝓤₀ ̇
fully-nested ζ = (n m : ℤ) → n ≤ m → (ζ n) covers (ζ m)

nested-implies-fully-nested'
 : (ζ : ℤ → ℤ[1/2]ᴵ) → nested ζ → Π (fully-nested' ζ)
nested-implies-fully-nested' ζ ρ 0 n = (0 , refl) , (0 , refl)
nested-implies-fully-nested' ζ ρ (succ k) n
 = covers-trans (ζ n) (ζ (succℤ n)) (ζ (succℤ (n +pos k))) (ρ n)
     (nested-implies-fully-nested' (ζ ∘ succℤ) (ρ ∘ succℤ) k n)

nested-implies-fully-nested
 : (ζ : ℤ → ℤ[1/2]ᴵ) → nested ζ → fully-nested ζ
nested-implies-fully-nested ζ ρ n m (k , refl)
 = nested-implies-fully-nested' ζ ρ k n

## Verification of the structure of ternary Boehm encodings

-- By Andrew Sneap
⦅_⦆ : (χ : ℤ → ℤ[1/2]ᴵ) → nested χ → positioned χ → ℝ-d
⦅_⦆ χ τ π = (L , R)
          , inhabited-l , inhabited-r
          , rounded-l   , rounded-r
          , is-disjoint , is-located
 where
  L R : ℤ[1/2] → Ω 𝓤₀
  L p = (∃ n ꞉ ℤ , p < ld (χ n)) , ∃-is-prop
  R q = (∃ n ꞉ ℤ , rd (χ n) < q) , ∃-is-prop


  inhabited-l : inhabited-left L
  inhabited-l = ∣ ld (χ (pos 0)) - 1ℤ[1/2]
              , ∣ (pos 0)
                  , (ℤ[1/2]<-neg (ld (χ (pos 0))) 1ℤ[1/2] 0<1ℤ[1/2]) ∣ ∣

  inhabited-r : inhabited-right R
  inhabited-r = ∣ (rd (χ (pos 0)) +𝔻 1ℤ[1/2])
              , ∣ pos 0
                  , ℤ[1/2]<-+ (rd (χ (pos 0))) 1ℤ[1/2] 0<1ℤ[1/2] ∣ ∣

  rounded-l : rounded-left L
  rounded-l p = ltr , rtl
   where
    ltr : ∃ n ꞉ ℤ , (p <ℤ[1/2] ld (χ n))
        → ∃ p' ꞉ ℤ[1/2] , p < p' × (∃ n' ꞉ ℤ , (p' <ℤ[1/2] ld (χ n')))
    ltr = ∥∥-functor I
     where
      I : Σ n ꞉ ℤ , (p <ℤ[1/2] ld (χ n))
        → Σ p' ꞉ ℤ[1/2] , p < p' × (∃ n' ꞉ ℤ , (p' <ℤ[1/2] ld (χ n')))
      I (n , p<ζn) = let (p' , p<p' , p'<ζn) = dense p (ld (χ n)) p<ζn
                     in p' , (p<p' , ∣ n , p'<ζn ∣)
    rtl : ∃ p' ꞉ ℤ[1/2] , p < p' × (∃ n ꞉ ℤ , (p' <ℤ[1/2] ld (χ n)))
        → ∃ n ꞉ ℤ , (p <ℤ[1/2] ld (χ n))
    rtl = ∥∥-rec ∃-is-prop I
     where
      I : Σ p' ꞉ ℤ[1/2] , p < p' × (∃ n ꞉ ℤ , (p' <ℤ[1/2] ld (χ n)))
        → ∃ n ꞉ ℤ , (p <ℤ[1/2] ld (χ n))
      I (p' , p<p' , te) = ∥∥-functor II te
       where
        II : Σ n ꞉ ℤ , (p' <ℤ[1/2] ld (χ n))
           → Σ n ꞉ ℤ , (p <ℤ[1/2] ld (χ n))
        II (n  , p'<ζn) = n , (trans p p' (ld (χ n)) p<p' p'<ζn)

  rounded-r : rounded-right R
  rounded-r q = ltr , rtl
   where
    ltr : ∃ n ꞉ ℤ , rd (χ n) < q → ∃ q' ꞉ ℤ[1/2] , q' < q × q' ∈ R
    ltr = ∥∥-functor I
     where
      I : Σ n ꞉ ℤ , rd (χ n) < q → Σ q' ꞉ ℤ[1/2] , q' < q × q' ∈ R
      I (n , ζn<q) = let (q' , ζn<q' , q'<q) = dense (rd (χ n)) q ζn<q
                     in q' , (q'<q , ∣ n , ζn<q' ∣)
    rtl : ∃ q' ꞉ ℤ[1/2] , q' < q × (R q' holds) → R q holds
    rtl = ∥∥-rec ∃-is-prop I
     where
      I : Σ q' ꞉ ℤ[1/2] , q' < q × (R q' holds) → R q holds
      I (q' , q'<q , te) = ∥∥-functor II te
       where
        II : Σ n ꞉ ℤ , (rd (χ n) < q') → Σ n ꞉ ℤ , (rd (χ n) <ℤ[1/2] q)
        II (n , ζ<q') = n , (trans (rd (χ n)) q' q ζ<q' q'<q)

  is-disjoint : disjoint L R
  is-disjoint p q (tp<x , tx<q)
   = ∥∥-rec (<ℤ[1/2]-is-prop p q)
       (λ ((n , p<l) , (n' , r<q))
        → I n n' p<l r<q (ℤ-dichotomous n n'))
       (binary-choice tp<x tx<q)
   where
    I : (n n' : ℤ)
      → p <ℤ[1/2] ld (χ n)
      → rd (χ n') <ℤ[1/2] q
      → (n ≤ n') + (n' ≤ n)
      → p <ℤ[1/2] q
    I n n' p<l r<q (inl n≤n')
      = let p<l' = ℤ[1/2]<-≤ p (ld (χ n)) (ld (χ n')) p<l
                     (pr₁ (nested-implies-fully-nested
                             χ τ n n' n≤n'))
            l<q' = ℤ[1/2]≤-< (ld (χ n')) (rd (χ n')) q
                     (ld≤rd (χ n')) r<q
      in trans p (ld (χ n')) q p<l' l<q'
    I n n' p<l r<q (inr n'≤n)
      = let p<r' = ℤ[1/2]<-≤ p (ld (χ n)) (rd (χ n)) p<l
                     (ld≤rd (χ n))
            r<q' = ℤ[1/2]≤-< (rd (χ n)) (rd (χ n')) q
                     (pr₂ (nested-implies-fully-nested
                        χ τ n' n n'≤n)) r<q
      in trans p (rd (χ n)) q p<r' r<q'

  is-located : located L R
  is-located p q p<q
   = I (π (1/2ℤ[1/2] * (q - p))
         (ℤ[1/2]<-positive-mult 1/2ℤ[1/2] (q - p)
            0<1/2ℤ[1/2] (diff-positive p q p<q)))
   where
    0<ε : 0ℤ[1/2] < (1/2ℤ[1/2] * (q - p))
    0<ε = <-pos-mult' 1/2ℤ[1/2] (q - p) 0<1/2ℤ[1/2]
            (diff-positive p q p<q)
    I : (Σ n ꞉ ℤ , ((rd (χ n) - ld (χ n))
                     ≤ℤ[1/2] (1/2ℤ[1/2] * (q - p))))
      → (L p holds) ∨ (R q holds)
    I (n , l₁) = II (ℤ[1/2]-ordering-property (rd (χ n))
                       (ld (χ n)) q p l₂)
     where
      l₂ :(rd (χ n) - ld (χ n)) < (q - p)
      l₂ = ℤ[1/2]≤-< (rd (χ n) - ld (χ n)) (1/2ℤ[1/2] * (q - p))
             (q - p) l₁ (ℤ[1/2]-1/2-< (q - p) (diff-positive p q p<q))
      II : (rd (χ n) < q) + (p < ld (χ n)) → (L p holds) ∨ (R q holds)
      II (inl ζ<q) = ∣ inr ∣ n , ζ<q ∣ ∣
      II (inr p<ζ) = ∣ inl ∣ n , p<ζ ∣ ∣

ℤ³ : 𝓤₀ ̇
ℤ³ = Σ ((l , r) , p) ꞉ ((ℤ × ℤ) × ℤ) , l ≤ r

ℤ³-to-ℤ[1/2]ᴵ : ℤ³ → ℤ[1/2]ᴵ
ℤ³-to-ℤ[1/2]ᴵ (((l , r) , p) , i)
 = ((ι (l , p)) , ι (r , p)) , normalise-≤2 l r p i

⦅_⦆' : (χ : ℤ → ℤ³)
      → nested (ℤ³-to-ℤ[1/2]ᴵ ∘ χ) → positioned (ℤ³-to-ℤ[1/2]ᴵ ∘ χ)
      → ℝ-d
⦅ χ ⦆' = ⦅ ℤ³-to-ℤ[1/2]ᴵ ∘ χ ⦆

ℤ² : 𝓤₀ ̇
ℤ² = ℤ × ℤ

ℤ²-to-ℤ³ : ℤ² → ℤ³
ℤ²-to-ℤ³ (k , p)
 = (((k , k +pos 2) , p)
 , ℤ≤-trans k (succℤ k) (succℤ (succℤ k))
     (≤-incrℤ k) (≤-incrℤ (succℤ k)))

ℤ²-to-ℤ[1/2]ᴵ : ℤ² → ℤ[1/2]ᴵ
ℤ²-to-ℤ[1/2]ᴵ = ℤ³-to-ℤ[1/2]ᴵ ∘ ℤ²-to-ℤ³

⦅_⦆'' : (χ : ℤ → ℤ²)
      → nested  (ℤ²-to-ℤ[1/2]ᴵ ∘ χ)
      → positioned (ℤ²-to-ℤ[1/2]ᴵ ∘ χ)
      → ℝ-d
⦅_⦆'' = ⦅_⦆' ∘ (ℤ²-to-ℤ³ ∘_)

normalised : (ℤ → ℤ²) → 𝓤₀ ̇
normalised χ = (n : ℤ) → pr₂ (χ n) = n

ℤ²-width : ((k , p) : ℤ²)
         → (ι (k +pos 2 , p) - ι (k , p)) = ι (pos 2 , p)
ℤ²-width (k , p)
 = normalise-negation (k +pos 2) k p
 ∙ ap (λ - → ι (- , p))
     (ℤ-left-succ (succℤ k) (ℤ- k)
     ∙ ap succℤ (ℤ-left-succ k (ℤ- k))
     ∙ ap (succℤ ∘ succℤ) (ℤ-sum-of-inverse-is-zero k))

normalised-positioned : (χ : ℤ → ℤ²)
                   → normalised χ
                   → positioned (ℤ²-to-ℤ[1/2]ᴵ ∘ χ)
normalised-positioned χ η ϵ ϵ⁺
 = q , transport (_≤ ϵ) (ℤ²-width (χ q) ⁻¹)
         (transport (λ - → ι (pos 2 , -) ≤ ϵ) (η q ⁻¹) γ)
 where
  q : ℤ
  q = pr₁ (ℤ[1/2]-find-lower ϵ ϵ⁺)
  f : pr₁ (ℤ[1/2]-find-lower ϵ ϵ⁺) =
        pr₂ (χ (pr₁ (ℤ[1/2]-find-lower ϵ ϵ⁺)))
  f = η q ⁻¹
  γ : ι (pos 2 , q) ≤ ϵ
  γ = <-is-≤ℤ[1/2] (ι (pos 2 , q)) ϵ (pr₂ (ℤ[1/2]-find-lower ϵ ϵ⁺))

ℤ≤-succ' : (a : ℤ) (n : ℕ) → succℤ a ≤ succℤ (a +pos n)
ℤ≤-succ' a zero = zero , refl
ℤ≤-succ' a (succ n) = ℤ≤-trans _ _ _ (ℤ≤-succ' a n) (1 , refl)

ℤ≤-succ : (a b : ℤ) → a ≤ b → succℤ a ≤ succℤ b
ℤ≤-succ a b (n , refl) = ℤ≤-succ' a n

ℤ≤-pred'
 : (a : ℤ) (n : ℕ) → a ≤ (a +pos n)
ℤ≤-pred' a n = n , refl

ℤ≤-pred : (a b : ℤ) → succℤ a ≤ succℤ b → a ≤ b
ℤ≤-pred a b (n , e)
  = transport (a ≤_)
      (succℤ-lc (ℤ-left-succ-pos a n ⁻¹ ∙ e))
      (ℤ≤-pred' a n)

downLeft-downRight-2
 : (a : ℤ) → downLeft (a +pos 2) = downRight a +pos 2
downLeft-downRight-2 a
 = ℤ-left-succ (succℤ a) (succℤ (succℤ a))
 ∙ ap succℤ (ℤ-left-succ a (succℤ (succℤ a)))
 ∙ ap (succℤ ^ 2)
     (ℤ-right-succ a (succℤ a)
     ∙ ap succℤ (ℤ-right-succ a a))

ℤ³-width : ((((l , r) , p) , _) : ℤ³)
         → (ι (r , p) - ι (l , p)) = ι (r ℤ- l , p)
ℤ³-width (((l , r) , p) , _) = normalise-negation r l p

ternary-nested : (χ : ℤ → ℤ²)
               → normalised χ
               → ternary (pr₁ ∘ χ)
               ↔ nested (ℤ²-to-ℤ[1/2]ᴵ ∘ χ)
pr₁ (pr₁ (ternary-nested χ η) f n) = γ
 where
  γ' : ι (pr₁ (χ n) , n) ≤ ι (pr₁ (χ (succℤ n)) , succℤ n)
  γ' = transport (_≤ ι (pr₁ (χ (succℤ n)) , succℤ n))
         (normalise-succ' (pr₁ (χ n)) n ⁻¹)
         (normalise-≤2
           (pr₁ (χ n) ℤ+ pr₁ (χ n))
           (pr₁ (χ (succℤ n)))
           (succℤ n)
           (pr₁ (f n)))
  γ : ι (χ n) ≤ ι (χ (succℤ n))
  γ = transport (λ - → ι (pr₁ (χ n) , -)
                 ≤ ι (χ (succℤ n)))
        (η n ⁻¹)
        (transport (λ - → ι (pr₁ (χ n) , n)
                        ≤ ι (pr₁ (χ (succℤ n)) , -))
          (η (succℤ n) ⁻¹)
          γ')
pr₂ (pr₁ (ternary-nested χ η) f n)
 = transport (λ - → ι ((pr₁ (χ (succℤ n)) +pos 2) , -)
                  ≤ ι ((pr₁ (χ n) +pos 2) , pr₂ (χ n)))
     (η (succℤ n) ⁻¹)
     (transport (λ - → ι ((pr₁ (χ (succℤ n)) +pos 2) , succℤ n)
                     ≤ ι ((pr₁ (χ n) +pos 2) , -))
        (η n ⁻¹)
        (transport (ι ((pr₁ (χ (succℤ n)) +pos 2) , succℤ n) ≤_)
          (normalise-succ' (pr₁ (χ n) +pos 2) n ⁻¹)
          (normalise-≤2
            (pr₁ (χ (succℤ n)) +pos 2)
            ((pr₁ (χ n) +pos 2) ℤ+ (pr₁ (χ n) +pos 2))
            (succℤ n)
            (transport ((pr₁ (χ (succℤ n)) +pos 2) ≤_)
              (downLeft-downRight-2 (pr₁ (χ n)) ⁻¹)
              (ℤ≤-succ _ _ (ℤ≤-succ _ _ (pr₂ (f n))))))))
pr₁ (pr₂ (ternary-nested χ η) f n)
 = from-normalise-≤-same-denom _ _ (succℤ n) γ
 where
  γ' : ι (pr₁ (χ n) , n) ≤ ι (pr₁ (χ (succℤ n)) , succℤ n)
  γ' = transport (λ - → ι (pr₁ (χ n) , -)
                      ≤ ι (pr₁ (χ (succℤ n)) , succℤ n))
         (η n)
         (transport (λ - → ι (χ n) ≤ ι (pr₁ (χ (succℤ n)) , -))
           (η (succℤ n))
           (pr₁ (f n)))
  γ : ι (downLeft (pr₁ (χ n)) , succℤ n)
    ≤ ι (pr₁ (χ (succℤ n)) , succℤ n)
  γ = transport (_≤ ι (pr₁ (χ (succℤ n)) , succℤ n))
        (normalise-succ' (pr₁ (χ n)) n)
        γ'
pr₂ (pr₂ (ternary-nested χ η) f n)
 = ℤ≤-pred _ _ (ℤ≤-pred _ _
     (from-normalise-≤-same-denom _ _ (succℤ n) γ))
 where
  γ'' : ι (pr₁ (χ (succℤ n)) +pos 2 , succℤ n)
      ≤ ι (pr₁ (χ n) +pos 2 , n)
  γ'' = transport (λ - → ι (pr₁ (χ (succℤ n)) +pos 2 , -)
                       ≤ ι (pr₁ (χ n) +pos 2 , n))
          (η (succℤ n))
          (transport (λ - → ι (pr₁ (χ (succℤ n)) +pos 2
                             , pr₂ (χ (succℤ n)))
                          ≤ ι (pr₁ (χ n) +pos 2 , -))
            (η n)
            (pr₂ (f n)))
  γ' : ι (pr₁ (χ (succℤ n)) +pos 2 , succℤ n)
     ≤ ι (downLeft (pr₁ (χ n) +pos 2) , succℤ n)
  γ' = transport (ι (pr₁ (χ (succℤ n)) +pos 2 , succℤ n) ≤_)
        (normalise-succ' (pr₁ (χ n) +pos 2) n)
        γ''
  γ : ι (pr₁ (χ (succℤ n)) +pos 2 , succℤ n)
    ≤ ι (downRight (pr₁ (χ n)) +pos 2 , succℤ n)
  γ = transport (λ - → ι (pr₁ (χ (succℤ n)) +pos 2 , succℤ n)
                     ≤ ι (- , succℤ n))
        (downLeft-downRight-2 (pr₁ (χ n)))
        γ'

to-interval-seq : 𝕋 → (ℤ → ℤ²)
to-interval-seq χ n = (pr₁ χ n) , n

𝕋→nested-normalised
 : 𝕋 → Σ χ ꞉ (ℤ → ℤ²) , (nested (ℤ²-to-ℤ[1/2]ᴵ ∘ χ) × normalised χ)
𝕋→nested-normalised χ
 = to-interval-seq χ
 , pr₁ (ternary-nested _ i) (pr₂ χ)
 , i
 where
   i : normalised (to-interval-seq χ)
   i n = refl

ternary-normalised→𝕋
 : Σ χ ꞉ (ℤ → ℤ²) , (nested (ℤ²-to-ℤ[1/2]ᴵ ∘ χ) × normalised χ) → 𝕋
ternary-normalised→𝕋 (χ , τ , π)
 = (pr₁ ∘ χ) , pr₂ (ternary-nested χ π) τ

open import UF.Equiv

covers-is-prop : (a b : ℤ[1/2]ᴵ) → is-prop (a covers b)
covers-is-prop ((l₁ , r₁) , _) ((l₂ , r₂) , _)
 = ×-is-prop (≤ℤ[1/2]-is-prop l₁ l₂) (≤ℤ[1/2]-is-prop r₂ r₁)

nested-is-prop : (χ : ℤ → ℤ[1/2]ᴵ) → is-prop (nested χ)
nested-is-prop χ
 = Π-is-prop (fe _ _) (λ n → covers-is-prop (χ n) (χ (succℤ n)))

normalised-is-prop : (χ : ℤ → ℤ²) → is-prop (normalised χ)
normalised-is-prop χ = Π-is-prop (fe _ _) (λ _ → ℤ-is-set)

nested-×-normalised-is-prop
 : (χ : ℤ → ℤ²)
 → is-prop (nested (ℤ²-to-ℤ[1/2]ᴵ ∘ χ) × normalised χ)
nested-×-normalised-is-prop χ
 = ×-is-prop (nested-is-prop (ℤ²-to-ℤ[1/2]ᴵ ∘ χ))
             (normalised-is-prop χ)

below-is-prop : (a b : ℤ) → is-prop (a below b)
below-is-prop a b
 = ×-is-prop (ℤ≤-is-prop (downLeft b) a)
             (ℤ≤-is-prop a (downRight b))

ternary-is-prop : (χ : ℤ → ℤ) → is-prop (ternary χ)
ternary-is-prop χ
 = Π-is-prop (fe _ _) (λ n → below-is-prop (χ (succℤ n)) (χ n))

ternary-normalised≃𝕋 : (Σ χ ꞉ (ℤ → ℤ²)
                     , (nested (ℤ²-to-ℤ[1/2]ᴵ ∘ χ)
                     × normalised χ))
                     ≃ 𝕋
ternary-normalised≃𝕋
 = qinveq ternary-normalised→𝕋 (𝕋→nested-normalised , ρ , μ)
 where
  ρ : 𝕋→nested-normalised ∘ ternary-normalised→𝕋 ∼ id
  ρ (χ , τ , π)
   = to-subtype-= nested-×-normalised-is-prop (dfunext (fe _ _) γ)
   where
    γ : to-interval-seq (ternary-normalised→𝕋 (χ , τ , π)) ∼ χ
    γ i = ap (pr₁ (χ i) ,_) (π i ⁻¹)
  μ : (ternary-normalised→𝕋 ∘ 𝕋→nested-normalised) ∼ id
  μ (χ , b) = to-subtype-= ternary-is-prop (dfunext (fe _ _) γ)
   where
    γ : (λ x → pr₁ (pr₁ (𝕋→nested-normalised (χ , b)) x)) ∼ χ
    γ i = refl

𝕋→nested-positioned
 : 𝕋
 → Σ χ ꞉ (ℤ → ℤ²) , (nested (ℤ²-to-ℤ[1/2]ᴵ ∘ χ)
                  × positioned (ℤ²-to-ℤ[1/2]ᴵ ∘ χ))
𝕋→nested-positioned χ
 = χ' , τ , normalised-positioned χ' π
 where
  γ = 𝕋→nested-normalised χ
  χ' = pr₁ γ
  τ  = pr₁ (pr₂ γ)
  π  = pr₂ (pr₂ γ)

⟦_⟧ : 𝕋 → ℝ-d
⟦ χ ⟧ = ⦅ χ' ⦆'' τ π
 where
  γ = 𝕋→nested-positioned χ
  χ' = pr₁ γ
  τ  = pr₁ (pr₂ γ)
  π  = pr₂ (pr₂ γ)

## Representing compact intervals

CompactInterval : ℤ × ℤ → 𝓤₀ ̇
CompactInterval (k , δ) = Σ (x , _) ꞉ 𝕋 , x(δ) = k

CompactInterval2 : ℤ × ℤ → 𝓤₀ ̇
CompactInterval2 (k , δ)
 = Σ χ ꞉ (ℕ → ℤ) , (χ 0 below k)
                 × ((n : ℕ) → χ (succ n) below χ n)

CompactInterval-1-to-2 : ((k , δ) : ℤ × ℤ)
                       → CompactInterval  (k , δ)
                       → CompactInterval2 (k , δ)
CompactInterval-1-to-2 (k , δ) ((χ' , b') , e')
 = χ , transport (χ' (succℤ δ) below_) e' (b' δ) , bₛ
 where
  χ : ℕ → ℤ
  χ n =  χ' (succℤ (δ +pos n))
  b₀ : χ 0 below χ' δ
  b₀ = b' δ
  bₛ : (n : ℕ) → χ (succ n) below χ n
  bₛ n = b' (succℤ (δ +pos n))

replace-right''
 : ((k , δ) : ℤ × ℤ) → (ℕ → ℤ) → (n : ℤ) → trich-locate n δ → ℤ
replace-right'' (k , δ) χ n (inl (i , n+si=δ))
 = (upRight ^ succ i) k
replace-right'' (k , δ) χ n (inr (inl refl))
 = k
replace-right'' (k , δ) χ n (inr (inr (i , δ+si=n)))
 = χ i

replace-right''-correct
 : ((k , δ) : ℤ × ℤ)
 → (χ : ℕ → ℤ)
 → χ 0 below k
 → ((n : ℕ) → χ (succ n) below χ n)
 → (n : ℤ)
 → (η : trich-locate n δ)
 →       replace-right'' (k , δ) χ (succℤ n) (ℤ-trich-succ n δ η)
   below replace-right'' (k , δ) χ n η
replace-right''-correct (k , δ) χ b₀ bₛ n (inl (0      , refl))
 = above-implies-below _ _ (upRight-above _)
replace-right''-correct (k , δ) χ b₀ bₛ n (inl (succ i , refl))
 = above-implies-below _ _ (upRight-above _)
replace-right''-correct (k , δ) χ b₀ bₛ n (inr (inl refl))
 = b₀
replace-right''-correct (k , δ) χ b₀ bₛ n (inr (inr (i , refl)))
 = bₛ i

CompactInterval-2-to-1 : ((k , δ) : ℤ × ℤ)
                       → CompactInterval2 (k , δ)
                       → CompactInterval  (k , δ)
CompactInterval-2-to-1 (k , δ) (χ' , b'₀ , b'ₛ)
 = (χ , b) , e
 where
  χ : ℤ → ℤ
  χ n = replace-right'' (k , δ) χ' n (ℤ-trichotomous n δ)
  b' : (n : ℤ) → replace-right'' (k , δ) χ' (succℤ n)
                   (ℤ-trich-succ n δ (ℤ-trichotomous n δ))
                 below
                 replace-right'' (k , δ) χ' n (ℤ-trichotomous n δ)
  b' n = replace-right''-correct (k , δ) χ' b'₀ b'ₛ n
           (ℤ-trichotomous n δ)
  b : (n : ℤ) → χ (succℤ n) below χ n
  b n = transport (λ - → replace-right'' (k , δ) χ' (succℤ n) -
                         below χ n)
          (ℤ-trichotomous-is-prop _ _
            (ℤ-trich-succ n δ (ℤ-trichotomous n δ))
            (ℤ-trichotomous (succℤ n) δ))
          (b' n)
  e : χ δ = k
  e = ap (replace-right'' (k , δ) χ' δ)
        (ℤ-trichotomous-is-prop _ _ (ℤ-trichotomous δ δ)
        (inr (inl refl)))

_≈_ : 𝕋 → 𝕋 → 𝓤₀ ̇
(χ₁ , _) ≈ (χ₂ , _) = Σ δ ꞉ ℤ , ((n : ℤ) → δ ≤ n → χ₁ n = χ₂ n)

CompactInterval-≈
 : ((k , δ) : ℤ × ℤ)
 → ((χ , b) : CompactInterval (k , δ))
 → χ ≈ pr₁ (CompactInterval-2-to-1 (k , δ)
             (CompactInterval-1-to-2 (k , δ) (χ , b)))
CompactInterval-≈ (k , δ) ((χ' , b') , e') = δ , γ
 where
  χ = pr₁ (CompactInterval-2-to-1 (k , δ)
             (CompactInterval-1-to-2 (k , δ) ((χ' , b') , e')))
  γ : (n : ℤ) → δ ≤ n → χ' n = pr₁ χ n
  γ n (0 , refl)
   = e'
   ∙ ap (replace-right'' (k , δ)
       (pr₁ (CompactInterval-1-to-2 (k , δ) ((χ' , b') , e'))) δ)
       (ℤ-trichotomous-is-prop _ _
         (ℤ-trichotomous δ δ)
         (inr (inl refl))) ⁻¹
  γ n (succ i , refl)
   = ap (replace-right'' (k , δ)
       (pr₁ (CompactInterval-1-to-2 (k , δ) ((χ' , b') , e')))
       (δ +pos succ i))
       (ℤ-trichotomous-is-prop _ _
         (ℤ-trichotomous (δ +pos succ i) δ)
         (inr (inr (i , ℤ-left-succ-pos δ i)))) ⁻¹

down-to-𝟛 : (a b : ℤ) → a below' b → 𝟛
down-to-𝟛 a b (inl      dL ) = −1
down-to-𝟛 a b (inr (inl dM)) =  O
down-to-𝟛 a b (inr (inr dR)) = +1

𝟛-to-down : (a : 𝟛) → (ℤ → ℤ)
𝟛-to-down −1 = downLeft
𝟛-to-down  O = downMid
𝟛-to-down +1 = downRight

𝟛-down-eq : (a b : ℤ) (d : a below' b)
          → 𝟛-to-down (down-to-𝟛 a b d) b = a
𝟛-down-eq a b (inl      dL ) = dL ⁻¹
𝟛-down-eq a b (inr (inl dM)) = dM ⁻¹
𝟛-down-eq a b (inr (inr dR)) = dR ⁻¹

down-𝟛-eq : (a : 𝟛) (b : ℤ)
          → (e : 𝟛-to-down a b below' b)
          → down-to-𝟛 (𝟛-to-down a b) b e = a
down-𝟛-eq −1 b (inl e) = refl
down-𝟛-eq  O b (inl e)
 = 𝟘-elim (downLeft≠downMid b b refl (e ⁻¹))
down-𝟛-eq +1 b (inl e)
 = 𝟘-elim (downLeft≠downRight b b refl (e ⁻¹))
down-𝟛-eq −1 b (inr (inl e))
 = 𝟘-elim (downLeft≠downMid b b refl e)
down-𝟛-eq  O b (inr (inl e)) = refl
down-𝟛-eq +1 b (inr (inl e))
 = 𝟘-elim (downMid≠downRight b b refl (e ⁻¹))
down-𝟛-eq −1 b (inr (inr e))
 = 𝟘-elim (downLeft≠downRight b b refl e)
down-𝟛-eq  O b (inr (inr e))
 = 𝟘-elim (downMid≠downRight b b refl e)
down-𝟛-eq +1 b (inr (inr e)) = refl

CI2-to-𝟛ᴺ  : ((k , i) : ℤ × ℤ) → CompactInterval2 (k , i) → 𝟛ᴺ
CI2-to-𝟛ᴺ (k , i) (χ , b₀ , bₛ) 0
 = down-to-𝟛 (χ 0) k (below-implies-below' (χ 0) k b₀)
CI2-to-𝟛ᴺ (k , i) (χ , b₀ , bₛ) (succ n)
 = down-to-𝟛 (χ (succ n)) (χ n)
    (below-implies-below' (χ (succ n)) (χ n) (bₛ n))

𝟛-to-down-is-below : (a : 𝟛) (k : ℤ) → 𝟛-to-down a k below k
𝟛-to-down-is-below −1 k = downLeft-below  k
𝟛-to-down-is-below  O k = downMid-below   k
𝟛-to-down-is-below +1 k = downRight-below k

𝟛ᴺ-to-CI2 : ((k , i) : ℤ × ℤ) → 𝟛ᴺ → CompactInterval2 (k , i)
𝟛ᴺ-to-CI2 (k , i) α = χ , b₀ , bₛ
 where
  χ  : ℕ → ℤ
  χ 0        = 𝟛-to-down (α 0) k
  χ (succ n) = 𝟛-to-down (α (succ n)) (χ n)
  b₀ : χ 0 below k
  b₀ = 𝟛-to-down-is-below (α 0) k
  bₛ : (n : ℕ) → χ (succ n) below χ n
  bₛ n = 𝟛-to-down-is-below (α (succ n)) (χ n)

integer-approx : 𝟛ᴺ → (ℕ → ℤ)
integer-approx α = pr₁ (𝟛ᴺ-to-CI2 (negsucc 0 , pos 0) α)

𝟛-possibilities : (a : 𝟛) → (a = −1) + (a = O) + (a = +1)
𝟛-possibilities −1 = inl refl
𝟛-possibilities  O = inr (inl refl)
𝟛-possibilities +1 = inr (inr refl)

CI2-criteria : ((k , i) : ℤ × ℤ) → (ℕ → ℤ) → 𝓤₀ ̇
CI2-criteria (k , i) χ = (χ 0 below k)
                       × ((n : ℕ) → χ (succ n) below χ n)

CI2-prop
 : ((k , i) : ℤ × ℤ)
 → (χ : ℕ → ℤ)
 → is-prop (CI2-criteria (k , i) χ)
CI2-prop (k , i) χ
 = ×-is-prop (below-is-prop (χ 0) k)
     (Π-is-prop (fe _ _) (λ n → below-is-prop (χ (succ n)) (χ n)))

CompactInterval2-ternary
 : ((k , i) : ℤ × ℤ) → CompactInterval2 (k , i) ≃ 𝟛ᴺ
CompactInterval2-ternary (k , i)
 = qinveq (CI2-to-𝟛ᴺ (k , i)) (𝟛ᴺ-to-CI2 (k , i) , η , μ)
 where
  η : (𝟛ᴺ-to-CI2 (k , i)) ∘ (CI2-to-𝟛ᴺ (k , i)) ∼ id
  η (χ , b₀ , bₛ)
   = to-subtype-= (CI2-prop (k , i)) (dfunext (fe _ _) γ)
   where
    χ' = pr₁ (𝟛ᴺ-to-CI2 (k , i) (CI2-to-𝟛ᴺ (k , i) (χ , b₀ , bₛ)))
    γ : χ' ∼ χ
    γ zero = 𝟛-down-eq (χ 0) k (below-implies-below' (χ 0) k b₀)
    γ (succ n)
     = ap (𝟛-to-down (down-to-𝟛 (χ (succ n)) (χ n)
            (below-implies-below' (χ (succ n)) (χ n) (bₛ n))))
          (γ n)
     ∙ 𝟛-down-eq (χ (succ n)) (χ n)
         (below-implies-below' (χ (succ n)) (χ n) (bₛ n))
  μ : (CI2-to-𝟛ᴺ (k , i)) ∘ (𝟛ᴺ-to-CI2 (k , i)) ∼ id
  μ α = dfunext (fe _ _) γ
   where
    α' = 𝟛ᴺ-to-CI2 (k , i) α
    γ : CI2-to-𝟛ᴺ (k , i) α' ∼ α
    γ 0 = down-𝟛-eq (α 0) k _
    γ (succ n) = down-𝟛-eq (α (succ n)) _ _

CI2-ClosenessSpace
 : ((k , i) : ℤ × ℤ)
 → is-closeness-space (CompactInterval2 (k , i))
CI2-ClosenessSpace (k , i)
 = Σ-clospace (CI2-criteria (k , i)) (CI2-prop (k , i))
     (discrete-seq-clospace (λ _ → ℤ-is-discrete))

_split-below_ : ℤ → ℤ → 𝓤₀ ̇
n split-below m = (n = downLeft m) + (n = downRight m)

split-below-is-prop : (n m : ℤ) → is-prop (n split-below m)
split-below-is-prop n m
 = +-is-prop ℤ-is-set ℤ-is-set
     (λ l r → downLeft≠downRight m m refl (l ⁻¹ ∙ r))

CI3-criteria : ((k , i) : ℤ × ℤ) → (ℕ → ℤ) → 𝓤₀ ̇
CI3-criteria (k , i) χ = (χ 0 split-below k)
                       × ((n : ℕ) → χ (succ n) split-below χ n)

CI3-prop : ((k , i) : ℤ × ℤ)
         → (χ : ℕ → ℤ)
         → is-prop (CI3-criteria (k , i) χ)
CI3-prop (k , i) χ
 = ×-is-prop (split-below-is-prop (χ 0) k)
     (Π-is-prop (fe _ _)
       (λ n → split-below-is-prop (χ (succ n)) (χ n)))

CompactInterval3 : ℤ × ℤ → 𝓤₀ ̇
CompactInterval3 (k , i) = Σ (CI3-criteria (k , i))

split-below-implies-below : (n m : ℤ) → n split-below m → n below m
split-below-implies-below n m (inl refl) = (0 , refl) , (2 , refl)
split-below-implies-below n m (inr refl) = (2 , refl) , (0 , refl)

CI3-to-CI2 : ((k , i) : ℤ × ℤ)
           → CompactInterval3 (k , i)
           → CompactInterval2 (k , i)
CI3-to-CI2 (k , i) (χ , b₀ , bₛ)
 = χ , split-below-implies-below (χ 0) k b₀
 , λ n → split-below-implies-below (χ (succ n)) (χ n) (bₛ n)

CI3-ClosenessSpace
 : ((k , i) : ℤ × ℤ) → is-closeness-space (CompactInterval3 (k , i))
CI3-ClosenessSpace (k , i)
 = Σ-clospace (CI3-criteria (k , i)) (CI3-prop (k , i))
     (discrete-seq-clospace (λ _ → ℤ-is-discrete))

𝟚ᴺ = ℕ → 𝟚

down-to-𝟚 : (a b : ℤ) → a split-below b → 𝟚
down-to-𝟚 a b (inl dL) = ₀
down-to-𝟚 a b (inr dR) = ₁

𝟚-to-down : (a : 𝟚) → (ℤ → ℤ)
𝟚-to-down ₀ = downLeft
𝟚-to-down ₁ = downRight

𝟚-to-down-is-below : (a : 𝟚) (k : ℤ) → 𝟚-to-down a k split-below k
𝟚-to-down-is-below ₀ k = inl refl
𝟚-to-down-is-below ₁ k = inr refl

𝟚-down-eq : (a b : ℤ) (d : a split-below b)
          → 𝟚-to-down (down-to-𝟚 a b d) b = a
𝟚-down-eq a b (inl dL) = dL ⁻¹
𝟚-down-eq a b (inr dR) = dR ⁻¹

down-𝟚-eq : (a : 𝟚) (b : ℤ) (e : 𝟚-to-down a b split-below b)
          → down-to-𝟚 (𝟚-to-down a b) b e = a
down-𝟚-eq ₀ b (inl e) = refl
down-𝟚-eq ₁ b (inl e) = 𝟘-elim (downLeft≠downRight b b refl (e ⁻¹))
down-𝟚-eq ₀ b (inr e) = 𝟘-elim (downLeft≠downRight b b refl e)
down-𝟚-eq ₁ b (inr e) = refl

CI3-to-𝟚ᴺ
 : ((k , i) : ℤ × ℤ) → CompactInterval3 (k , i) → 𝟚ᴺ
CI3-to-𝟚ᴺ (k , i) (χ , b₀ , bₛ) 0
 = down-to-𝟚 (χ 0) k b₀
CI3-to-𝟚ᴺ (k , i) (χ , b₀ , bₛ) (succ n)
 = down-to-𝟚 (χ (succ n)) (χ n) (bₛ n)

𝟚ᴺ-to-CI3 : ((k , i) : ℤ × ℤ) → 𝟚ᴺ → CompactInterval3 (k , i)
𝟚ᴺ-to-CI3 (k , i) α = χ , b₀ , bₛ
 where
  χ  : ℕ → ℤ
  χ 0        = 𝟚-to-down (α 0) k
  χ (succ n) = 𝟚-to-down (α (succ n)) (χ n)
  b₀ : χ 0 split-below k
  b₀ = 𝟚-to-down-is-below (α 0) k
  bₛ : (n : ℕ) → χ (succ n) split-below χ n
  bₛ n = 𝟚-to-down-is-below (α (succ n)) (χ n)

CompactInterval3-cantor
 : ((k , i) : ℤ × ℤ) → CompactInterval3 (k , i) ≃ 𝟚ᴺ
CompactInterval3-cantor (k , i)
 = qinveq (CI3-to-𝟚ᴺ (k , i)) (𝟚ᴺ-to-CI3 (k , i) , η , μ)
 where
  η : (𝟚ᴺ-to-CI3 (k , i)) ∘ (CI3-to-𝟚ᴺ (k , i)) ∼ id
  η (χ , b₀ , bₛ)
   = to-subtype-= (CI3-prop (k , i)) (dfunext (fe _ _) γ)
   where
    χ' = pr₁ (𝟚ᴺ-to-CI3 (k , i) (CI3-to-𝟚ᴺ (k , i) (χ , b₀ , bₛ)))
    γ : χ' ∼ χ
    γ 0 = 𝟚-down-eq (χ 0) k b₀
    γ (succ n)
     = ap (𝟚-to-down (down-to-𝟚 (χ (succ n)) (χ n) (bₛ n))) (γ n)
     ∙ 𝟚-down-eq (χ (succ n)) (χ n) (bₛ n)
  μ : (CI3-to-𝟚ᴺ (k , i)) ∘ (𝟚ᴺ-to-CI3 (k , i)) ∼ id
  μ α = dfunext (fe _ _) γ
   where
    α' = 𝟚ᴺ-to-CI3 (k , i) α
    γ : CI3-to-𝟚ᴺ (k , i) α' ∼ α
    γ 0 = down-𝟚-eq (α 0) k (𝟚-to-down-is-below (α 0) k)
    γ (succ n) = down-𝟚-eq (α (succ n)) _ _