8
8
9
9
module Data.Nat.Bounded.Properties where
10
10
11
+ import Algebra.Definitions as Definitions
11
12
open import Data.Fin.Base as Fin using (Fin)
12
13
import Data.Fin.Properties as Fin
13
14
open import Data.Nat.Base as ℕ
@@ -23,15 +24,16 @@ open import Relation.Binary.Structures using (IsPartialEquivalence; IsEquivalenc
23
24
open import Relation.Binary.Core using (_⇒_)
24
25
open import Relation.Binary.Definitions
25
26
open import Relation.Binary.PropositionalEquality
26
- using (_≡_; refl; erefl; sym; trans; cong; subst; _≗_ )
27
+ hiding (isEquivalence; setoid )
27
28
open import Relation.Nullary.Decidable.Core using (map′)
28
29
29
30
open import Data.Nat.Bounded.Base as ℕ<
30
31
31
32
private
32
33
variable
33
- m n : ℕ
34
- i j : ℕ< n
34
+ m n o : ℕ
35
+ i j k : ℕ< n
36
+
35
37
36
38
------------------------------------------------------------------------
37
39
-- Equality on values is propositional equality
@@ -49,10 +51,25 @@ private
49
51
⟦⟧≡⟦⟧⇒≡ : (_≡_ on ⟦_⟧) ⇒ _≡_ {A = ℕ< n}
50
52
⟦⟧≡⟦⟧⇒≡ refl = refl
51
53
54
+ fromℕ[n]≡0 : .{{_ : NonZero n}} → fromℕ n ≡ ⟦0⟧<
55
+ fromℕ[n]≡0 {n} = ⟦⟧≡⟦⟧⇒≡ (ℕ.n%n≡0 n)
56
+
57
+ module _ (m<n : m < n) where
58
+
59
+ private instance _ = ℕ.>-nonZero (ℕ.m<n⇒0<n m<n)
60
+
61
+ +-inverseˡ : fromℕ (n ∸ m + m) ≡ ⟦0⟧<
62
+ +-inverseˡ = trans (cong fromℕ (ℕ.m∸n+n≡m (ℕ.<⇒≤ m<n))) fromℕ[n]≡0
63
+
64
+ +-inverseʳ : fromℕ (m + (n ∸ m)) ≡ ⟦0⟧<
65
+ +-inverseʳ = trans (cong fromℕ (ℕ.m+[n∸m]≡n (ℕ.<⇒≤ m<n))) fromℕ[n]≡0
66
+
67
+ fromℕ≐⟦⟧< : fromℕ m ≡ ⟦ m ⟧< m<n
68
+ fromℕ≐⟦⟧< = ⟦⟧≡⟦⟧⇒≡ $ ℕ.m<n⇒m%n≡m m<n
69
+
52
70
fromℕ∘toℕ≐id : (i : ℕ< n) → let instance _ = nonZeroIndex i
53
71
in fromℕ ⟦ i ⟧ ≡ i
54
- fromℕ∘toℕ≐id i = let instance _ = nonZeroIndex i
55
- in ⟦⟧≡⟦⟧⇒≡ $ ℕ.m<n⇒m%n≡m $ ℕ<.isBounded i
72
+ fromℕ∘toℕ≐id i = fromℕ≐⟦⟧< (ℕ<.isBounded i)
56
73
57
74
infix 4 _≟_
58
75
_≟_ : DecidableEquality (ℕ< n)
@@ -100,23 +117,26 @@ module _ {m} {i : ℕ< n} where
100
117
------------------------------------------------------------------------
101
118
-- Properties of the quotient on ℕ induced by `fromℕ`
102
119
103
- ≡ -mod-refl : .{{NonZero n}} → Reflexive (≡-Mod n)
104
- ≡ -mod-refl {n} {m} = let r = erefl ( fromℕ m) /∼≡fromℕ in r , r
120
+ n≡0 -mod : .{{_ : NonZero n}} → n ≡ 0 modℕ n
121
+ n≡0 -mod = let r = fromℕ[n]≡0 /∼≡fromℕ in r , ‵fromℕ 0 ⟦0⟧<
105
122
106
- ≡-mod-sym : Symmetric (≡-Mod n)
123
+ ≡-mod-sym : Symmetric (≡-Modℕ n)
107
124
≡-mod-sym (lhs , rhs) = rhs , lhs
108
125
109
- ≡-mod-trans : Transitive (≡-Mod n)
126
+ ≡-mod-trans : Transitive (≡-Modℕ n)
110
127
≡-mod-trans (lhs₁ , rhs₁) (lhs₂ , rhs₂)
111
128
with refl ← /∼≡-injective rhs₁ lhs₂ = lhs₁ , rhs₂
112
129
113
- isPartialEquivalence : IsPartialEquivalence (≡-Mod n)
130
+ isPartialEquivalence : IsPartialEquivalence (≡-Modℕ n)
114
131
isPartialEquivalence = record { sym = ≡-mod-sym ; trans = ≡-mod-trans }
115
132
116
133
partialSetoid : ℕ → PartialSetoid _ _
117
- partialSetoid n = record { _≈_ = ≡-Mod n ; isPartialEquivalence = isPartialEquivalence }
134
+ partialSetoid n = record { _≈_ = ≡-Modℕ n ; isPartialEquivalence = isPartialEquivalence }
135
+
136
+ ≡-mod-refl : .{{NonZero n}} → Reflexive (≡-Modℕ n)
137
+ ≡-mod-refl {n} {m} = let r = erefl (fromℕ m) /∼≡fromℕ in r , r
118
138
119
- isEquivalence : .{{NonZero n}} → IsEquivalence (≡-Mod n)
139
+ isEquivalence : .{{NonZero n}} → IsEquivalence (≡-Modℕ n)
120
140
isEquivalence {n} = record
121
141
{ refl = ≡-mod-refl
122
142
; sym = ≡-mod-sym
@@ -126,14 +146,80 @@ isEquivalence {n} = record
126
146
setoid : .{{NonZero n}} → Setoid _ _
127
147
setoid = record { isEquivalence = isEquivalence }
128
148
129
- ≡-mod⇒fromℕ≡fromℕ : ∀ {x y} (p : x ≡ y mod n) →
130
- let _,_ {i} _ _ = p ; instance _ = nonZeroIndex i
131
- in fromℕ {n} x ≡ fromℕ y
149
+ ≡-mod-reflexive : .{{NonZero n}} → _≡_ {A = ℕ} ⇒ (≡-Modℕ n)
150
+ ≡-mod-reflexive = reflexive where open IsEquivalence isEquivalence
151
+
152
+ ≡-mod⇒fromℕ≡fromℕ : (eq : m ≡ o modℕ n) →
153
+ let instance _ = nonZeroModulus eq
154
+ in fromℕ m ≡ fromℕ o
132
155
≡-mod⇒fromℕ≡fromℕ (lhs/∼≡ , rhs/∼≡) = trans (lhs/∼≡ /∼≡fromℕ⁻¹) (sym (rhs/∼≡ /∼≡fromℕ⁻¹))
133
156
134
- fromℕ≡fromℕ⇒≡-mod : .{{_ : NonZero n}} → (_≡_ on fromℕ {n}) ⇒ ≡-Mod n
135
- fromℕ≡fromℕ⇒≡-mod fromℕ[x]≡fromℕ[y] = (fromℕ[x]≡fromℕ[y] /∼≡fromℕ) , (refl /∼≡fromℕ)
157
+ ≡-mod⇒%≡% : (eq : m ≡ o modℕ n) →
158
+ let instance _ = nonZeroModulus eq
159
+ in m % n ≡ o % n
160
+ ≡-mod⇒%≡% = ≡⇒⟦⟧≡⟦⟧ ∘ ≡-mod⇒fromℕ≡fromℕ
136
161
137
- toℕ∘ fromℕ≐id : .{{_ : NonZero n}} → (m : ℕ) → ⟦ fromℕ {n} m ⟧ ≡ m mod n
138
- toℕ∘ fromℕ≐id {{it}} m = fromℕ ≡fromℕ⇒≡-mod {{it}} (fromℕ∘toℕ≐id ( fromℕ m))
162
+ fromℕ≡fromℕ⇒≡-mod : .{{_ : NonZero n}} → (_≡_ on fromℕ) ⇒ ≡-Modℕ n
163
+ fromℕ≡fromℕ⇒≡-mod eq = eq /∼≡ fromℕ , refl /∼≡fromℕ
139
164
165
+ %≡%⇒≡-mod : .{{_ : NonZero n}} → (_≡_ on _% n) ⇒ ≡-Modℕ n
166
+ %≡%⇒≡-mod eq = fromℕ≡fromℕ⇒≡-mod (⟦⟧≡⟦⟧⇒≡ eq)
167
+
168
+ toℕ∘fromℕ≐id : .{{_ : NonZero n}} → (m : ℕ) → ⟦ fromℕ m ⟧ ≡ m modℕ n
169
+ toℕ∘fromℕ≐id m = fromℕ≡fromℕ⇒≡-mod (fromℕ∘toℕ≐id (fromℕ m))
170
+
171
+ ------------------------------------------------------------------------
172
+ -- Arithmetic properties of bounded numbers
173
+
174
+ module _ (m<n : m < n) (o<n : o < n) where
175
+
176
+ private
177
+ instance
178
+ n≢ₘ0 = ℕ.>-nonZero (ℕ.m<n⇒0<n m<n)
179
+ n≢ₒ0 = ℕ.>-nonZero (ℕ.m<n⇒0<n o<n)
180
+
181
+ open ≡-Reasoning
182
+
183
+ ≡-mod⇒≡ : m ≡ o modℕ n → m ≡ o
184
+ ≡-mod⇒≡ eq = ≡⇒⟦⟧≡⟦⟧ $ begin
185
+ ⟦ m ⟧< m<n ≡⟨ fromℕ≐⟦⟧< m<n ⟨
186
+ fromℕ {{n≢ₘ0}} m ≡⟨ ≡-mod⇒fromℕ≡fromℕ eq ⟩
187
+ fromℕ {{n≢ₒ0}} o ≡⟨ fromℕ≐⟦⟧< o<n ⟩
188
+ ⟦ o ⟧< o<n ∎
189
+
190
+ module _ .{{_ : NonZero n}} (m o : ℕ) where
191
+
192
+ open ≡-Reasoning
193
+
194
+ +-distribˡ-% : ((m % n) + o) ≡ (m + o) modℕ n
195
+ +-distribˡ-% = %≡%⇒≡-mod $ begin
196
+ (m % n + o) % n ≡⟨ ℕ.%-distribˡ-+ (m % n) o n ⟩
197
+ (m % n % n + o % n) % n ≡⟨ cong ((_% n) ∘ (_+ o % n)) (ℕ.m%n%n≡m%n m n) ⟩
198
+ (m % n + o % n) % n ≡⟨ ℕ.%-distribˡ-+ m o n ⟨
199
+ (m + o) % n ∎
200
+
201
+ +-distribʳ-% : (m + (o % n)) ≡ (m + o) modℕ n
202
+ +-distribʳ-% = %≡%⇒≡-mod $ begin
203
+ (m + o % n) % n ≡⟨ ℕ.%-distribˡ-+ m (o % n) n ⟩
204
+ (m % n + o % n % n) % n ≡⟨ cong ((_% n) ∘ (m % n +_)) (ℕ.m%n%n≡m%n o n) ⟩
205
+ (m % n + o % n) % n ≡⟨ ℕ.%-distribˡ-+ m o n ⟨
206
+ (m + o) % n ∎
207
+
208
+ +-distrib-% : ((m % n) + (o % n)) ≡ (m + o) modℕ n
209
+ +-distrib-% = %≡%⇒≡-mod $ begin
210
+ (m % n + o % n) % n ≡⟨ ℕ.%-distribˡ-+ m o n ⟨
211
+ (m + o) % n ∎
212
+
213
+ *-distribˡ-% : ((m % n) * o) ≡ (m * o) modℕ n
214
+ *-distribˡ-% = %≡%⇒≡-mod $ begin
215
+ (m % n * o) % n ≡⟨ ℕ.%-distribˡ-* (m % n) o n ⟩
216
+ (m % n % n * (o % n)) % n ≡⟨ cong ((_% n) ∘ (_* (o % n))) (ℕ.m%n%n≡m%n m n) ⟩
217
+ (m % n * (o % n)) % n ≡⟨ ℕ.%-distribˡ-* m o n ⟨
218
+ (m * o) % n ∎
219
+
220
+ *-distribʳ-% : (m * (o % n)) ≡ (m * o) modℕ n
221
+ *-distribʳ-% = %≡%⇒≡-mod $ begin
222
+ (m * (o % n)) % n ≡⟨ ℕ.%-distribˡ-* m (o % n) n ⟩
223
+ (m % n * (o % n % n)) % n ≡⟨ cong ((_% n) ∘ (m % n *_)) (ℕ.m%n%n≡m%n o n) ⟩
224
+ (m % n * (o % n)) % n ≡⟨ ℕ.%-distribˡ-* m o n ⟨
225
+ (m * o) % n ∎
0 commit comments