From 0ce9b202231e6fa41d40fbbbfe247ff54a8e5d63 Mon Sep 17 00:00:00 2001 From: Lorenzo Molena Date: Sun, 31 May 2026 08:12:14 +0200 Subject: [PATCH 1/2] =?UTF-8?q?add=20module=20`Nat/Logarithm`=20and=20miss?= =?UTF-8?q?ing=20properties=20in=20`Nat/Order`,=20`Nat/Mod`=20;=20move=20`?= =?UTF-8?q?=E2=89=A4-=C2=B7sk-cancel`=20and=20`<-=C2=B7sk-cancel`=20from?= =?UTF-8?q?=20`Fin/Properties`=20to=20`Nat/Order`,=20giving=20shorter=20in?= =?UTF-8?q?ductive=20proofs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cubical/Data/Fin/Properties.agda | 33 ------- Cubical/Data/Nat/Logarithm.agda | 157 +++++++++++++++++++++++++++++++ Cubical/Data/Nat/Mod.agda | 68 +++++++++++++ Cubical/Data/Nat/Order.agda | 53 +++++++++++ 4 files changed, 278 insertions(+), 33 deletions(-) create mode 100644 Cubical/Data/Nat/Logarithm.agda diff --git a/Cubical/Data/Fin/Properties.agda b/Cubical/Data/Fin/Properties.agda index e00938396b..6746529c2f 100644 --- a/Cubical/Data/Fin/Properties.agda +++ b/Cubical/Data/Fin/Properties.agda @@ -440,39 +440,6 @@ Fin-inj n m p with n ≟ m ... | lt nm = Empty.rec (Fin-inj′ n>m p) -≤-·sk-cancel : ∀ {m} {k} {n} → m · suc k ≤ n · suc k → m ≤ n -≤-·sk-cancel {m} {k} {n} (d , p) = o , inj-·sm {m = k} goal where - r = d % suc k - o = d / suc k - resn·k : Residue (suc k) (n · suc k) - resn·k = ((r , n%sk<ᵗsk d k) , (o + m)) , reason where - reason = expand× ((r , n%sk<ᵗsk d k) , o + m) ≡⟨ expand≡ (suc k) r (o + m) ⟩ - (o + m) · suc k + r ≡[ i ]⟨ +-comm (·-distribʳ o m (suc k) (~ i)) r i ⟩ - r + (o · suc k + m · suc k) ≡⟨ +-assoc r (o · suc k) (m · suc k) ⟩ - (r + o · suc k) + m · suc k ≡⟨ cong (_+ m · suc k) (+-comm r (o · suc k) ∙ moddiv d (suc k)) ⟩ - d + m · suc k ≡⟨ p ⟩ - n · suc k ∎ - - residuek·n : ∀ k n → (r : Residue (suc k) (n · suc k)) → ((fzero , n) , expand≡ (suc k) 0 n ∙ +-zero _) ≡ r - residuek·n _ _ = isContr→isProp isContrResidue _ - - r≡0 : r ≡ 0 - r≡0 = cong (toℕ {suc k} ∘ extract) (sym (residuek·n k n resn·k)) - d≡o·sk : d ≡ o · suc k - d≡o·sk = sym (moddiv d (suc k)) ∙∙ cong (o · suc k +_) r≡0 ∙∙ +-zero _ - goal : (o + m) · suc k ≡ n · suc k - goal = sym (·-distribʳ o m (suc k)) ∙∙ cong (_+ m · suc k) (sym d≡o·sk) ∙∙ p - -<-·sk-cancel : ∀ {m} {k} {n} → m · suc k < n · suc k → m < n -<-·sk-cancel {m} {k} {n} p = goal where - ≤-helper : m ≤ n - ≤-helper = ≤-·sk-cancel (pred-≤-pred (<≤-trans p (≤-suc ≤-refl))) - goal : m < n - goal = case <-split (suc-≤-suc ≤-helper) of λ - { (inl g) → g - ; (inr e) → Empty.rec (¬ml₁) → ⊥.rec (lemmaIsPropLogℕ l₁) } + +module LogTheory (logℕ : ∀ m n → Logℕ (suc (suc m)) (suc n)) where + + log : (b : ℕ) → {2 ≤ᵗ b} → (x : ℕ) → {1 ≤ᵗ x} → ℕ + log (suc (suc m)) (suc n) = Logℕ.log (logℕ m n) + + module _ (m : ℕ) where + private + b = suc (suc m) + b-1 = suc m + + logℕBase^ : ∀ n → Logℕ b (b ^ n) + logℕBase^ n .Logℕ.log = n + logℕBase^ n .Logℕ.^log≤ = ≤-refl + logℕBase^ n .Logℕ.<^1+log = <-ssk^ {m = n} <-suc + + logℕBase· : ∀ n → Logℕ b (b · suc n) + logℕBase· n .Logℕ.log = suc (log b (suc n)) + logℕBase· n .Logℕ.^log≤ = ≤-k· {k = b} (Logℕ.^log≤ (logℕ m n)) + logℕBase· n .Logℕ.<^1+log = <-sk· {k = suc m} (Logℕ.<^1+log (logℕ m n)) + + logℕ1 : Logℕ b 1 + logℕ1 .Logℕ.log = 0 + logℕ1 .Logℕ.^log≤ = ≤-refl + logℕ1 .Logℕ.<^1+log = suc-≤-suc zero- Date: Mon, 1 Jun 2026 17:19:11 +0200 Subject: [PATCH 2/2] =?UTF-8?q?rewrite=20`isPropLog=E2=84=95`=20using=20wi?= =?UTF-8?q?th-abstraction=20rather=20than=20`case=5Freturn=5Fof=5F`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cubical/Data/Nat/Logarithm.agda | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/Cubical/Data/Nat/Logarithm.agda b/Cubical/Data/Nat/Logarithm.agda index fd9e4f5d02..2831a849c9 100644 --- a/Cubical/Data/Nat/Logarithm.agda +++ b/Cubical/Data/Nat/Logarithm.agda @@ -43,13 +43,12 @@ private in ¬ml₁) → ⊥.rec (lemmaIsPropLogℕ l₁) } +isPropLogℕ m x = isOfHLevelRetractFromIso 1 LogℕIsoΣ proof where + proof : isProp (Σ[ l ∈ ℕ ] ((suc m) ^ l ≤ x) × (x < (suc m) ^ suc l)) + proof (l₀ , b^l₀≤ , l₁ = ⊥.rec (lemmaIsPropLogℕ l₁) module LogTheory (logℕ : ∀ m n → Logℕ (suc (suc m)) (suc n)) where