Andrew Sneap, 10 March 2022 In this file I define the absolute value for rational numbers, and prove properties of the absolute value. \begin{code} {-# OPTIONS --safe --without-K #-} open import MLTT.Spartan renaming (_+_ to _∔_) open import Notation.Order open import UF.Base hiding (_≈_) open import Integers.Abs open import Integers.Type hiding (abs) open import Integers.Multiplication renaming (_*_ to _ℤ*_) open import Integers.Order open import Rationals.Fractions open import Rationals.FractionsOperations renaming (abs to 𝔽-abs) renaming (-_ to 𝔽-_) hiding (_+_) hiding (_*_) open import Rationals.Type open import Rationals.Addition open import Rationals.Negation open import Rationals.Order open import Rationals.Multiplication module Rationals.Abs where abs : ℚ → ℚ abs (q , _) = toℚ (𝔽-abs q) ℚ-abs-zero : 0ℚ = abs 0ℚ ℚ-abs-zero = by-definition toℚ-abs : (q : 𝔽) → abs (toℚ q) = toℚ (𝔽-abs q) toℚ-abs (x , a) = equiv→equality (𝔽-abs (x' , a')) (𝔽-abs (x , a)) γ where x' = numℚ (x , a) a' = dnomℚ (x , a) h = hcf𝔽 (x , a) pa = (pos ∘ succ) a pa' = (pos ∘ succ) a' ph = (pos ∘ succ) h γ' : ph ℤ* (absℤ x' ℤ* pa) = ph ℤ* (absℤ x ℤ* pa') γ' = ph ℤ* (absℤ x' ℤ* pa) =⟨ ℤ*-assoc ph (absℤ x') pa ⁻¹ ⟩ ph ℤ* absℤ x' ℤ* pa =⟨ refl ⟩ absℤ ph ℤ* absℤ x' ℤ* pa =⟨ ap (_ℤ* pa) (abs-over-mult' ph x' ⁻¹) ⟩ absℤ (ph ℤ* x') ℤ* pa =⟨ ap (λ - → absℤ - ℤ* pa) (numr (x , a) ⁻¹) ⟩ absℤ x ℤ* pa =⟨ ℤ*-comm (absℤ x) pa ⟩ pa ℤ* absℤ x =⟨ ap (_ℤ* absℤ x) (dnomrP' (x , a)) ⟩ ph ℤ* pa' ℤ* absℤ x =⟨ ℤ*-assoc ph pa' (absℤ x) ⟩ ph ℤ* (pa' ℤ* absℤ x) =⟨ ap (ph ℤ*_) (ℤ*-comm pa' (absℤ x)) ⟩ ph ℤ* (absℤ x ℤ* pa') ∎ γ : 𝔽-abs (x' , a') ≈ 𝔽-abs (x , a) γ = ℤ-mult-left-cancellable (absℤ x' ℤ* pa) (absℤ x ℤ* pa') ph id γ' abs-of-pos-is-pos : (p : ℚ) → 0ℚ ≤ p → abs p = p abs-of-pos-is-pos ((pos x , a) , α) l = toℚ-to𝔽 ((pos x , a) , α) ⁻¹ abs-of-pos-is-pos ((negsucc x , a) , α) l = 𝟘-elim (ℚ-num-neg-not-pos x a α l) abs-of-pos-is-pos' : (p : ℚ) → 0ℚ < p → abs p = p abs-of-pos-is-pos' p l = abs-of-pos-is-pos p (ℚ<-coarser-than-≤ 0ℚ p l) ℚ-abs-neg-equals-pos : (q : ℚ) → abs q = abs (- q) ℚ-abs-neg-equals-pos (q , p) = γ where I : 𝔽-abs q ≈ 𝔽-abs (𝔽- q) → toℚ (𝔽-abs q) = toℚ (𝔽-abs (𝔽- q)) I = equiv→equality (𝔽-abs q) (𝔽-abs (𝔽- q)) II : 𝔽-abs q ≈ 𝔽-abs (𝔽- q) II = 𝔽-abs-neg-equals-pos q γ : abs (q , p) = abs (- (q , p)) γ = abs (q , p) =⟨ by-definition ⟩ toℚ (𝔽-abs q) =⟨ I II ⟩ toℚ (𝔽-abs (𝔽- q)) =⟨ toℚ-abs (𝔽- q) ⁻¹ ⟩ abs (toℚ (𝔽- q)) =⟨ by-definition ⟩ abs (- (q , p)) ∎ ℚ-abs-inverse : (q : ℚ) → (abs q = q) ∔ (abs q = - q) ℚ-abs-inverse ((pos x , a) , q) = inl (toℚ-to𝔽 ((pos x , a) , q) ⁻¹) ℚ-abs-inverse ((negsucc x , a) , q) = inr refl ℚ-abs-is-positive : (q : ℚ) → 0ℚ ≤ abs q ℚ-abs-is-positive ((pos zero , a) , _) = 0 , refl ℚ-abs-is-positive ((pos (succ x) , a) , q) = γ where I : 0ℚ < toℚ (pos (succ x) , a) I = ℚ-zero-less-than-positive x a γ : 0ℚ ≤ abs ((pos (succ x) , a) , q) γ = ℚ<-coarser-than-≤ 0ℚ (abs ((pos (succ x) , a) , q)) I ℚ-abs-is-positive ((negsucc x , a) , q) = γ where I : 0ℚ < abs ((negsucc x , a) , q) I = ℚ-zero-less-than-positive x a γ : 0ℚ ≤ abs ((negsucc x , a) , q) γ = ℚ<-coarser-than-≤ 0ℚ (abs (((negsucc x , a) , q))) I ℚ-abs-zero-is-zero : (q : ℚ) → abs q = 0ℚ → q = 0ℚ ℚ-abs-zero-is-zero ((pos 0 , a) , p) e = γ where γ : (pos 0 , a) , p = 0ℚ γ = numerator-zero-is-zero ((pos 0 , a) , p) refl ℚ-abs-zero-is-zero ((pos (succ x) , a) , p) e = 𝟘-elim γ where γ : 𝟘 γ = ℚ-positive-not-zero x a e ℚ-abs-zero-is-zero ((negsucc x , a) , p) e = 𝟘-elim (ℚ-positive-not-zero x a e) ℚ-abs-≤ : (q : ℚ) → (- abs q ≤ q) × (q ≤ abs q) ℚ-abs-≤ q = cases γ₁ γ₂ (ℚ-abs-inverse q) where I : 0ℚ ≤ abs q I = ℚ-abs-is-positive q II : - abs q ≤ 0ℚ II = ℚ≤-swap 0ℚ (abs q) I III : - abs q ≤ abs q III = ℚ≤-trans (- abs q) 0ℚ (abs q) II I γ₁ : abs q = q → (- abs q ≤ q) × (q ≤ abs q) γ₁ e = l , r where l : - abs q ≤ q l = transport (- abs q ≤_) e III r : q ≤ abs q r = transport (q ≤_) (e ⁻¹) (ℚ≤-refl q) γ₂ : abs q = - q → (- abs q ≤ q) × (q ≤ abs q) γ₂ e = l , r where IV : q = - abs q IV = q =⟨ ℚ-minus-minus q ⟩ - (- q) =⟨ ap -_ (e ⁻¹) ⟩ - abs q ∎ l : - abs q ≤ q l = transport (_≤ q) IV (ℚ≤-refl q) r : q ≤ abs q r = transport (_≤ abs q) (IV ⁻¹) III ℚ≤-to-abs : (x y : ℚ) → (- y ≤ x) × (x ≤ y) → abs x ≤ y ℚ≤-to-abs x y (l₁ , l₂) = γ (ℚ-abs-inverse x) where α : - x ≤ - (- y) α = ℚ≤-swap (- y) x l₁ γ : (abs x = x) ∔ (abs x = - x) → abs x ≤ y γ (inl l) = transport (_≤ y) (l ⁻¹) l₂ γ (inr r) = transport₂ _≤_ (r ⁻¹) (ℚ-minus-minus y ⁻¹) α ℚ<-to-abs : (x y : ℚ) → (- y < x) × (x < y) → abs x < y ℚ<-to-abs x y (l₁ , l₂) = γ where I : - y ≤ x I = ℚ<-coarser-than-≤ (- y) x l₁ II : x ≤ y II = ℚ<-coarser-than-≤ x y l₂ III : abs x ≤ y III = ℚ≤-to-abs x y (I , II) IV : abs x < y → abs x < y IV = id V : abs x = y → abs x < y V e = 𝟘-elim (cases Vγ₁ Vγ₂ (ℚ-abs-inverse x)) where Vγ₁ : ¬ (abs x = x) Vγ₁ e' = ℚ<-irrefl x (transport (x <_) (e ⁻¹ ∙ e') l₂) Vγ₂ : ¬ (abs x = - x) Vγ₂ e' = ℚ<-irrefl x (transport (_< x) VI l₁) where VI : - y = x VI = - y =⟨ ap -_ (e ⁻¹) ⟩ - abs x =⟨ ap -_ e' ⟩ - (- x) =⟨ ℚ-minus-minus x ⁻¹ ⟩ x ∎ γ : abs x < y γ = cases IV V (ℚ≤-split (abs x) y III) ℚ-abs-<-unpack : (q ε : ℚ) → abs q < ε → (- ε < q) × (q < ε) ℚ-abs-<-unpack q ε o = cases γ₁ γ₂ (ℚ-abs-inverse q) where I : 0ℚ ≤ abs q I = ℚ-abs-is-positive q II : 0ℚ < ε II = ℚ≤-<-trans 0ℚ (abs q) ε I o III : - ε < 0ℚ III = ℚ<-swap 0ℚ ε II IV : - ε < abs q IV = ℚ<-≤-trans (- ε) 0ℚ (abs q) III I γ₁ : abs q = q → (- ε < q) × (q < ε) γ₁ e = l , r where l : - ε < q l = transport (- ε <_) e IV r : q < ε r = transport (_< ε) e o γ₂ : abs q = - q → (- ε < q) × (q < ε) γ₂ e = l , r where α : q = - abs q α = q =⟨ ℚ-minus-minus q ⟩ - (- q) =⟨ ap -_ (e ⁻¹) ⟩ - abs q ∎ l : - ε < q l = transport (- ε <_) (α ⁻¹) (ℚ<-swap (abs q) ε o) r : q < ε r = ℚ<-swap''' q ε (transport (- ε <_) e IV) ℚ-abs-≤-unpack : (q ε : ℚ) → abs q ≤ ε → (- ε ≤ q) × (q ≤ ε) ℚ-abs-≤-unpack q ε l' = cases γ₁ γ₂ (ℚ-abs-inverse q) where I : 0ℚ ≤ abs q I = ℚ-abs-is-positive q II : 0ℚ ≤ ε II = ℚ≤-trans 0ℚ (abs q) ε I l' III : - ε ≤ 0ℚ III = ℚ≤-swap 0ℚ ε II IV : - ε ≤ abs q IV = ℚ≤-trans (- ε) 0ℚ (abs q) III I γ₁ : abs q = q → (- ε ≤ q) × (q ≤ ε) γ₁ e = l , r where l : - ε ≤ q l = transport (- ε ≤_) e IV r : q ≤ ε r = transport (_≤ ε) e l' γ₂ : abs q = - q → (- ε ≤ q) × (q ≤ ε) γ₂ e = l , r where α : q = - abs q α = q =⟨ ℚ-minus-minus q ⟩ - (- q) =⟨ ap -_ (e ⁻¹) ⟩ - abs q ∎ l : - ε ≤ q l = transport (- ε ≤_) (α ⁻¹) (ℚ≤-swap (abs q) ε l') r : q ≤ ε r = ℚ≤-swap''' q ε (transport (- ε ≤_) e IV) ℚ-triangle-inequality : (x y : ℚ) → abs (x + y) ≤ abs x + abs y ℚ-triangle-inequality x y = ℚ≤-to-abs (x + y) (abs x + abs y) (γ I II) where I : - abs x ≤ x ≤ abs x I = ℚ-abs-≤ x II : - abs y ≤ y ≤ abs y II = ℚ-abs-≤ y γ : - abs x ≤ x ≤ abs x → - abs y ≤ y ≤ abs y → - (abs x + abs y) ≤ x + y ≤ abs x + abs y γ (l₁ , l₂) (l₃ , l₄) = (transport (_≤ x + y) IV III) , V where III : (- abs x) - abs y ≤ x + y III = ℚ≤-adding (- abs x) x (- abs y) y l₁ l₃ IV : (- abs x) - abs y = - (abs x + abs y) IV = ℚ-minus-dist (abs x) (abs y) V : x + y ≤ abs x + abs y V = ℚ≤-adding x (abs x) y (abs y) l₂ l₄ ℚ-triangle-inequality' : (x y z : ℚ) → abs (x - z) ≤ abs (x - y) + abs (y - z) ℚ-triangle-inequality' x y z = γ where I : x - z = x - y + (y - z) I = ℚ-add-zero x (- z) y II : abs (x - z) = abs (x - y + (y - z)) II = ap abs I III : abs (x - y + (y - z)) ≤ abs (x - y) + abs (y - z) III = ℚ-triangle-inequality (x - y) (y - z) γ : abs (x - z) ≤ abs (x - y) + abs (y - z) γ = transport (_≤ abs (x - y) + abs (y - z)) (II ⁻¹) III pos-abs-no-increase : (q ε : ℚ) → (0ℚ < q) × (q < ε) → abs q < ε pos-abs-no-increase q ε (l₁ , l₂) = γ where I : 0ℚ < ε I = ℚ<-trans 0ℚ q ε l₁ l₂ II : - ε < - 0ℚ II = ℚ<-swap 0ℚ ε I III : - ε < q III = ℚ<-trans (- ε) 0ℚ q II l₁ γ : abs q < ε γ = ℚ<-to-abs q ε (III , l₂) abs-mult : (x y : ℚ) → abs x * abs y = abs (x * y) abs-mult x y = γ (ℚ-dichotomous' x 0ℚ) (ℚ-dichotomous' y 0ℚ) where γ₁ : 0ℚ ≤ x → 0ℚ ≤ y → abs x * abs y = abs (x * y) γ₁ l₁ l₂ = abs x * abs y =⟨ ap (_* abs y) (abs-of-pos-is-pos x l₁) ⟩ x * abs y =⟨ ap (x *_) (abs-of-pos-is-pos y l₂) ⟩ x * y =⟨ abs-of-pos-is-pos (x * y) I ⁻¹ ⟩ abs (x * y) ∎ where I : 0ℚ ≤ x * y I = ℚ≤-pos-multiplication-preserves-order x y l₁ l₂ γ₂ : (0ℚ > x) → (0ℚ > y) → abs x * abs y = abs (x * y) γ₂ l₁ l₂ = VI where I : 0ℚ < - x I = ℚ<-swap'' x l₁ II : 0ℚ < - y II = ℚ<-swap'' y l₂ III : (- x) * (- y) = x * y III = (- x) * (- y) =⟨ ℚ-negation-dist-over-mult x (- y) ⟩ - x * (- y) =⟨ ap -_ (ℚ*-comm x (- y)) ⟩ - (- y) * x =⟨ ap -_ (ℚ-negation-dist-over-mult y x) ⟩ - (- y * x) =⟨ ℚ-minus-minus (y * x) ⁻¹ ⟩ y * x =⟨ ℚ*-comm y x ⟩ x * y ∎ IV : 0ℚ < (- x) * (- y) IV = ℚ<-pos-multiplication-preserves-order (- x) (- y) I II V : 0ℚ < x * y V = transport (0ℚ <_) III IV VI : abs x * abs y = abs (x * y) VI = abs x * abs y =⟨ ap (_* abs y) (ℚ-abs-neg-equals-pos x) ⟩ abs (- x) * abs y =⟨ ap (_* abs y) (abs-of-pos-is-pos' (- x) I) ⟩ (- x) * abs y =⟨ ap ((- x) *_) (ℚ-abs-neg-equals-pos y) ⟩ (- x) * abs (- y) =⟨ ap ((- x) *_) (abs-of-pos-is-pos' (- y) II) ⟩ (- x) * (- y) =⟨ III ⟩ x * y =⟨ abs-of-pos-is-pos' (x * y) V ⁻¹ ⟩ abs (x * y) ∎ γ₃ : (a b : ℚ) → 0ℚ ≤ a → b < 0ℚ → abs a * abs b = abs (a * b) γ₃ a b l₁ l₂ = abs a * abs b =⟨ ap (_* abs b) (abs-of-pos-is-pos a l₁) ⟩ a * abs b =⟨ ap (a *_) (ℚ-abs-neg-equals-pos b) ⟩ a * abs (- b) =⟨ ap (a *_) (abs-of-pos-is-pos' (- b) (ℚ<-swap'' b l₂)) ⟩ a * (- b) =⟨ ℚ*-comm a (- b) ⟩ (- b) * a =⟨ ℚ-negation-dist-over-mult b a ⟩ - b * a =⟨ ap -_ (ℚ*-comm b a) ⟩ - a * b =⟨ abs-of-pos-is-pos (- a * b) (ℚ≤-swap' (a * b) V) ⁻¹ ⟩ abs (- a * b) =⟨ ℚ-abs-neg-equals-pos (a * b) ⁻¹ ⟩ abs (a * b) ∎ where I : 0ℚ ≤ - b I = ℚ≤-swap' b (ℚ<-coarser-than-≤ b 0ℚ l₂) II : 0ℚ ≤ a * (- b) II = ℚ≤-pos-multiplication-preserves-order a (- b) l₁ I III : - (a * (- b)) ≤ - 0ℚ III = ℚ≤-swap 0ℚ (a * (- b)) II IV : - (a * (- b)) = a * b IV = - a * (- b) =⟨ ap -_ (ℚ*-comm a (- b)) ⟩ - (- b) * a =⟨ ap -_ (ℚ-negation-dist-over-mult b a) ⟩ - (- b * a) =⟨ ℚ-minus-minus (b * a) ⁻¹ ⟩ b * a =⟨ ℚ*-comm b a ⟩ a * b ∎ V : a * b ≤ 0ℚ V = transport₂ _≤_ IV ℚ-minus-zero-is-zero III γ₄ : x < 0ℚ → 0ℚ ≤ y → abs x * abs y = abs (x * y) γ₄ l₁ l₂ = abs x * abs y =⟨ ℚ*-comm (abs x) (abs y) ⟩ abs y * abs x =⟨ γ₃ y x l₂ l₁ ⟩ abs (y * x) =⟨ ap abs (ℚ*-comm y x) ⟩ abs (x * y) ∎ γ : x < 0ℚ ∔ 0ℚ ≤ x → y < 0ℚ ∔ 0ℚ ≤ y → abs x * abs y = abs (x * y) γ (inl l₁) (inl l₂) = γ₂ l₁ l₂ γ (inl l₁) (inr l₂) = γ₄ l₁ l₂ γ (inr l₁) (inl l₂) = γ₃ x y l₁ l₂ γ (inr l₁) (inr l₂) = γ₁ l₁ l₂ ℚ≤-abs-neg : (p : ℚ) → - abs p ≤ abs p ℚ≤-abs-neg p = γ (ℚ-abs-≤ p) where γ : - abs p ≤ p ≤ abs p → - abs p ≤ abs p γ (l₁ , l₂) = ℚ≤-trans (- abs p) p (abs p) l₁ l₂ ℚ≤-abs-all : (p : ℚ) → p ≤ abs p ℚ≤-abs-all p = pr₂ (ℚ-abs-≤ p) abs-comm : (p q : ℚ) → abs (p - q) = abs (q - p) abs-comm p q = γ where γ : abs (p - q) = abs (q - p) γ = abs (p - q) =⟨ ℚ-abs-neg-equals-pos (p - q) ⟩ abs (- (p - q)) =⟨ ap (λ z → abs (- z)) (ℚ+-comm p (- q)) ⟩ abs (- ((- q) + p)) =⟨ ap abs (ℚ-minus-dist (- q) p ⁻¹) ⟩ abs ((- (- q)) - p) =⟨ ap (λ z → abs (z - p)) (ℚ-minus-minus q ⁻¹) ⟩ abs (q - p) ∎ ℚ<-to-abs' : (p q : ℚ) → p < q → abs (p - q) = q - p ℚ<-to-abs' p q l = γ where I : 0ℚ < q - p I = ℚ<-difference-positive p q l γ : abs (p - q) = q - p γ = abs (p - q) =⟨ abs-comm p q ⟩ abs (q - p) =⟨ abs-of-pos-is-pos' (q - p) I ⟩ q - p ∎ ℚ≤-to-abs' : (p q : ℚ) → p ≤ q → abs (p - q) = q - p ℚ≤-to-abs' p q l = γ where I : 0ℚ ≤ q - p I = ℚ≤-difference-positive p q l γ : abs (p - q) = q - p γ = abs (p - q) =⟨ abs-comm p q ⟩ abs (q - p) =⟨ abs-of-pos-is-pos (q - p) I ⟩ q - p ∎ ℚ-abs-≤-pos : (p q : ℚ) → p ≤ q → 0ℚ < p → 0ℚ < q → abs p ≤ abs q ℚ-abs-≤-pos p q l 0<p 0<q = γ where I : p = abs p I = abs-of-pos-is-pos p (ℚ<-coarser-than-≤ 0ℚ p 0<p) ⁻¹ II : q = abs q II = abs-of-pos-is-pos q (ℚ<-coarser-than-≤ 0ℚ q 0<q) ⁻¹ γ : abs p ≤ abs q γ = transport₂ _≤_ I II l \end{code}