Skip to content

Commit f0f4883

Browse files
committed
additions to support agda#2292
1 parent 4076cc5 commit f0f4883

File tree

1 file changed

+105
-19
lines changed

1 file changed

+105
-19
lines changed

src/Data/Nat/Bounded/Properties.agda

Lines changed: 105 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
module Data.Nat.Bounded.Properties where
1010

11+
import Algebra.Definitions as Definitions
1112
open import Data.Fin.Base as Fin using (Fin)
1213
import Data.Fin.Properties as Fin
1314
open import Data.Nat.Base as ℕ
@@ -23,15 +24,16 @@ open import Relation.Binary.Structures using (IsPartialEquivalence; IsEquivalenc
2324
open import Relation.Binary.Core using (_⇒_)
2425
open import Relation.Binary.Definitions
2526
open import Relation.Binary.PropositionalEquality
26-
using (_≡_; refl; erefl; sym; trans; cong; subst; _≗_)
27+
hiding (isEquivalence; setoid)
2728
open import Relation.Nullary.Decidable.Core using (map′)
2829

2930
open import Data.Nat.Bounded.Base as ℕ<
3031

3132
private
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+
5270
fromℕ∘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

5774
infix 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)
114131
isPartialEquivalence = record { sym = ≡-mod-sym ; trans = ≡-mod-trans }
115132

116133
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
118138

119-
isEquivalence : .{{NonZero n}} IsEquivalence (≡-Mod n)
139+
isEquivalence : .{{NonZero n}} IsEquivalence (≡-Modℕ n)
120140
isEquivalence {n} = record
121141
{ refl = ≡-mod-refl
122142
; sym = ≡-mod-sym
@@ -126,14 +146,80 @@ isEquivalence {n} = record
126146
setoid : .{{NonZero n}} Setoid _ _
127147
setoid = 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

Comments
 (0)