88
99module Data.Nat.Bounded.Properties where
1010
11+ import Algebra.Definitions as Definitions
1112open import Data.Fin.Base as Fin using (Fin)
1213import Data.Fin.Properties as Fin
1314open import Data.Nat.Base as ℕ
@@ -23,15 +24,16 @@ open import Relation.Binary.Structures using (IsPartialEquivalence; IsEquivalenc
2324open import Relation.Binary.Core using (_⇒_)
2425open import Relation.Binary.Definitions
2526open import Relation.Binary.PropositionalEquality
26- using (_≡_; refl; erefl; sym; trans; cong; subst; _≗_ )
27+ hiding (isEquivalence; setoid )
2728open import Relation.Nullary.Decidable.Core using (map′)
2829
2930open import Data.Nat.Bounded.Base as ℕ<
3031
3132private
3233 variable
33- m n : ℕ
34- i j : ℕ< n
34+ m n o : ℕ
35+ i j k : ℕ< n
36+
3537
3638------------------------------------------------------------------------
3739-- Equality on values is propositional equality
@@ -49,10 +51,25 @@ private
4951⟦⟧≡⟦⟧⇒≡ : (_≡_ on ⟦_⟧) ⇒ _≡_ {A = ℕ< n}
5052⟦⟧≡⟦⟧⇒≡ refl = refl
5153
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+
5270fromℕ∘toℕ≐id : (i : ℕ< n) → let instance _ = nonZeroIndex i
5371 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)
5673
5774infix 4 _≟_
5875_≟_ : DecidableEquality (ℕ< n)
@@ -100,23 +117,26 @@ module _ {m} {i : ℕ< n} where
100117------------------------------------------------------------------------
101118-- Properties of the quotient on ℕ induced by `fromℕ`
102119
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⟧<
105122
106- ≡-mod-sym : Symmetric (≡-Mod n)
123+ ≡-mod-sym : Symmetric (≡-Modℕ n)
107124≡-mod-sym (lhs , rhs) = rhs , lhs
108125
109- ≡-mod-trans : Transitive (≡-Mod n)
126+ ≡-mod-trans : Transitive (≡-Modℕ n)
110127≡-mod-trans (lhs₁ , rhs₁) (lhs₂ , rhs₂)
111128 with refl ← /∼≡-injective rhs₁ lhs₂ = lhs₁ , rhs₂
112129
113- isPartialEquivalence : IsPartialEquivalence (≡-Mod n)
130+ isPartialEquivalence : IsPartialEquivalence (≡-Modℕ n)
114131isPartialEquivalence = record { sym = ≡-mod-sym ; trans = ≡-mod-trans }
115132
116133partialSetoid : ℕ → 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
118138
119- isEquivalence : .{{NonZero n}} → IsEquivalence (≡-Mod n)
139+ isEquivalence : .{{NonZero n}} → IsEquivalence (≡-Modℕ n)
120140isEquivalence {n} = record
121141 { refl = ≡-mod-refl
122142 ; sym = ≡-mod-sym
@@ -126,14 +146,80 @@ isEquivalence {n} = record
126146setoid : .{{NonZero n}} → Setoid _ _
127147setoid = record { isEquivalence = isEquivalence }
128148
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
132155≡-mod⇒fromℕ≡fromℕ (lhs/∼≡ , rhs/∼≡) = trans (lhs/∼≡ /∼≡fromℕ⁻¹) (sym (rhs/∼≡ /∼≡fromℕ⁻¹))
133156
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ℕ
136161
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ℕ
139164
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