@@ -8,23 +8,17 @@ module Data.Bin where
8
8
9
9
open import Data.Nat as Nat
10
10
using (ℕ; zero; z≤n; s≤s) renaming (suc to 1+_)
11
- import Data.Nat.Properties as NP
12
- open NP.≤-Reasoning
13
11
open import Data.Digit
14
12
open import Data.Fin as Fin using (Fin; zero) renaming (suc to 1+_)
15
13
open import Data.Fin.Properties as FP using (_+′_)
16
14
open import Data.List.Base as List hiding (downFrom)
17
15
open import Function
18
- open import Data.Product
19
- open import Algebra
16
+ open import Data.Product using (uncurry; _,_; _×_)
20
17
open import Relation.Binary
21
- open import Relation.Binary.Consequences
22
- open import Relation.Binary.PropositionalEquality as PropEq
18
+ open import Relation.Binary.PropositionalEquality
23
19
using (_≡_; _≢_; refl; sym)
24
20
open import Relation.Nullary
25
21
open import Relation.Nullary.Decidable
26
- private
27
- module BitOrd = StrictTotalOrder (FP.strictTotalOrder 2 )
28
22
29
23
------------------------------------------------------------------------
30
24
-- The type
@@ -93,110 +87,15 @@ fromℕ : ℕ → Bin
93
87
fromℕ n = fromBits $ ntoBits n
94
88
95
89
------------------------------------------------------------------------
96
- -- (Bin, _≡_, _<_) is a strict total order
90
+ -- Order relation.
97
91
98
- infix 4 _<_
92
+ -- Wrapped so that the parameters can be inferred.
99
93
100
- -- Order relation. Wrapped so that the parameters can be inferred.
94
+ infix 4 _<_
101
95
102
96
data _<_ (b₁ b₂ : Bin) : Set where
103
97
less : (lt : (Nat._<_ on toℕ) b₁ b₂) → b₁ < b₂
104
98
105
- private
106
- <-trans : Transitive _<_
107
- <-trans (less lt₁) (less lt₂) = less (NP.<-trans lt₁ lt₂)
108
-
109
- asym : ∀ {b₁ b₂} → b₁ < b₂ → ¬ b₂ < b₁
110
- asym {b₁} {b₂} (less lt) (less gt) = tri⟶asym cmp lt gt
111
- where cmp = StrictTotalOrder.compare NP.strictTotalOrder
112
-
113
- irr : ∀ {b₁ b₂} → b₁ < b₂ → b₁ ≢ b₂
114
- irr lt eq = asym⟶irr (PropEq.resp₂ _<_) sym asym eq lt
115
-
116
- irr′ : ∀ {b} → ¬ b < b
117
- irr′ lt = irr lt refl
118
-
119
- ∷∙ : ∀ {b₁ b₂ bs₁ bs₂} →
120
- bs₁ 1# < bs₂ 1# → (b₁ ∷ bs₁) 1# < (b₂ ∷ bs₂) 1#
121
- ∷∙ {b₁} {b₂} {bs₁} {bs₂} (less lt) = less (begin
122
- 1 + (m₁ + n₁ * 2 ) ≤⟨ +-mono-≤ (≤-refl {x = 1 })
123
- (+-mono-≤ (≤-pred (FP.bounded b₁)) ≤-refl) ⟩
124
- 1 + (1 + n₁ * 2 ) ≡⟨ refl ⟩
125
- suc n₁ * 2 ≤⟨ *-mono-≤ lt ≤-refl ⟩
126
- n₂ * 2 ≤⟨ n≤m+n m₂ (n₂ * 2 ) ⟩
127
- m₂ + n₂ * 2 ∎
128
- )
129
- where
130
- open Nat ; open NP
131
- m₁ = Fin.toℕ b₁; m₂ = Fin.toℕ b₂
132
- n₁ = toℕ (bs₁ 1#); n₂ = toℕ (bs₂ 1#)
133
-
134
- ∙∷ : ∀ {b₁ b₂ bs} →
135
- Fin._<_ b₁ b₂ → (b₁ ∷ bs) 1# < (b₂ ∷ bs) 1#
136
- ∙∷ {b₁} {b₂} {bs} lt = less (begin
137
- 1 + (m₁ + n * 2 ) ≡⟨ sym (+-assoc 1 m₁ (n * 2 )) ⟩
138
- (1 + m₁) + n * 2 ≤⟨ +-mono-≤ lt ≤-refl ⟩
139
- m₂ + n * 2 ∎)
140
- where
141
- open Nat ; open NP
142
- m₁ = Fin.toℕ b₁; m₂ = Fin.toℕ b₂; n = toℕ (bs 1#)
143
-
144
- 1<[23] : ∀ {b} → [] 1# < (b ∷ []) 1#
145
- 1<[23] {b} = less (NP.n≤m+n (Fin.toℕ b) 2 )
146
-
147
- 1<2+ : ∀ {bs b} → [] 1# < (b ∷ bs) 1#
148
- 1<2+ {[]} = 1<[23]
149
- 1<2+ {b ∷ bs} = <-trans 1<[23] (∷∙ {b₁ = b} (1<2+ {bs}))
150
-
151
- 0<1 : 0# < [] 1#
152
- 0<1 = less (s≤s z≤n)
153
-
154
- 0<+ : ∀ {bs} → 0# < bs 1#
155
- 0<+ {[]} = 0<1
156
- 0<+ {b ∷ bs} = <-trans 0<1 1<2+
157
-
158
- compare⁺ : Trichotomous (_≡_ on _1#) (_<_ on _1#)
159
- compare⁺ [] [] = tri≈ irr′ refl irr′
160
- compare⁺ [] (b ∷ bs) = tri< 1<2+ (irr 1<2+) (asym 1<2+)
161
- compare⁺ (b ∷ bs) [] = tri> (asym 1<2+) (irr 1<2+ ∘ sym) 1<2+
162
- compare⁺ (b₁ ∷ bs₁) (b₂ ∷ bs₂) with compare⁺ bs₁ bs₂
163
- ... | tri< lt ¬eq ¬gt = tri< (∷∙ lt) (irr (∷∙ lt)) (asym (∷∙ lt))
164
- ... | tri> ¬lt ¬eq gt = tri> (asym (∷∙ gt)) (irr (∷∙ gt) ∘ sym) (∷∙ gt)
165
- compare⁺ (b₁ ∷ bs) (b₂ ∷ .bs) | tri≈ ¬lt refl ¬gt with BitOrd.compare b₁ b₂
166
- compare⁺ (b ∷ bs) (.b ∷ .bs) | tri≈ ¬lt refl ¬gt | tri≈ ¬lt′ refl ¬gt′ =
167
- tri≈ irr′ refl irr′
168
- ... | tri< lt′ ¬eq ¬gt′ = tri< (∙∷ lt′) (irr (∙∷ lt′)) (asym (∙∷ lt′))
169
- ... | tri> ¬lt′ ¬eq gt′ = tri> (asym (∙∷ gt′)) (irr (∙∷ gt′) ∘ sym) (∙∷ gt′)
170
-
171
- compare : Trichotomous _≡_ _<_
172
- compare 0# 0# = tri≈ irr′ refl irr′
173
- compare 0# (bs₂ 1#) = tri< 0<+ (irr 0<+) (asym 0<+)
174
- compare (bs₁ 1#) 0# = tri> (asym 0<+) (irr 0<+ ∘ sym) 0<+
175
- compare (bs₁ 1#) (bs₂ 1#) = compare⁺ bs₁ bs₂
176
-
177
- strictTotalOrder : StrictTotalOrder _ _ _
178
- strictTotalOrder = record
179
- { Carrier = Bin
180
- ; _≈_ = _≡_
181
- ; _<_ = _<_
182
- ; isStrictTotalOrder = record
183
- { isEquivalence = PropEq.isEquivalence
184
- ; trans = <-trans
185
- ; compare = compare
186
- }
187
- }
188
-
189
- ------------------------------------------------------------------------
190
- -- (Bin, _≡_) is a decidable setoid
191
-
192
- decSetoid : DecSetoid _ _
193
- decSetoid = StrictTotalOrder.decSetoid strictTotalOrder
194
-
195
- infix 4 _≟_
196
-
197
- _≟_ : Decidable {A = Bin} _≡_
198
- _≟_ = DecSetoid._≟_ decSetoid
199
-
200
99
------------------------------------------------------------------------
201
100
-- Arithmetic
202
101
0 commit comments