Todd Waugh Ambridge, January 2024 # Real-order preserving order on ternary signed-digit encodings \begin{code} {-# OPTIONS --without-K --safe #-} open import MLTT.Spartan open import Naturals.Order open import UF.FunExt open import UF.PropTrunc open import Quotient.Type using (is-prop-valued) open import Integers.Type open import Notation.Order open import Integers.Order open import TWA.Thesis.Chapter2.Sequences open import TWA.Thesis.Chapter5.SignedDigit open import TWA.Thesis.Chapter5.BoehmStructure open import TWA.Thesis.Chapter5.Integers module TWA.Thesis.Chapter6.SignedDigitOrder (fe : FunExt) where open import TWA.Thesis.Chapter3.ClosenessSpaces fe open import TWA.Thesis.Chapter3.ClosenessSpaces-Examples fe open import TWA.Thesis.Chapter4.ApproxOrder fe \end{code} ## Integer approx (originally defined in BoehmVerification) \begin{code} 𝟛-to-down : (a : 𝟛) → (ℤ → ℤ) 𝟛-to-down −1 = downLeft 𝟛-to-down O = downMid 𝟛-to-down +1 = downRight integer-approx' : 𝟛ᴺ → ℤ → (ℕ → ℤ) integer-approx'' : 𝟛 → 𝟛ᴺ → ℤ → (ℕ → ℤ) integer-approx'' _ α k 0 = k integer-approx'' b α k (succ n) = integer-approx' α (𝟛-to-down b k) n integer-approx' α = integer-approx'' (α 0) (α ∘ succ) integer-approx : 𝟛ᴺ → (ℕ → ℤ) integer-approx α = integer-approx' α (negsucc 0) ternary-to-ℤ²' : 𝟛 → 𝟛ᴺ → ℤ → (ℕ → ℤ × ℕ) ternary-to-ℤ²' b α k n = integer-approx α n , n ternary-to-ℤ² : 𝟛ᴺ → (ℕ → ℤ × ℕ) ternary-to-ℤ² α = ternary-to-ℤ²' (α 0) (α ∘ succ) (negsucc 0) \end{code} ## Real preserving preorder \begin{code} module RealPresOrder (pt : propositional-truncations-exist) where open PropositionalTruncation pt _≤𝟛ᴺ_ : 𝟛ᴺ → 𝟛ᴺ → 𝓤₀ ̇ x ≤𝟛ᴺ y = ∃ n ꞉ ℕ , ((i : ℕ) → n ≤ i → integer-approx x i ≤ integer-approx y i) ≤𝟛ᴺ-is-preorder : is-preorder _≤𝟛ᴺ_ ≤𝟛ᴺ-is-preorder = r , t , p where r : reflexive _≤𝟛ᴺ_ r x = ∣ (0 , λ i _ → ℤ≤-refl _) ∣ t : transitive _≤𝟛ᴺ_ t x y z x≤y y≤z = ∥∥-rec ∃-is-prop (λ x≤y' → ∥∥-rec ∃-is-prop (∣_∣ ∘ γ x≤y') y≤z) x≤y where γ : (Σ n ꞉ ℕ , ((i : ℕ) → n ≤ i → integer-approx x i ≤ integer-approx y i)) → (Σ m ꞉ ℕ , ((i : ℕ) → m ≤ i → integer-approx y i ≤ integer-approx z i)) → Σ nm ꞉ ℕ , ((i : ℕ) → nm ≤ i → integer-approx x i ≤ integer-approx z i) γ (n , f) (m , g) = max n m , λ i nm≤i → ℤ≤-trans _ _ _ (f i (n≤ i nm≤i)) (g i (m≤ i nm≤i)) where n≤ : (i : ℕ) → max n m ≤ i → n ≤ i n≤ i nm≤i = ≤-trans n (max n m) i (max-≤-upper-bound n m) nm≤i m≤ : (i : ℕ) → max n m ≤ i → m ≤ i m≤ i nm≤i = ≤-trans m (max n m) i (max-≤-upper-bound' m n) nm≤i p : is-prop-valued _≤𝟛ᴺ_ p x y = ∃-is-prop \end{code} ## Real-preserving approximate order \begin{code} _≤ⁿ𝟛ᴺ_ : 𝟛ᴺ → 𝟛ᴺ → ℕ → 𝓤₀ ̇ (x ≤ⁿ𝟛ᴺ y) n = integer-approx x n ≤ integer-approx y n ≤ⁿ𝟛ᴺ-is-linear-preorder : (n : ℕ) → is-linear-preorder (λ x y → (x ≤ⁿ𝟛ᴺ y) n) ≤ⁿ𝟛ᴺ-is-linear-preorder n = ((λ x → ℤ≤-refl _) , (λ x y z → ℤ≤-trans _ _ _) , λ x y → ℤ≤-is-prop _ _) , λ x y → ℤ-dichotomous _ _ ≤ⁿ𝟛ᴺ-is-decidable : (n : ℕ) (x y : 𝟛ᴺ) → is-decidable ((x ≤ⁿ𝟛ᴺ y) n) ≤ⁿ𝟛ᴺ-is-decidable n x y = ℤ≤-decidable _ _ integer-approx'-ucontinuous : (ϵ : ℕ) (x y : 𝟛ᴺ) → (x ∼ⁿ y) ϵ → (k : ℤ) → integer-approx' x k ϵ = integer-approx' y k ϵ integer-approx'-ucontinuous 0 x y x∼y k = refl integer-approx'-ucontinuous (succ ϵ) x y x∼y k = ap (λ - → integer-approx'' (x 1) (x ∘ succ ∘ succ) (𝟛-to-down - k) ϵ) (x∼y 0 ⋆) ∙ integer-approx'-ucontinuous ϵ (x ∘ succ) (y ∘ succ) (x∼y ∘ succ) (𝟛-to-down (y 0) k) ≤ⁿ𝟛ᴺ-closeness : (ϵ : ℕ) (x y : 𝟛ᴺ) → C 𝟛ᴺ-ClosenessSpace ϵ x y → (x ≤ⁿ𝟛ᴺ y) ϵ ≤ⁿ𝟛ᴺ-closeness ϵ x y Cxy = 0 , integer-approx'-ucontinuous ϵ x y (C-to-∼ⁿ 𝟛-is-discrete x y ϵ Cxy) (negsucc 0) ≤ⁿ𝟛ᴺ-is-approx-order : is-approx-order 𝟛ᴺ-ClosenessSpace _≤ⁿ𝟛ᴺ_ ≤ⁿ𝟛ᴺ-is-approx-order = ≤ⁿ𝟛ᴺ-is-linear-preorder , ≤ⁿ𝟛ᴺ-is-decidable , ≤ⁿ𝟛ᴺ-closeness module RealPresOrder-Relates (pt : propositional-truncations-exist) where open PropositionalTruncation pt open RealPresOrder pt open ApproxOrder-Relates pt ≤ⁿ𝟛ᴺ-relates→ : _≤ⁿ𝟛ᴺ_ relates-to→ _≤𝟛ᴺ_ ≤ⁿ𝟛ᴺ-relates→ x y f = ∣ (0 , λ x _ → f x) ∣ ≤ⁿ𝟛ᴺ-relates← : _≤ⁿ𝟛ᴺ_ relates-to← _≤𝟛ᴺ_ ≤ⁿ𝟛ᴺ-relates← x y = id ≤ⁿ𝟛ᴺ-relates : approx-order-relates 𝟛ᴺ-ClosenessSpace _≤ⁿ𝟛ᴺ_ ≤ⁿ𝟛ᴺ-is-approx-order _≤𝟛ᴺ_ ≤𝟛ᴺ-is-preorder ≤ⁿ𝟛ᴺ-relates = ≤ⁿ𝟛ᴺ-relates→ , ≤ⁿ𝟛ᴺ-relates← \end{code}