Andrew Sneap, November 2020 - March 2021 In this file I define rational numbers. \begin{code} {-# OPTIONS --safe --without-K #-} open import Integers.Multiplication renaming (_*_ to _ℤ*_) open import Integers.Negation open import Integers.Order open import Integers.Type open import MLTT.Spartan renaming (_+_ to _∔_) open import Naturals.HCF open import Naturals.Multiplication renaming (_*_ to _ℕ*_) open import Naturals.Properties open import Notation.CanonicalMap open import Rationals.Fractions open import TypeTopology.SigmaDiscreteAndTotallySeparated open import UF.DiscreteAndSeparated open import UF.Sets open import UF.Subsingletons module Rationals.Type where ℚ : 𝓤₀ ̇ ℚ = Σ q ꞉ 𝔽 , is-in-lowest-terms q ℚ⁴ = ℚ × ℚ × ℚ × ℚ is-in-lowest-terms-is-discrete : (q : 𝔽) → is-discrete (is-in-lowest-terms q) is-in-lowest-terms-is-discrete q α β = inl (is-in-lowest-terms-is-prop q α β) ℚ-is-discrete : is-discrete ℚ ℚ-is-discrete = Σ-is-discrete 𝔽-is-discrete is-in-lowest-terms-is-discrete ℚ-is-set : is-set ℚ ℚ-is-set = discrete-types-are-sets ℚ-is-discrete to𝔽 : ℚ → 𝔽 to𝔽 (q , _) = q toℚlemma : ((x , a) : 𝔽) → Σ ((x' , a') , p) ꞉ ℚ , (Σ h ꞉ ℕ , (x = (pos (succ h)) ℤ* x') × (succ a = (succ h) ℕ* succ a')) toℚlemma (pos a , b) = f (divbyhcf a (succ b)) where f : Σ h ꞉ ℕ , Σ x ꞉ ℕ , Σ y ꞉ ℕ , ((h ℕ* x = a) × (h ℕ* y = succ b)) × coprime x y → _ f (h , x , 0 , (γ₁ , γ₂) , r) = 𝟘-elim (positive-not-zero b (γ₂ ⁻¹)) f (0 , x , succ y , (γ₁ , γ₂) , r) = 𝟘-elim (positive-not-zero b γ) where γ : succ b = 0 γ = succ b =⟨ γ₂ ⁻¹ ⟩ 0 ℕ* succ y =⟨ zero-left-base (succ y) ⟩ 0 ∎ f (succ h , x , succ y , (γ₁ , γ₂) , r) = γ where I : pos a = pos (succ h) ℤ* pos x I = pos a =⟨ ap pos γ₁ ⁻¹ ⟩ pos (succ h ℕ* x) =⟨ pos-multiplication-equiv-to-ℕ (succ h) x ⁻¹ ⟩ pos (succ h) ℤ* pos x ∎ γ : _ γ = ((pos x , y) , coprime-to-coprime' x (succ y) r) , h , I , (γ₂ ⁻¹) toℚlemma (negsucc a , b) = f (divbyhcf (succ a) (succ b)) where f : (Σ h ꞉ ℕ , Σ x ꞉ ℕ , Σ y ꞉ ℕ , ((h ℕ* x = (succ a)) × (h ℕ* y = succ b)) × coprime x y) → _ f (h , x , 0 , (γ₁ , γ₂) , r) = 𝟘-elim (positive-not-zero b (γ₂ ⁻¹)) f (h , 0 , succ y , (γ₁ , γ₂) , r) = 𝟘-elim (positive-not-zero a (γ₁ ⁻¹)) f (0 , succ x , succ y , (γ₁ , γ₂) , r) = 𝟘-elim (positive-not-zero b γ) where γ : succ b = 0 γ = succ b =⟨ γ₂ ⁻¹ ⟩ 0 ℕ* succ y =⟨ zero-left-base (succ y) ⟩ 0 ∎ f (succ h , succ x , succ y , (γ₁ , γ₂) , r) = γ where I : pos (succ a) = (pos (succ h) ℤ* pos (succ x)) I = pos (succ a) =⟨ ap pos γ₁ ⁻¹ ⟩ pos (succ h ℕ* succ x) =⟨ i ⟩ pos (succ h) ℤ* pos (succ x) ∎ where i = pos-multiplication-equiv-to-ℕ (succ h) (succ x) ⁻¹ II : negsucc a = pos (succ h) ℤ* negsucc x II = negsucc a =⟨ ap -_ I ⟩ - (pos (succ h) ℤ* pos (succ x)) =⟨ i ⟩ pos (succ h) ℤ* (- pos (succ x)) ∎ where i = negation-dist-over-mult (pos (succ h)) (pos (succ x)) ⁻¹ q : ℚ q = (negsucc x , y) , coprime-to-coprime' (succ x) (succ y) r γ : _ γ = q , h , II , (γ₂ ⁻¹) toℚ : 𝔽 → ℚ toℚ q = pr₁ (toℚlemma q) numℚ : 𝔽 → ℤ numℚ q = (pr₁ ∘ pr₁ ∘ pr₁) (toℚlemma q) dnomℚ : 𝔽 → ℕ dnomℚ q = (pr₂ ∘ pr₁ ∘ pr₁) (toℚlemma q) hcf𝔽 : 𝔽 → ℕ hcf𝔽 q = pr₁ (pr₂ (toℚlemma q)) iltℚ : (q : 𝔽) → is-in-lowest-terms (numℚ q , dnomℚ q) iltℚ (x , a) = (pr₂ ∘ pr₁) (toℚlemma (x , a)) numr : ((x , a) : 𝔽) → x = (pos (succ (hcf𝔽 (x , a)))) ℤ* numℚ (x , a) numr (x , a) = pr₁ (pr₂ (pr₂ (toℚlemma (x , a)))) dnomr : ((x , a) : 𝔽) → succ a = succ (hcf𝔽 (x , a)) ℕ* succ (dnomℚ (x , a)) dnomr (x , a) = pr₂ (pr₂ (pr₂ (toℚlemma (x , a)))) dnomrP : ((x , a) : 𝔽) → pos (succ a) = pos (succ (hcf𝔽 (x , a)) ℕ* succ (dnomℚ (x , a))) dnomrP (x , a) = ap pos (dnomr (x , a)) dnomrP' : ((x , a) : 𝔽) → pos (succ a) = pos (succ (hcf𝔽 (x , a))) ℤ* pos (succ (dnomℚ (x , a))) dnomrP' (x , a) = γ where h = hcf𝔽 (x , a) a' = dnomℚ (x , a) γ : pos (succ a) = pos (succ h) ℤ* pos (succ a') γ = pos (succ a) =⟨ i ⟩ pos (succ h ℕ* succ a') =⟨ ii ⟩ pos (succ h) ℤ* pos (succ a') ∎ where i = dnomrP (x , a) ii = pos-multiplication-equiv-to-ℕ (succ h) (succ a') ⁻¹ 0ℚ 1ℚ -1ℚ 1/3 2/3 1/2 1/5 2/5 3/5 1/4 3/4 : ℚ -1ℚ = toℚ (negsucc 0 , 0) 0ℚ = toℚ (pos 0 , 0) 1ℚ = toℚ (pos 1 , 0) 1/3 = toℚ (pos 1 , 2) 2/3 = toℚ (pos 2 , 2) 1/2 = toℚ (pos 1 , 1) 1/5 = toℚ (pos 1 , 4) 2/5 = toℚ (pos 2 , 4) 3/5 = toℚ (pos 3 , 4) 4/5 = toℚ (pos 4 , 4) 1/4 = toℚ (pos 1 , 3) 3/4 = toℚ (pos 3 , 3) equiv-equality : (p q : 𝔽) → p ≈ q ↔ toℚ p = toℚ q equiv-equality (x , a) (y , b) = γ₁ , γ₂ where a' b' h h' : ℕ a' = dnomℚ (x , a) b' = dnomℚ (y , b) h = hcf𝔽 (x , a) h' = hcf𝔽 (y , b) x' y' ph ph' pa' pb' : ℤ x' = numℚ (x , a) y' = numℚ (y , b) ph = (pos ∘ succ) h ph' = (pos ∘ succ) h' pa = (pos ∘ succ) a pa' = (pos ∘ succ) a' pb = (pos ∘ succ) b pb' = (pos ∘ succ) b' γ-lemma : (p q r s : ℤ) → p ℤ* q ℤ* (r ℤ* s) = p ℤ* r ℤ* (q ℤ* s) γ-lemma p q r s = p ℤ* q ℤ* (r ℤ* s) =⟨ ℤ*-assoc p q (r ℤ* s) ⟩ p ℤ* (q ℤ* (r ℤ* s)) =⟨ ap (p ℤ*_) (ℤ*-assoc q r s ⁻¹) ⟩ p ℤ* (q ℤ* r ℤ* s) =⟨ ap (λ - → p ℤ* (- ℤ* s)) (ℤ*-comm q r) ⟩ p ℤ* (r ℤ* q ℤ* s) =⟨ ap (p ℤ*_) (ℤ*-assoc r q s) ⟩ p ℤ* (r ℤ* (q ℤ* s)) =⟨ ℤ*-assoc p r (q ℤ* s) ⁻¹ ⟩ p ℤ* r ℤ* (q ℤ* s) ∎ γ₁ : (x , a) ≈ (y , b) → toℚ (x , a) = toℚ (y , b) γ₁ e = to-subtype-= is-in-lowest-terms-is-prop γ where I : is-in-lowest-terms (x' , a') I = iltℚ (x , a) II : is-in-lowest-terms (y' , b') II = iltℚ (y , b) III : ph ℤ* ph' ℤ* (x' ℤ* pb') = ph ℤ* ph' ℤ* (y' ℤ* pa') III = ph ℤ* ph' ℤ* (x' ℤ* pb') =⟨ γ-lemma ph ph' x' pb' ⟩ ph ℤ* x' ℤ* (ph' ℤ* pb') =⟨ ap (ph ℤ* x' ℤ*_) (dnomrP' (y , b) ⁻¹) ⟩ ph ℤ* x' ℤ* pb =⟨ ap (_ℤ* pb) (numr (x , a) ⁻¹) ⟩ x ℤ* pb =⟨ e ⟩ y ℤ* pa =⟨ ap (_ℤ* pa) (numr (y , b)) ⟩ ph' ℤ* y' ℤ* pa =⟨ ap (ph' ℤ* y' ℤ*_) (dnomrP' (x , a)) ⟩ ph' ℤ* y' ℤ* (ph ℤ* pa') =⟨ γ-lemma ph' ph y' pa' ⁻¹ ⟩ ph' ℤ* ph ℤ* (y' ℤ* pa') =⟨ ap (_ℤ* (y' ℤ* pa')) (ℤ*-comm ph' ph) ⟩ ph ℤ* ph' ℤ* (y' ℤ* pa') ∎ IV : not-zero (ph ℤ* ph') IV iz = non-zero-multiplication ph ph' hnz hnz' piz where hnz : ph ≠ pos 0 hnz = pos-succ-not-zero h hnz' : ph' ≠ pos 0 hnz' = pos-succ-not-zero h' piz : ph ℤ* ph' = pos 0 piz = from-is-zero (ph ℤ* ph') iz V : x' ℤ* pb' = y' ℤ* pa' V = ℤ-mult-left-cancellable (x' ℤ* pb') (y' ℤ* pa') (ph ℤ* ph') IV III γ : (x' , a') = (y' , b') γ = equiv-with-lowest-terms-is-equal (x' , a') (y' , b') V I II γ₂ : toℚ (x , a) = toℚ (y , b) → (x , a) ≈ (y , b) γ₂ e = x ℤ* pos (succ b) =⟨ ap (x ℤ*_) (dnomrP' (y , b)) ⟩ x ℤ* (ph' ℤ* pb') =⟨ ap (_ℤ* (ph' ℤ* pb')) (numr (x , a)) ⟩ ph ℤ* x' ℤ* (ph' ℤ* pb') =⟨ γ-lemma ph x' ph' pb' ⟩ ph ℤ* ph' ℤ* (x' ℤ* pb') =⟨ ap (_ℤ* (x' ℤ* pb')) (ℤ*-comm ph ph') ⟩ ph' ℤ* ph ℤ* (x' ℤ* pb') =⟨ ap (λ - → ph' ℤ* ph ℤ* (- ℤ* pb')) I ⟩ ph' ℤ* ph ℤ* (y' ℤ* pb') =⟨ ap (λ - → ph' ℤ* ph ℤ* (y' ℤ* -) ) II ⟩ ph' ℤ* ph ℤ* (y' ℤ* pa') =⟨ γ-lemma ph' y' ph pa' ⁻¹ ⟩ ph' ℤ* y' ℤ* (ph ℤ* pa') =⟨ ap (_ℤ* (ph ℤ* pa')) (numr (y , b) ⁻¹) ⟩ y ℤ* (ph ℤ* pa') =⟨ ap (y ℤ*_) (dnomrP' (x , a) ⁻¹) ⟩ y ℤ* pos (succ a) ∎ where I : x' = y' I = ap (pr₁ ∘ pr₁) e II : pb' = pa' II = ap (pos ∘ succ ∘ pr₂ ∘ pr₁) (e ⁻¹) equiv→equality : (p q : 𝔽) → p ≈ q → toℚ p = toℚ q equiv→equality p q = pr₁ (equiv-equality p q) equality→equiv : (p q : 𝔽) → toℚ p = toℚ q → p ≈ q equality→equiv p q = pr₂ (equiv-equality p q) toℚ-to𝔽 : ((p , α) : ℚ) → (p , α) = toℚ p toℚ-to𝔽 ((x , a) , α) = to-subtype-= is-in-lowest-terms-is-prop γ 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 I : coprime (abs x) (succ a) I = coprime'-to-coprime (abs x) (succ a) α II : (x , a) ≈ (x' , a') II = x ℤ* pa' =⟨ ap (_ℤ* pa') (numr (x , a)) ⟩ ph ℤ* x' ℤ* pa' =⟨ ap (_ℤ* pa') (ℤ*-comm ph x') ⟩ x' ℤ* ph ℤ* pa' =⟨ ℤ*-assoc x' ph pa' ⟩ x' ℤ* (ph ℤ* pa') =⟨ ap (x' ℤ*_) (dnomrP' (x , a) ⁻¹) ⟩ x' ℤ* pa ∎ γ : (x , a) = (x' , a') γ = equiv-with-lowest-terms-is-equal (x , a) (x' , a') II α (iltℚ (x , a)) ℚ-= : ((p , α) (q , β) : ℚ) → p ≈ q → (p , α) = (q , β) ℚ-= (p , α) (q , β) e = to-subtype-= is-in-lowest-terms-is-prop I where I : p = q I = equiv-with-lowest-terms-is-equal p q e α β ≈-toℚ : (p : 𝔽) → p ≈ to𝔽 (toℚ p) ≈-toℚ p = equality→equiv p p' (toℚ-to𝔽 (toℚ p)) where p' = to𝔽 (toℚ p) q-has-qn : (q : ℚ) → Σ q' ꞉ 𝔽 , q = toℚ q' q-has-qn (q , α) = q , toℚ-to𝔽 (q , α) ℚ-zero-not-one : ¬ (0ℚ = 1ℚ) ℚ-zero-not-one e = positive-not-zero 0 (pos-lc γ ⁻¹) where I : toℚ (pos 0 , 0) = toℚ (pos 1 , 0) → (pos 0 , 0) ≈ (pos 1 , 0) I = equality→equiv (pos 0 , 0) (pos 1 , 0) γ : pos 0 = pos 1 γ = pos 0 =⟨ refl ⟩ pos 0 ℤ* pos 1 =⟨ I e ⟩ pos 1 ℤ* pos 1 =⟨ refl ⟩ pos 1 ∎ ℚ-positive-not-zero : (x a : ℕ) → ¬ (toℚ (pos (succ x) , a) = 0ℚ) ℚ-positive-not-zero x a e = pos-succ-not-zero x γ where I : (pos (succ x) , a) ≈ (pos 0 , 0) I = equality→equiv (pos (succ x) , a) (pos 0 , 0) e γ : pos (succ x) = pos 0 γ = pos (succ x) =⟨ by-definition ⟩ pos (succ x) ℤ* (pos 1) =⟨ I ⟩ pos 0 ℤ* pos (succ a) =⟨ ℤ-zero-left-base (pos (succ a)) ⟩ pos 0 ∎ ℚ-negative-not-zero : (x a : ℕ) → ¬ (toℚ (negsucc x , a) = 0ℚ) ℚ-negative-not-zero x a e = negsucc-not-zero x γ where I : (negsucc x , a) ≈ (pos 0 , 0) I = equality→equiv (negsucc x , a) (pos 0 , 0) e γ : negsucc x = pos 0 γ = negsucc x =⟨ refl ⟩ negsucc x ℤ* pos 1 =⟨ I ⟩ pos 0 ℤ* pos (succ a) =⟨ ℤ-zero-left-base (pos (succ a)) ⟩ pos 0 ∎ numerator-zero-is-zero : (((x , a) , p) : ℚ) → x = pos 0 → (x , a) , p = 0ℚ numerator-zero-is-zero ((negsucc x , a) , p) e = 𝟘-elim (negsucc-not-pos e) numerator-zero-is-zero ((pos (succ x) , a) , p) e = 𝟘-elim γ where γ : 𝟘 γ = positive-not-zero x (pos-lc e) numerator-zero-is-zero ((pos 0 , a) , p) e = γ where I : (pos 0 , a) ≈ (pos 0 , 0) I = pos 0 ℤ* pos 1 =⟨ refl ⟩ pos 0 =⟨ ℤ-zero-left-base (pos (succ a)) ⁻¹ ⟩ pos 0 ℤ* pos (succ a) ∎ γ : (pos 0 , a) , p = 0ℚ γ = (pos 0 , a) , p =⟨ toℚ-to𝔽 ((pos 0 , a) , p) ⟩ toℚ (pos 0 , a) =⟨ equiv→equality (pos 0 , a) (pos 0 , 0) I ⟩ toℚ (pos 0 , 0) =⟨ refl ⟩ 0ℚ ∎ instance canonical-map-𝔽-to-ℚ : Canonical-Map 𝔽 ℚ ι {{canonical-map-𝔽-to-ℚ}} = toℚ ℤ-to-ℚ : ℤ → ℚ ℤ-to-ℚ z = ι (ι z) instance canonical-map-ℤ-to-ℚ : Canonical-Map ℤ ℚ ι {{canonical-map-ℤ-to-ℚ}} = ℤ-to-ℚ ℕ-to-ℚ : ℕ → ℚ ℕ-to-ℚ n = ι {{ canonical-map-ℤ-to-ℚ }} (ι n) instance canonical-map-ℕ-to-ℚ : Canonical-Map ℕ ℚ ι {{canonical-map-ℕ-to-ℚ}} = ℕ-to-ℚ \end{code}