{-# OPTIONS --cubical --safe #-} module Data.Nat.WellFounded where open import Prelude open import Data.Nat open import WellFounded infix 4 _≤_ _<_ data _≤_ (n : ℕ) : ℕ → Type where n≤n : n ≤ n n≤s : ∀ {m} → n ≤ m → n ≤ suc m _<_ : ℕ → ℕ → Type n < m = suc n ≤ m ≤-wellFounded : WellFounded _<_ ≤-wellFounded = acc ∘ go where go : ∀ n m → m < n → Acc _<_ m go (suc n) .n n≤n = acc (go n) go (suc n) m (n≤s m<n) = go n m m<n open import Data.Nat.DivMod open import Agda.Builtin.Nat using (div-helper) import Data.Nat.Properties as ℕ private module ComputingSubstOnℕ where infix 4 _≡ℕ_ _≡ℕ_ : ℕ → ℕ → Type n ≡ℕ m = T (n ℕ.Eqℕ.≡ᴮ m) substℕ : ∀ (P : ℕ → Type) {n m} → n ≡ℕ m → P n → P m substℕ P {zero} {zero } p = id substℕ P {suc n} {suc m} p = substℕ (P ∘ suc) p +0ℕ : ∀ n → n + zero ≡ℕ n +0ℕ zero = tt +0ℕ (suc n) = +0ℕ n +sucℕ : ∀ n m → n + suc m ≡ℕ suc (n + m) +sucℕ zero zero = tt +sucℕ zero (suc n) = +sucℕ zero n +sucℕ (suc n) m = +sucℕ n m open ComputingSubstOnℕ div2≤ : ∀ n → n ÷ 2 ≤ n div2≤ n = substℕ (n ÷ 2 ≤_) (+0ℕ n) (go zero n) where go : ∀ k n → div-helper k 1 n 1 ≤ n + k go k zero = n≤n go k (suc zero) = n≤s n≤n go k (suc (suc n)) = n≤s (substℕ (div-helper (suc k) 1 n 1 ≤_) (+sucℕ n k) (go (suc k) n)) s≤s : ∀ {n m} → n ≤ m → suc n ≤ suc m s≤s n≤n = n≤n s≤s (n≤s x) = n≤s (s≤s x)