From e4da88b2be765de5c260a43803fa536b69cce3ab Mon Sep 17 00:00:00 2001 From: Felix Klein Date: Fri, 8 May 2026 14:22:52 +0200 Subject: [PATCH] Add more Data.Rational.Properties --- CHANGELOG.md | 11 +++ src/Data/Rational/Properties.agda | 139 +++++++++++++++++++++++++++++- 2 files changed, 149 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05c7eeeccd..531338c986 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -450,6 +450,17 @@ Additions to existing modules p*q≡0⇒p≡0∨q≡0 : p * q ≡ 0ℚ → p ≡ 0ℚ ⊎ q ≡ 0ℚ p*q≢0⇒p≢0 : p * q ≢ 0ℚ → p ≢ 0ℚ p*q≢0⇒q≢0 : p * q ≢ 0ℚ → q ≢ 0ℚ + ↥[i/1]≡i : (i : ℤ) → ↥ (i / 1) ≡ i + ↧ₙ[i/1]≡1 : (i : ℤ) → ↧ₙ (i / 1) ≡ 1 + n/n≡1 : ∀ (n : ℕ) .{{_ : ℕ.NonZero n}} → + n / n ≡ 1ℚ + -i/n≡-[i/n] : ∀ (i : ℤ) (n : ℕ) .{{_ : ℕ.NonZero n}} → + ℤ.- i / n ≡ - (i / n) + *-cancelˡ-/ : ∀ p {q r} .{{_ : ℕ.NonZero r}} .{{_ : ℕ.NonZero (p ℕ.* r)}} → + (+ p ℤ.* q) / (p ℕ.* r) ≡ q / r + *-cancelʳ-/ : ∀ p {q r} .{{_ : ℕ.NonZero r}} .{{_ : ℕ.NonZero (r ℕ.* p)}} → + (q ℤ.* + p) / (r ℕ.* p) ≡ q / r + i/n+j/n≡[i+j]/n : ∀ (i j : ℤ) (n : ℕ) .{{_ : ℕ.NonZero n }} → + i / n + j / n ≡ (i ℤ.+ j) / n ``` * In `Data.Rational.Show`: diff --git a/src/Data/Rational/Properties.agda b/src/Data/Rational/Properties.agda index 519caf712b..70ee39a53b 100644 --- a/src/Data/Rational/Properties.agda +++ b/src/Data/Rational/Properties.agda @@ -31,7 +31,7 @@ open import Data.Maybe.Base using (Maybe; just; nothing) open import Data.Integer.Base as ℤ using (ℤ; +_; -[1+_]; +[1+_]; +0; 0ℤ; 1ℤ; _◃_) open import Data.Integer.Coprimality using (coprime-divisor) import Data.Integer.Properties as ℤ -open import Data.Integer.GCD using (gcd; gcd[i,j]≡0⇒i≡0; gcd[i,j]≡0⇒j≡0) +open import Data.Integer.GCD using (gcd; gcd[i,j]≡0⇒i≡0; gcd[i,j]≡0⇒j≡0; gcd-zeroʳ) open import Data.Integer.Solver renaming (module +-*-Solver to ℤ-solver) open import Data.Nat.Base as ℕ using (ℕ; zero; suc) import Data.Nat.Properties as ℕ @@ -394,12 +394,51 @@ normalize-injective-≃ m n c d eq = ℕ./-cancelʳ-≡ ↥p/↧p≡p (mkℚ (+ n) d-1 prf) = normalize-coprime prf ↥p/↧p≡p (mkℚ -[1+ n ] d-1 prf) = cong (-_) (normalize-coprime prf) +↥[i/1]≡i : (i : ℤ) → ↥ (i / 1) ≡ i +↥[i/1]≡i i = begin + (↥ (i / 1)) ≡⟨ sym $ ℤ.*-identityʳ (↥ (i / 1)) ⟩ + (↥ (i / 1)) ℤ.* 1ℤ ≡⟨ cong (↥ (i / 1) ℤ.*_) $ sym $ gcd-zeroʳ i ⟩ + (↥ (i / 1)) ℤ.* gcd i 1ℤ ≡⟨ ↥-/ i 1 ⟩ + i ∎ + where open ≡-Reasoning + +↧ₙ[i/1]≡1 : (i : ℤ) → ↧ₙ (i / 1) ≡ 1 +↧ₙ[i/1]≡1 i = ℤ.+-injective $ begin + ↧ (i / 1) ≡⟨ sym $ ℤ.*-identityʳ (↧ (i / 1)) ⟩ + ↧ (i / 1) ℤ.* 1ℤ ≡⟨ cong (↧ (i / 1) ℤ.*_) $ sym $ gcd-zeroʳ i ⟩ + ↧ (i / 1) ℤ.* gcd i 1ℤ ≡⟨ ↧-/ i 1 ⟩ + 1ℤ ∎ + where open ≡-Reasoning + 0/n≡0 : ∀ n .{{_ : ℕ.NonZero n}} → 0ℤ / n ≡ 0ℚ 0/n≡0 n@(suc n-1) {{n≢0}} = mkℚ+-cong {{n/n≢0}} {c₂ = 0-cop-1} (ℕ.0/n≡0 (ℕ.gcd 0 n)) (ℕ.n/n≡1 n) where 0-cop-1 = C.sym (C.1-coprimeTo 0) n/n≢0 = ℕ.>-nonZero (subst (ℕ._> 0) (sym (ℕ.n/n≡1 n)) (ℕ.z