Andrew Sneap, April 2023 Note that this file is incomplete. \begin{code} {-# OPTIONS --without-K --safe #-} open import Integers.Addition renaming (_+_ to _+ℤ_ ; _-_ to _ℤ-_) open import Integers.Multiplication renaming (_*_ to _ℤ*_) open import Integers.Negation renaming (-_ to ℤ-_) open import Integers.Order open import Integers.Type open import MLTT.Spartan open import Naturals.Addition renaming (_+_ to _+ℕ_) open import Naturals.Multiplication renaming (_*_ to _ℕ*_) open import Naturals.Properties hiding (double) open import Notation.Order open import UF.Base open import UF.FunExt open import UF.Subsingletons open import UF.Subsingletons-FunExt open import UF.DiscreteAndSeparated open import TWA.Thesis.Chapter5.Integers module TWA.Thesis.AndrewSneap.DyadicRationals where \end{code} This file defines dyadic rationals as a record, along with many widely accepted operations, relations and results on dyadic rationals. They are denoted ℤ[1/2]. \begin{code} ℤ[1/2] : 𝓤₀ ̇ ℤ[1/2] = Σ (z , n) ꞉ ℤ × ℕ , (n = 0) + ((n ≠ 0) × odd z) ℤ[1/2]-cond-is-prop : FunExt → (z : ℤ) (n : ℕ) → is-prop ((n = 0) + ((n ≠ 0) × odd z)) ℤ[1/2]-cond-is-prop fe z n = +-is-prop ℕ-is-set (×-is-prop (Π-is-prop (fe 𝓤₀ 𝓤₀) (λ _ → 𝟘-is-prop)) (odd-is-prop z)) (λ e (ne , _) → ne e) 0ℤ[1/2] : ℤ[1/2] 0ℤ[1/2] = (pos 0 , 0) , inl refl 1ℤ[1/2] : ℤ[1/2] 1ℤ[1/2] = (pos 1 , 0) , inl refl 1/2ℤ[1/2] : ℤ[1/2] 1/2ℤ[1/2] = (pos 1 , 1) , inr (positive-not-zero 0 , ⋆) normalise-pos normalise-neg : ℤ → ℕ → ℤ[1/2] normalise-pos-oe : (z : ℤ) → ℕ → even z + odd z → ℤ[1/2] normalise-pos-oe z 0 _ = (z , 0) , inl refl normalise-pos-oe z (succ n) (inl e) = normalise-pos (z /2') n normalise-pos-oe z (succ n) (inr o) = (z , succ n) , inr (positive-not-zero n , o) normalise-pos z n = normalise-pos-oe z n (even-or-odd? z) normalise-neg z 0 = (z +ℤ z , 0) , inl refl normalise-neg z (succ n) = normalise-neg (z +ℤ z) n normalise-pos' : (z : ℤ) (n : ℕ) → (oe : even z + odd z) → let ((k , δ) , p) = normalise-pos-oe z n oe in Σ m ꞉ ℕ , ((pos (2^ m) ℤ* k , δ +ℕ m) = z , n) normalise-pos' z 0 oe = 0 , to-×-= (ℤ-mult-left-id z) refl normalise-pos' z (succ n) (inl e) = succ m , to-×-= γ (ap succ e₂) where kδ = normalise-pos-oe (z /2') n (even-or-odd? (z /2')) k : ℤ k = pr₁ (pr₁ kδ) δ : ℕ δ = pr₂ (pr₁ kδ) IH = normalise-pos' (z /2') n (even-or-odd? (z /2')) m : ℕ m = pr₁ IH q : pos (2^ m) ℤ* k , δ +ℕ m = (z /2') , n q = pr₂ IH e₁ : pos (2^ m) ℤ* k = (z /2') e₁ = pr₁ (from-×-=' q) e₂ : δ +ℕ m = n e₂ = pr₂ (from-×-=' q) γ : pos (2^ (succ m)) ℤ* k = z γ = pos (2^ (succ m)) ℤ* k =⟨ refl ⟩ pos (2 ℕ* 2^ m) ℤ* k =⟨ ap (_ℤ* k) (pos-multiplication-equiv-to-ℕ 2 (2^ m) ⁻¹) ⟩ pos 2 ℤ* pos (2^ m) ℤ* k =⟨ ℤ*-assoc (pos 2) (pos (2^ m)) k ⟩ pos 2 ℤ* (pos (2^ m) ℤ* k) =⟨ ap (pos 2 ℤ*_) e₁ ⟩ pos 2 ℤ* (z /2') =⟨ ℤ*-comm (pos 2) (z /2') ⟩ (z /2') ℤ* pos 2 =⟨ even-lemma z e ⟩ z ∎ normalise-pos' z (succ n) (inr o) = 0 , to-×-= (ℤ-mult-left-id z) refl normalise : ℤ × ℤ → ℤ[1/2] normalise (k , pos n) = normalise-pos k n normalise (k , negsucc n) = normalise-neg k n normalise-neg' : (z : ℤ) (n : ℕ) → let ((k , δ) , p) = normalise-neg z n in (k , δ) = pos (2^ (succ n)) ℤ* z , 0 normalise-neg' z 0 = to-×-= (ℤ*-comm z (pos 2)) refl normalise-neg' z (succ n) = to-×-= I e₂ where kδ = normalise-neg (z +ℤ z) n k : ℤ k = pr₁ (pr₁ kδ) δ : ℕ δ = pr₂ (pr₁ kδ) e₁ : k = pos (2^ (succ n)) ℤ* (z +ℤ z) e₁ = pr₁ (from-×-=' (normalise-neg' (z +ℤ z) n)) e₂ : δ = 0 e₂ = pr₂ (from-×-=' (normalise-neg' (z +ℤ z) n)) I : k = pos (2^ (succ (succ n))) ℤ* z I = k =⟨ e₁ ⟩ pos (2^ (succ n)) ℤ* (z ℤ* pos 2) =⟨ ap (pos (2^ (succ n)) ℤ*_) (ℤ*-comm z (pos 2)) ⟩ pos (2^ (succ n)) ℤ* (pos 2 ℤ* z) =⟨ ℤ*-assoc (pos (2^ (succ n))) (pos 2) z ⁻¹ ⟩ pos (2^ (succ n)) ℤ* pos 2 ℤ* z =⟨ ap (_ℤ* z) (pos-multiplication-equiv-to-ℕ (2^ (succ n)) 2) ⟩ pos (2^ (succ n) ℕ* 2) ℤ* z =⟨ ap (λ n → pos n ℤ* z) (mult-commutativity (2^ (succ n)) 2) ⟩ pos (2^ (succ (succ n))) ℤ* z ∎ lowest-terms-normalised : FunExt → (((k , δ) , p) : ℤ[1/2]) → normalise-pos k δ = ((k , δ) , p) lowest-terms-normalised fe ((k , .0) , inl refl) = refl lowest-terms-normalised fe ((k , zero) , inr (δnz , o)) = 𝟘-elim (δnz refl) lowest-terms-normalised fe ((k , succ δ) , inr (δnz , o)) = γ (even-or-odd? k) where γ : (oe : even k + odd k) → normalise-pos-oe k (succ δ) oe = (k , succ δ) , inr (δnz , o) γ (inl e) = 𝟘-elim (e o) γ (inr o) = to-subtype-= (λ (z , n) → ℤ[1/2]-cond-is-prop fe z n) refl normalise-pos-lemma₁ : FunExt → (k : ℤ) (δ : ℕ) → (p : (δ = 0) + ((δ ≠ 0) × odd k)) → normalise-pos ((k +ℤ k) /2') δ = (k , δ) , p normalise-pos-lemma₁ fe k 0 (inl refl) = to-subtype-= (λ (z , n) → ℤ[1/2]-cond-is-prop fe z n) (to-×-= (div-by-two k) refl) normalise-pos-lemma₁ fe k 0 (inr (δnz , k-odd)) = 𝟘-elim (δnz refl) normalise-pos-lemma₁ fe k (succ δ) (inr p) with even-or-odd? ((k +ℤ k) /2') normalise-pos-lemma₁ fe k (succ δ) (inr (δnz , k-odd)) | inl k-even = 𝟘-elim (k-even (transport odd (div-by-two k ⁻¹) k-odd)) ... | inr _ = to-subtype-= (λ (z , n) → ℤ[1/2]-cond-is-prop fe z n) (to-×-= (div-by-two k) refl) normalise-pos-lemma₂ : (k : ℤ) (δ : ℕ) → normalise-pos k δ = normalise-pos (k +ℤ k) (succ δ) normalise-pos-lemma₂ k δ with even-or-odd? (k +ℤ k) ... | inl _ = ap (λ s → normalise-pos s δ) (div-by-two k ⁻¹) ... | inr o = 𝟘-elim (times-two-even' k o) double : ℤ → ℤ double a = a +ℤ a normalise-lemma : FunExt → (k : ℤ) (δ : ℕ) (n : ℕ) → (p : (δ = 0) + ((δ ≠ 0) × odd k)) → normalise (rec k double n +ℤ rec k double n , (pos (succ δ) +ℤ pos n)) = (k , δ) , p normalise-lemma fe k δ 0 p with even-or-odd? (k +ℤ k) ... | inl even = normalise-pos-lemma₁ fe k δ p ... | inr odd = 𝟘-elim (times-two-even' k odd) normalise-lemma fe k δ (succ n) p with even-or-odd? (k +ℤ k) ... | inl even = let y = rec k double n z = (y +ℤ y) in normalise (z +ℤ z , (succℤ (pos (succ δ) +ℤ pos n))) =⟨ ap (λ - → normalise (z +ℤ z , succℤ -)) (distributivity-pos-addition (succ δ) n) ⟩ normalise (z +ℤ z , succℤ (pos (succ δ +ℕ n))) =⟨ refl ⟩ normalise-pos (z +ℤ z) (succ (succ δ +ℕ n)) =⟨ normalise-pos-lemma₂ z (succ δ +ℕ n) ⁻¹ ⟩ normalise-pos z (succ δ +ℕ n) =⟨ refl ⟩ normalise (z , pos (succ δ +ℕ n)) =⟨ ap (λ - → normalise (z , -)) (distributivity-pos-addition (succ δ) n ⁻¹) ⟩ normalise (z , pos (succ δ) +ℤ pos n) =⟨ normalise-lemma fe k δ n p ⟩ (k , δ) , p ∎ ... | inr odd = 𝟘-elim (times-two-even' k odd) _<ℤ[1/2]_ _≤ℤ[1/2]_ : ℤ[1/2] → ℤ[1/2] → 𝓤₀ ̇ ((x , n) , _) <ℤ[1/2] ((y , m) , _) = x ℤ* pos (2^ m) < y ℤ* pos (2^ n) ((x , n) , _) ≤ℤ[1/2] ((y , m) , _) = x ℤ* pos (2^ m) ≤ y ℤ* pos (2^ n) <ℤ[1/2]-is-prop : (x y : ℤ[1/2]) → is-prop (x <ℤ[1/2] y) <ℤ[1/2]-is-prop ((x , a) , _) ((y , b) , _) = ℤ<-is-prop (x ℤ* pos (2^ b)) (y ℤ* pos (2^ a)) ≤ℤ[1/2]-is-prop : (x y : ℤ[1/2]) → is-prop (x ≤ℤ[1/2] y) ≤ℤ[1/2]-is-prop ((x , a) , _) ((y , b) , _) = ℤ≤-is-prop (x ℤ* pos (2^ b)) (y ℤ* pos (2^ a)) ℤ[1/2]⁺ : 𝓤₀ ̇ ℤ[1/2]⁺ = Σ x ꞉ ℤ[1/2] , 0ℤ[1/2] <ℤ[1/2] x _<ℤ[1/2]⁺_ _≤ℤ[1/2]⁺_ : ℤ[1/2]⁺ → ℤ[1/2]⁺ → 𝓤₀ ̇ (x , l) <ℤ[1/2]⁺ (y , l') = x <ℤ[1/2] y (x , l) ≤ℤ[1/2]⁺ (y , l') = x ≤ℤ[1/2] y is-positive : ℤ[1/2] -> 𝓤₀ ̇ is-positive x = 0ℤ[1/2] <ℤ[1/2] x instance Order-ℤ[1/2]-ℤ[1/2] : Order ℤ[1/2] ℤ[1/2] _≤_ {{Order-ℤ[1/2]-ℤ[1/2]}} = _≤ℤ[1/2]_ Strict-Order-ℤ[1/2]-ℤ[1/2] : Strict-Order ℤ[1/2] ℤ[1/2] _<_ {{Strict-Order-ℤ[1/2]-ℤ[1/2]}} = _<ℤ[1/2]_ instance Order-ℤ[1/2]⁺-ℤ[1/2]⁺ : Order ℤ[1/2]⁺ ℤ[1/2]⁺ _≤_ {{Order-ℤ[1/2]⁺-ℤ[1/2]⁺}} = _≤ℤ[1/2]⁺_ Strict-Order-ℤ[1/2]⁺-ℤ[1/2]⁺ : Strict-Order ℤ[1/2]⁺ ℤ[1/2]⁺ _<_ {{Strict-Order-ℤ[1/2]⁺-ℤ[1/2]⁺}} = _<ℤ[1/2]⁺_ record Dyadics : 𝓤₁ ̇ where field _ℤ[1/2]+_ : ℤ[1/2] → ℤ[1/2] → ℤ[1/2] ℤ[1/2]-_ : ℤ[1/2] → ℤ[1/2] infix 20 ℤ[1/2]-_ infixl 19 _ℤ[1/2]-_ _ℤ[1/2]-_ : (p q : ℤ[1/2]) → ℤ[1/2] p ℤ[1/2]- q = p ℤ[1/2]+ (ℤ[1/2]- q) field _ℤ[1/2]*_ : ℤ[1/2] → ℤ[1/2] → ℤ[1/2] ℤ[1/2]-abs : ℤ[1/2] → ℤ[1/2] trans : (x y z : ℤ[1/2]) → x < y → y < z → x < z trans' : (x y z : ℤ[1/2]) → x ≤ y → y ≤ z → x ≤ z dense : (x y : ℤ[1/2]) → (x < y) → Σ k ꞉ ℤ[1/2] , (x < k) × (k < y) ≤-refl : (x : ℤ[1/2]) → x ≤ x <-is-≤ℤ[1/2] : (x y : ℤ[1/2]) → x < y → x ≤ y diff-positive : (x y : ℤ[1/2]) → x < y → 0ℤ[1/2] < (y ℤ[1/2]- x) <-swap : (x y : ℤ[1/2]) → x < y → (ℤ[1/2]- y) < (ℤ[1/2]- x) ≤-swap : (x y : ℤ[1/2]) → x ≤ y → (ℤ[1/2]- y) ≤ (ℤ[1/2]- x) ≤-swap' : (x y : ℤ[1/2]) → (ℤ[1/2]- x) ≤ (ℤ[1/2]- y) → y ≤ x ≤-split : (x y : ℤ[1/2]) → x ≤ y → x < y + (x = y) <-pos-mult' : (x y : ℤ[1/2]) → 0ℤ[1/2] < x → 0ℤ[1/2] < y → 0ℤ[1/2] < (x ℤ[1/2]* y) ℤ[1/2]<-+ : (x y : ℤ[1/2]) → 0ℤ[1/2] < y → x < (x ℤ[1/2]+ y) ℤ[1/2]<-neg : (x y : ℤ[1/2]) → 0ℤ[1/2] < y → (x ℤ[1/2]- y) < x ℤ[1/2]<-rearrange : (x y z : ℤ[1/2]) → (x ℤ[1/2]+ y) < z → y < (z ℤ[1/2]- x) ℤ[1/2]-1/2-< : (x : ℤ[1/2]) → 0ℤ[1/2] < x → (1/2ℤ[1/2] ℤ[1/2]* x) < x normalise-≤ : (n : ℕ) → ((k , p) : ℤ × ℤ) → normalise (k , p) ≤ normalise ((k +pos n) , p) normalise-denom-≤ : (k : ℕ) (p q : ℤ) → p ≤ q → normalise (pos k , q) ≤ normalise (pos k , p) ℤ[1/2]-ordering-property : (a b c d : ℤ[1/2]) → (a ℤ[1/2]- b) < (c ℤ[1/2]- d) → (a < c) + (d < b) normalise-succ' : (z n : ℤ) → normalise (z , n) = normalise (z +ℤ z , succℤ n) normalise-pred' : (z n : ℤ) → normalise (z , predℤ n) = normalise (z +ℤ z , n) ℤ[1/2]<-positive-mult : (a b : ℤ[1/2]) → is-positive a → is-positive b → is-positive (a ℤ[1/2]* b) ℤ[1/2]-find-lower : (ε : ℤ[1/2]) → is-positive ε → Σ n ꞉ ℤ , normalise (pos 2 , n) < ε normalise-negation : (a b c : ℤ) → normalise (a , c) ℤ[1/2]- normalise (b , c) = normalise (a ℤ- b , c) normalise-negation' : (a b : ℤ) → ℤ[1/2]- normalise (a , b) = normalise (ℤ- a , b) from-normalise-≤-same-denom : (a b c : ℤ) → normalise (a , c) ≤ normalise (b , c) → a ≤ b ℤ[1/2]<-≤ : (x y z : ℤ[1/2]) → x < y → y ≤ z → x < z ℤ[1/2]<-≤ x y z x<y y≤z with ≤-split y z y≤z ... | inl y<z = trans x y z x<y y<z ... | inr y=z = transport (x <_) y=z x<y ℤ[1/2]≤-< : (x y z : ℤ[1/2]) → x ≤ y → y < z → x < z ℤ[1/2]≤-< x y z x≤y y<z with ≤-split x y x≤y ... | inl x<y = trans x y z x<y y<z ... | inr x=y = transport (_< z) (x=y ⁻¹) y<z 0<1/2ℤ[1/2] : 0ℤ[1/2] < 1/2ℤ[1/2] 0<1/2ℤ[1/2] = 0 , refl 0<1ℤ[1/2] : 0ℤ[1/2] < 1ℤ[1/2] 0<1ℤ[1/2] = 0 , refl normalise-≤2 : (l r p : ℤ) → l ≤ r → normalise (l , p) ≤ normalise (r , p) normalise-≤2 l r p (j , refl) = normalise-≤ j (l , p) \end{code}