Skip to content

Commit 5989a60

Browse files
jamesmckinnaandreasabel
authored andcommitted
Refactor Data.Integer.Divisibility.Signed (#2307)
* removed extra space * refactor to introduce new `Data.Integer.Properties` * refactor proofs to use new properties; streamline reasoning * remove final blank line * first review comment: missing annotation * removed two new lemmas: `i*j≢0⇒i≢0` and `i*j≢0⇒j≢0`
1 parent 204b2b2 commit 5989a60

File tree

4 files changed

+47
-37
lines changed

4 files changed

+47
-37
lines changed

CHANGELOG.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,11 +229,18 @@ Additions to existing modules
229229
nonZeroIndex : Fin n → ℕ.NonZero n
230230
```
231231

232-
* In `Data.Integer.Divisisbility`: introduce `divides` as an explicit pattern synonym
232+
* In `Data.Integer.Divisibility`: introduce `divides` as an explicit pattern synonym
233233
```agda
234234
pattern divides k eq = Data.Nat.Divisibility.divides k eq
235235
```
236236

237+
* In `Data.Integer.Properties`:
238+
```agda
239+
◃-nonZero : .{{_ : ℕ.NonZero n}} → NonZero (s ◃ n)
240+
sign-* : .{{NonZero (i * j)}} → sign (i * j) ≡ sign i Sign.* sign j
241+
i*j≢0 : .{{_ : NonZero i}} .{{_ : NonZero j}} → NonZero (i * j)
242+
```
243+
237244
* In `Data.List.Properties`:
238245
```agda
239246
applyUpTo-∷ʳ : applyUpTo f n ∷ʳ f n ≡ applyUpTo f (suc n)

src/Data/Integer/Divisibility.agda

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ infix 4 _∣_
2727
_∣_ : Rel ℤ 0ℓ
2828
_∣_ = ℕ._∣_ on ∣_∣
2929

30-
pattern divides k eq = ℕ.divides k eq
30+
pattern divides k eq = ℕ.divides k eq
3131

3232
------------------------------------------------------------------------
3333
-- Properties of divisibility

src/Data/Integer/Divisibility/Signed.agda

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import Relation.Binary.Reasoning.Preorder as ≲-Reasoning
2929
open import Relation.Nullary.Decidable as Dec using (yes; no)
3030
open import Relation.Binary.Reasoning.Syntax
3131

32+
3233
------------------------------------------------------------------------
3334
-- Type
3435

@@ -44,43 +45,35 @@ open _∣_ using (quotient) public
4445
-- Conversion between signed and unsigned divisibility
4546

4647
∣ᵤ⇒∣ : {k i} k Unsigned.∣ i k ∣ i
47-
∣ᵤ⇒∣ {k} {i} (Unsigned.divides 0 eq) = divides (+ 0) (∣i∣≡0⇒i≡0 eq)
48+
∣ᵤ⇒∣ {k} {i} (Unsigned.divides 0 eq) = divides +0 (∣i∣≡0⇒i≡0 eq)
4849
∣ᵤ⇒∣ {k} {i} (Unsigned.divides q@(ℕ.suc _) eq) with k ≟ +0
4950
... | yes refl = divides +0 (∣i∣≡0⇒i≡0 (trans eq (ℕ.*-zeroʳ q)))
50-
... | no neq = divides (sign i Sign.* sign k ◃ q) (◃-cong sign-eq abs-eq)
51+
... | no neq = divides s[i*k]◃q (◃-cong sign-eq abs-eq)
5152
where
52-
ikq = sign i Sign.* sign k ◃ q
53-
54-
*-nonZero : m n .{{_ : ℕ.NonZero m}} .{{_ : ℕ.NonZero n}} ℕ.NonZero (m ℕ.* n)
55-
*-nonZero (ℕ.suc _) (ℕ.suc _) = _
56-
57-
◃-nonZero : s n .{{_ : ℕ.NonZero n}} NonZero (s ◃ n)
58-
◃-nonZero Sign.- (ℕ.suc _) = _
59-
◃-nonZero Sign.+ (ℕ.suc _) = _
60-
61-
ikq≢0 : NonZero ikq
62-
ikq≢0 = ◃-nonZero (sign i Sign.* sign k) q
53+
s[i*k] = sign i Sign.* sign k
54+
s[i*k]◃q = s[i*k] ◃ q
6355

6456
instance
65-
ikq*∣k∣≢0 : ℕ.NonZero (∣ ikq ∣ ℕ.* ∣ k ∣)
66-
ikq*∣k∣≢0 = *-nonZero ∣ ikq ∣ ∣ k ∣ {{ikq≢0}} {{≢-nonZero neq}}
57+
_ = ≢-nonZero neq
58+
_ = ◃-nonZero s[i*k] q
59+
_ = i*j≢0 s[i*k]◃q k
6760

68-
sign-eq : sign i ≡ sign (ikq * k)
61+
sign-eq : sign i ≡ sign (s[i*k]◃q * k)
6962
sign-eq = sym $ begin
70-
sign (ikq * k) ≡⟨ sign-◃ (sign ikq Sign.* sign k) (∣ ikq ∣ ℕ.* ∣ k ∣)
71-
sign ikq Sign.* sign k ≡⟨ cong (Sign._* sign k) (sign-◃ (sign i Sign.* sign k) q) ⟩
72-
(sign i Sign.* sign k) Sign.* sign k ≡⟨ Sign.*-assoc (sign i) (sign k) (sign k) ⟩
63+
sign (s[i*k]◃q * k) ≡⟨ sign-* s[i*k]◃q k
64+
sign s[i*k]◃q Sign.* sign k ≡⟨ cong (Sign._* _) (sign-◃ s[i*k] q) ⟩
65+
s[i*k] Sign.* sign k ≡⟨ Sign.*-assoc (sign i) (sign k) (sign k) ⟩
7366
sign i Sign.* (sign k Sign.* sign k) ≡⟨ cong (sign i Sign.*_) (Sign.s*s≡+ (sign k)) ⟩
7467
sign i Sign.* Sign.+ ≡⟨ Sign.*-identityʳ (sign i) ⟩
75-
sign i ∎
68+
sign i
7669
where open ≡-Reasoning
7770

78-
abs-eq : ∣ i ∣ ≡ ∣ ikq * k ∣
71+
abs-eq : ∣ i ∣ ≡ ∣ s[i*k]◃q * k ∣
7972
abs-eq = sym $ begin
80-
ikq * k ∣ ≡⟨ ∣i*j∣≡∣i∣*∣j∣ ikq k ⟩
81-
ikq ∣ ℕ.* ∣ k ∣ ≡⟨ cong (ℕ._* ∣ k ∣) (abs-◃ (sign i Sign.* sign k) q) ⟩
82-
q ℕ.* ∣ k ∣ ≡⟨ sym eq
83-
∣ i ∣ ∎
73+
s[i*k]◃q * k ∣ ≡⟨ abs-* s[i*k]◃q k ⟩
74+
s[i*k]◃q ∣ ℕ.* ∣ k ∣ ≡⟨ cong (ℕ._* ∣ k ∣) (abs-◃ s[i*k] q) ⟩
75+
q ℕ.* ∣ k ∣ ≡⟨ eq
76+
∣ i ∣
8477
where open ≡-Reasoning
8578

8679
∣⇒∣ᵤ : {k i} k ∣ i k Unsigned.∣ i
@@ -148,7 +141,7 @@ m∣∣m∣ = ∣ᵤ⇒∣ ℕ.∣-refl
148141
∣m⇒∣-m : {i m} i ∣ m i ∣ - m
149142
∣m⇒∣-m {i} {m} i∣m = ∣ᵤ⇒∣ $′ begin
150143
∣ i ∣ ∣⟨ ∣⇒∣ᵤ i∣m ⟩
151-
∣ m ∣ ≡⟨ sym (∣-i∣≡∣i∣ m) ⟩
144+
∣ m ∣ ≡⟨ ∣-i∣≡∣i∣ m
152145
∣ - m ∣ ∎
153146
where open ℕ.∣-Reasoning
154147

@@ -159,7 +152,7 @@ m∣∣m∣ = ∣ᵤ⇒∣ ℕ.∣-refl
159152
∣m+n∣m⇒∣n {i} {m} {n} i∣m+n i∣m = begin
160153
i ∣⟨ ∣m∣n⇒∣m-n i∣m+n i∣m ⟩
161154
m + n - m ≡⟨ +-comm (m + n) (- m) ⟩
162-
- m + (m + n) ≡⟨ sym (+-assoc (- m) m n) ⟩
155+
- m + (m + n) ≡⟨ +-assoc (- m) m n
163156
- m + m + n ≡⟨ cong (_+ n) (+-inverseˡ m) ⟩
164157
+ 0 + n ≡⟨ +-identityˡ n ⟩
165158
n ∎
@@ -171,7 +164,7 @@ m∣∣m∣ = ∣ᵤ⇒∣ ℕ.∣-refl
171164
∣n⇒∣m*n : {i} m {n} i ∣ n i ∣ m * n
172165
∣n⇒∣m*n {i} m {n} (divides q eq) = divides (m * q) $′ begin
173166
m * n ≡⟨ cong (m *_) eq ⟩
174-
m * (q * i) ≡⟨ sym (*-assoc m q i) ⟩
167+
m * (q * i) ≡⟨ *-assoc m q i
175168
m * q * i ∎
176169
where open ≡-Reasoning
177170

src/Data/Integer/Properties.agda

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import Data.Nat.Properties as ℕ
2323
open import Data.Nat.Solver
2424
open import Data.Product.Base using (proj₁; proj₂; _,_; _×_)
2525
open import Data.Sum.Base as Sum using (_⊎_; inj₁; inj₂; [_,_]′)
26-
open import Data.Sign as Sign using (Sign) renaming (_*_ to _𝕊*_)
26+
open import Data.Sign as Sign using (Sign)
2727
import Data.Sign.Properties as Sign
2828
open import Function.Base using (_∘_; _$_; id)
2929
open import Level using (0ℓ)
@@ -508,6 +508,10 @@ neg-cancel-< { -[1+ m ]} { -[1+ n ]} (+<+ m<n) = -<- (s<s⁻¹ m<n)
508508
------------------------------------------------------------------------
509509
-- Properties of sign and _◃_
510510

511+
◃-nonZero : s n .{{_ : ℕ.NonZero n}} NonZero (s ◃ n)
512+
◃-nonZero Sign.- (ℕ.suc _) = _
513+
◃-nonZero Sign.+ (ℕ.suc _) = _
514+
511515
◃-inverse : i sign i ◃ ∣ i ∣ ≡ i
512516
◃-inverse -[1+ n ] = refl
513517
◃-inverse +0 = refl
@@ -1348,7 +1352,7 @@ private
13481352
*-assoc i j +0 rewrite
13491353
ℕ.*-zeroʳ ∣ j ∣
13501354
| ℕ.*-zeroʳ ∣ i ∣
1351-
| ℕ.*-zeroʳ ∣ sign i 𝕊* sign j ◃ ∣ i ∣ ℕ.* ∣ j ∣ ∣
1355+
| ℕ.*-zeroʳ ∣ sign i Sign.* sign j ◃ ∣ i ∣ ℕ.* ∣ j ∣ ∣
13521356
= refl
13531357
*-assoc -[1+ m ] -[1+ n ] +[1+ o ] = cong (+_ ∘ suc) (lemma m n o)
13541358
*-assoc -[1+ m ] +[1+ n ] -[1+ o ] = cong (+_ ∘ suc) (lemma m n o)
@@ -1390,11 +1394,11 @@ private
13901394
= refl
13911395
*-distribʳ-+ x +0 z
13921396
rewrite +-identityˡ z
1393-
| +-identityˡ (sign z 𝕊* sign x ◃ ∣ z ∣ ℕ.* ∣ x ∣)
1397+
| +-identityˡ (sign z Sign.* sign x ◃ ∣ z ∣ ℕ.* ∣ x ∣)
13941398
= refl
13951399
*-distribʳ-+ x y +0
13961400
rewrite +-identityʳ y
1397-
| +-identityʳ (sign y 𝕊* sign x ◃ ∣ y ∣ ℕ.* ∣ x ∣)
1401+
| +-identityʳ (sign y Sign.* sign x ◃ ∣ y ∣ ℕ.* ∣ x ∣)
13981402
= refl
13991403
*-distribʳ-+ -[1+ m ] -[1+ n ] -[1+ o ] = cong (+_) $
14001404
solve 3 (λ m n o (con 2 :+ n :+ o) :* (con 1 :+ m)
@@ -1594,6 +1598,9 @@ private
15941598
abs-* : ℤtoℕ.Homomorphic₂ ∣_∣ _*_ ℕ._*_
15951599
abs-* i j = abs-◃ _ _
15961600

1601+
sign-* : i j .{{NonZero (i * j)}} sign (i * j) ≡ sign i Sign.* sign j
1602+
sign-* i j rewrite abs-* i j = sign-◃ (sign i Sign.* sign j) (∣ i ∣ ℕ.* ∣ j ∣)
1603+
15971604
*-cancelʳ-≡ : i j k .{{_ : NonZero k}} i * k ≡ j * k i ≡ j
15981605
*-cancelʳ-≡ i j k eq with sign-cong′ eq
15991606
... | inj₁ s[ik]≡s[jk] = ◃-cong
@@ -1631,6 +1638,9 @@ i*j≡0⇒i≡0∨j≡0 i p with ℕ.m*n≡0⇒m≡0∨n≡0 ∣ i ∣ (abs-cong
16311638
... | inj₁ ∣i∣≡0 = inj₁ (∣i∣≡0⇒i≡0 ∣i∣≡0)
16321639
... | inj₂ ∣j∣≡0 = inj₂ (∣i∣≡0⇒i≡0 ∣j∣≡0)
16331640

1641+
i*j≢0 : i j .{{_ : NonZero i}} .{{_ : NonZero j}} NonZero (i * j)
1642+
i*j≢0 i j rewrite abs-* i j = ℕ.m*n≢0 ∣ i ∣ ∣ j ∣
1643+
16341644
------------------------------------------------------------------------
16351645
-- Properties of _^_
16361646
------------------------------------------------------------------------
@@ -1704,7 +1714,7 @@ neg-distribʳ-* i j = begin
17041714
------------------------------------------------------------------------
17051715
-- Properties of _*_ and _◃_
17061716

1707-
◃-distrib-* : s t m n (s 𝕊* t) ◃ (m ℕ.* n) ≡ (s ◃ m) * (t ◃ n)
1717+
◃-distrib-* : s t m n (s Sign.* t) ◃ (m ℕ.* n) ≡ (s ◃ m) * (t ◃ n)
17081718
◃-distrib-* s t zero zero = refl
17091719
◃-distrib-* s t zero (suc n) = refl
17101720
◃-distrib-* s t (suc m) zero =
@@ -1713,7 +1723,7 @@ neg-distribʳ-* i j = begin
17131723
(*-comm (t ◃ zero) (s ◃ suc m))
17141724
◃-distrib-* s t (suc m) (suc n) =
17151725
sym (cong₂ _◃_
1716-
(cong₂ _𝕊*_ (sign-◃ s (suc m)) (sign-◃ t (suc n)))
1726+
(cong₂ Sign._*_ (sign-◃ s (suc m)) (sign-◃ t (suc n)))
17171727
(∣s◃m∣*∣t◃n∣≡m*n s t (suc m) (suc n)))
17181728

17191729
------------------------------------------------------------------------
@@ -1828,7 +1838,7 @@ neg-distribʳ-* i j = begin
18281838
-- Properties of _*_ and ∣_∣
18291839

18301840
∣i*j∣≡∣i∣*∣j∣ : i j ∣ i * j ∣ ≡ ∣ i ∣ ℕ.* ∣ j ∣
1831-
∣i*j∣≡∣i∣*∣j∣ i j = abs-◃ (sign i 𝕊* sign j) (∣ i ∣ ℕ.* ∣ j ∣)
1841+
∣i*j∣≡∣i∣*∣j∣ = abs-*
18321842

18331843
------------------------------------------------------------------------
18341844
-- Properties of _⊓_ and _⊔_

0 commit comments

Comments
 (0)