YLTANVG3K2CWRDK7IQMF7AQJT5FKOU4ROJAYHHDTILSK7ON5GWPAC ```
-- Because if one of the implicit arguments (`m` or `n`) is zero, it cannot be greater than anything else that's non-zero≤-antisym' : ∀ {m n : ℕ}→ m ≤ n→ n ≤ m-----→ m ≡ n≤-antisym' z≤n z≤n = refl≤-antisym' (s≤s m≤n) (s≤s n≤m) = cong suc (≤-antisym m≤n n≤m)-- The case for the constructor s≤s is impossible-- because unification ended with a conflicting equation-- suc n ≟ zero-- Possible solution: remove the clause, or use an absurd pattern ().-- when checking that the pattern s≤s n≤m has type n ≤ zero-- ≤-antisym' z≤n (s≤s n≤m) = ?-- ≤-antisym' (s≤s n≤m) z≤n = ?
*-monoʳ-≤ : ∀ (n p q : ℕ)→ p ≤ q→ n * p ≤ n * q*-monoʳ-≤ zero p q p≤q = z≤n-- Goal: p + n * p ≤ q + n * q*-monoʳ-≤ (suc n) p q p≤q =let n*p≤n*q = (*-monoʳ-≤ n p q p≤q) in+-mono-≤ p q (n * p) (n * q) p≤q n*p≤n*q*-monoˡ-≤ : ∀ (m n p : ℕ)→ m ≤ n→ m * p ≤ n * p*-monoˡ-≤ m n p m≤n rewrite *-comm m p | *-comm n p = *-monoʳ-≤ p m n m≤n*-mono-≤ : ∀ (m n p q : ℕ)→ m ≤ n→ p ≤ q→ m * p ≤ n * q*-mono-≤ m n p q m≤n p≤q = ≤-trans (*-monoˡ-≤ m n p m≤n) (*-monoʳ-≤ n p q p≤q)
infix 4 _>_-- NOTE: This does not work as it has incomplete cases-- _>_ : ∀ {m n : ℕ} → n < m-- _>_ {suc m} {zero} = z<s-- _>_ {suc m} {suc n} = s<s {n} {m} (_>_ {m} {n})-- NOTE: no relation to `_<_`data _>_ : ℕ → ℕ → Set wheres>z : ∀ {n : ℕ} → suc n > zeros>s : ∀ {m n : ℕ} → m > n → suc m > suc ndata Trichotomy (m n : ℕ) : Set whereforward : m > n → Trichotomy m nflipped : n > m → Trichotomy m nequal : m ≡ n → Trichotomy m n-- NOTE: relation to `_<_`, but seems complicated-- data _>_ : ∀ {m n : ℕ} {n<m : n < m} → Set where-- s>z : ∀ {m : ℕ} → _>_ {suc m} {zero} {z<s}-- s>s : ∀ {m n : ℕ} → (n<m : n < m) → _>_ {suc m} {suc n} {s<s n<m}-- data Trichotomy (m n : ℕ) : Set where-- forward : (n<m : n < m) → _>_ {m} {n} {n<m} → Trichotomy m n-- flipped : (m<n : m < n) → _>_ {n} {m} {m<n} → Trichotomy m n-- equal : m ≡ n → Trichotomy m n
+-monoʳ-< : ∀ (n p q : ℕ)→ p < q→ n + p < n + q+-monoʳ-< zero p q p<q = p<q+-monoʳ-< (suc n) p q p<q = s<s (+-monoʳ-< n p q p<q)+-monoˡ-< : ∀ (m n p : ℕ)→ m < n→ m + p < n + p+-monoˡ-< m n p m<n rewrite +-comm m p | +-comm n p = +-monoʳ-< p m n m<n+-mono-< : ∀ (m n p q : ℕ)→ m < n→ p < q→ m + p < n + q+-mono-< m n p q m<n p<q = <-trans (+-monoˡ-< m n p m<n) (+-monoʳ-< n p q p<q)
-- -- NOTE: This doesn't work!-- -- Case splitting on both m and n seemed to give me absurd cases like the one below.-- -- The choice of what to match on is very important-- suc-inv-mono-≤ : ∀ (m n : ℕ) → suc (suc m) ≤ suc n → suc m ≤ n-- suc-inv-mono-≤ zero zero suc-suc-≤-suc = {!!}-- suc-inv-mono-≤ zero (suc n) suc-suc-≤-suc = {!!}-- suc-inv-mono-≤ (suc m) n suc-suc-≤-suc = {!!}-- -- NOTE: This works, but it's unnecessary as we can match on the proof directly in ≤→<-- suc-inv-mono-≤ : ∀ (m n : ℕ) → suc (suc m) ≤ suc n → suc m ≤ n-- suc-inv-mono-≤ m n (s≤s x) = x≤→< : ∀ (m n : ℕ) → suc m ≤ n → m < n≤→< zero (suc n) suc-m≤n = z<s-- NOTE: This was a dead end - I only had to pattern match on the proof-- ≤→< (suc m) (suc n) suc-m≤n = s<s (≤→< m n (suc-inv-mono-≤ m n suc-m≤n))≤→< (suc m) (suc n) (s≤s suc-m≤n) = s<s (≤→< m n suc-m≤n)<→≤ : ∀ {m n : ℕ} → m < n → suc m ≤ n<→≤ z<s = s≤s z≤n<→≤ {suc m} {suc n} (s<s m<n) = s≤s (<→≤ m<n)
suc-suc≤→suc≤ : ∀ {m n : ℕ} → suc (suc m) ≤ n → suc m ≤ nsuc-suc≤→suc≤ {zero} {suc n} suc-suc≤ = s≤s z≤nsuc-suc≤→suc≤ {suc m} {suc n} (s≤s suc-suc≤) = s≤s (suc-suc≤→suc≤ suc-suc≤)<-trans-revisited : ∀ (m n p : ℕ)→ m < n→ n < p→ m < p<-trans-revisited m n p m<n n<p =let suc-suc≤ = (≤-trans (s≤s (<→≤ m<n)) (<→≤ n<p))in ≤→< _ _ (suc-suc≤→suc≤ suc-suc≤)
data Bin : Set where⟨⟩ : Bin_O : Bin → Bin_I : Bin → Bininc : Bin → Bininc ⟨⟩ = ⟨⟩ Iinc (rest O) = rest Iinc (rest I) = (inc rest) Oto : ℕ → Binto zero = ⟨⟩ Oto (suc n) = inc (to n)from : Bin → ℕfrom ⟨⟩ = 0from (rest O) = 2 * (from rest)from (rest I) = 1 + 2 * (from rest)-- Also need to show that inc is canonical as in `inc-can`data One : Bin -> Set whereone : One (⟨⟩ I)suc : ∀ {b : Bin} → One b → One (inc b)-- NOTE: Using a bin-law from Induction.lagda.mdfrom-inc-suc-from : ∀ (b : Bin) → from (inc b) ≡ suc (from b)from-inc-suc-from ⟨⟩ = reflfrom-inc-suc-from (b O) = reflfrom-inc-suc-from (b I) rewrite cong (\x → 2 * x) (from-inc-suc-from b) | *-comm 2 (1 + (from b)) | cong (\x → 2 + x) (*-comm (from b) 2) = refl1≤from-one : ∀ {b : Bin} → One b → 1 ≤ from b1≤from-one one = s≤s z≤n1≤from-one (suc {b} x) rewrite from-inc-suc-from b = s≤s z≤ndata Can : Bin → Set wherezeroᴮ : Can (⟨⟩ O)leading : ∀ {b : Bin} → One b → Can binc-can : ∀ {b : Bin} → Can b → Can (inc b)inc-can zeroᴮ = leading oneinc-can (leading x) = leading (suc x)to-can : (n : ℕ) → Can (to n)to-can zero = zeroᴮto-can (suc n) = inc-can (to-can n)