|
13 | 13 | module Data.Nat.Binary.Base where |
14 | 14 |
|
15 | 15 | open import Algebra.Core using (Op₂) |
| 16 | +import Data.Fin.Base as Fin |
16 | 17 | open import Data.Nat.Base as ℕ using (ℕ) |
| 18 | +open import Data.Nat.DivMod using (_divMod_; result) |
| 19 | +open import Data.Nat.Properties |
| 20 | +open import Data.Nat.Induction using (<-rec) |
| 21 | +open import Data.Product using (_,_) |
17 | 22 | open import Data.Sum.Base using (_⊎_) |
18 | | -open import Function.Base using (_on_) |
| 23 | +open import Function.Base using (case_of_; _on_; _$_) |
19 | 24 | open import Level using (0ℓ) |
20 | 25 | open import Relation.Binary.Core using (Rel) |
21 | | -open import Relation.Binary.PropositionalEquality using (_≡_) |
| 26 | +open import Relation.Binary.PropositionalEquality as ≡ using (_≡_) |
22 | 27 | open import Relation.Nullary using (¬_) |
23 | 28 |
|
24 | 29 | ------------------------------------------------------------------------ |
@@ -112,10 +117,29 @@ toℕ zero = 0 |
112 | 117 | toℕ 2[1+ x ] = 2 ℕ.* (ℕ.suc (toℕ x)) |
113 | 118 | toℕ 1+[2 x ] = ℕ.suc (2 ℕ.* (toℕ x)) |
114 | 119 |
|
115 | | --- Costs O(n), could be improved using `_/_` and `_%_` |
116 | 120 | fromℕ : ℕ → ℕᵇ |
117 | | -fromℕ 0 = zero |
118 | | -fromℕ (ℕ.suc n) = suc (fromℕ n) |
| 121 | +fromℕ = <-rec (λ _ → ℕᵇ) λ |
| 122 | + { ℕ.zero _ → zero |
| 123 | + ; (ℕ.suc n) p → case n divMod 2 of λ |
| 124 | + { (result q Fin.zero prop) → |
| 125 | + -- n is even so suc n is odd |
| 126 | + 1+[2 p q $ ℕ.s≤s $ begin |
| 127 | + q ≡˘⟨ *-identityʳ q ⟩ |
| 128 | + q ℕ.* 1 ≤⟨ *-monoʳ-≤ q (ℕ.s≤s ℕ.z≤n) ⟩ |
| 129 | + q ℕ.* 2 ≡˘⟨ prop ⟩ |
| 130 | + n ∎ |
| 131 | + ] |
| 132 | + ; (result q (Fin.suc Fin.zero) prop) → |
| 133 | + -- n is odd so suc n is even |
| 134 | + 2[1+ p q $ ℕ.s≤s $ begin |
| 135 | + q ≡˘⟨ *-identityʳ q ⟩ |
| 136 | + q ℕ.* 1 ≤⟨ *-monoʳ-≤ q (ℕ.s≤s ℕ.z≤n) ⟩ |
| 137 | + q ℕ.* 2 <⟨ ≤-reflexive (≡.sym prop) ⟩ |
| 138 | + n ∎ |
| 139 | + ] |
| 140 | + } |
| 141 | + } |
| 142 | + where open ≤-Reasoning |
119 | 143 |
|
120 | 144 | -- An alternative ordering lifted from ℕ |
121 | 145 |
|
|
0 commit comments