Skip to content

Commit 355ac25

Browse files
authored
Add a couple lemmas about product in Data.List.Properties (agda#2460)
* Add a couple lemmas about product in Data.List.Properties * Rework product proofs to be cleaner * Add CHANGELOG entries * Get rid of unnecessary module use in product proofs * Various product proof adjustments - Renamed nonEmpty-product to product≢0 - Swapped argument order of ∈⇒≤product - Factored the ordering proofs out into Data.Nat.Properties - Removed the custom product≢0 proof in Primality * Fix a CHANGELOG oversight * Suggested minor changes to ∈⇒≤product * Manually supply instances in product properties
1 parent cb9854d commit 355ac25

File tree

4 files changed

+33
-10
lines changed

4 files changed

+33
-10
lines changed

CHANGELOG.md

+13-1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,12 @@ New modules
4848
Additions to existing modules
4949
-----------------------------
5050

51+
* In `Data.List.Properties`:
52+
```agda
53+
product≢0 : All NonZero ns → NonZero (product ns)
54+
∈⇒≤product : All NonZero ns → n ∈ ns → n ≤ product ns
55+
```
56+
5157
* In `Data.List.Relation.Unary.All`:
5258
```agda
5359
search : Decidable P → ∀ xs → All (∁ P) xs ⊎ Any P xs
@@ -65,7 +71,13 @@ Additions to existing modules
6571
++⁺ˡ : Reflexive R → ∀ zs → (_++ zs) Preserves (Pointwise R) ⟶ (Pointwise R)
6672
```
6773

68-
* New lemmas in `Data.Nat.Properties`: adjunction between `suc` and `pred`
74+
* New lemmas in `Data.Nat.Properties`:
75+
```agda
76+
m≤n⇒m≤n*o : ∀ o .{{_ : NonZero o}} → m ≤ n → m ≤ n * o
77+
m≤n⇒m≤o*n : ∀ o .{{_ : NonZero o}} → m ≤ n → m ≤ o * n
78+
```
79+
80+
adjunction between `suc` and `pred`
6981
```agda
7082
suc[m]≤n⇒m≤pred[n] : suc m ≤ n → m ≤ pred n
7183
m≤pred[n]⇒suc[m]≤n : .{{NonZero n}} → m ≤ pred n → suc m ≤ n

src/Data/List/Properties.agda

+11
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,17 @@ sum-++ (x ∷ xs) ys = begin
842842
∈⇒∣product {n} {n ∷ ns} (here refl) = divides (product ns) (*-comm n (product ns))
843843
∈⇒∣product {n} {m ∷ ns} (there n∈ns) = ∣n⇒∣m*n m (∈⇒∣product n∈ns)
844844

845+
product≢0 : {ns} All NonZero ns NonZero (product ns)
846+
product≢0 [] = _
847+
product≢0 {n ∷ ns} (n≢0 ∷ ns≢0) = m*n≢0 n (product ns) {{n≢0}} {{product≢0 ns≢0}}
848+
849+
∈⇒≤product : {n ns} All NonZero ns n ∈ ns n ≤ product ns
850+
∈⇒≤product {ns = n ∷ ns} (_ ∷ ns≢0) (here refl) =
851+
m≤m*n n (product ns) {{product≢0 ns≢0}}
852+
∈⇒≤product {ns = n ∷ _} (n≢0 ∷ ns≢0) (there n∈ns) =
853+
m≤n⇒m≤o*n n {{n≢0}} (∈⇒≤product ns≢0 n∈ns)
854+
855+
845856
------------------------------------------------------------------------
846857
-- applyUpTo
847858

src/Data/Nat/Primality.agda

+1-4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
module Data.Nat.Primality where
1010

1111
open import Data.List.Base using ([]; _∷_; product)
12+
open import Data.List.Properties using (product≢0)
1213
open import Data.List.Relation.Unary.All as All using (All; []; _∷_)
1314
open import Data.Nat.Base
1415
open import Data.Nat.Divisibility
@@ -324,10 +325,6 @@ prime⇒¬composite (prime p) = p
324325

325326
productOfPrimes≢0 : {as} All Prime as NonZero (product as)
326327
productOfPrimes≢0 pas = product≢0 (All.map prime⇒nonZero pas)
327-
where
328-
product≢0 : {ns} All NonZero ns NonZero (product ns)
329-
product≢0 [] = _
330-
product≢0 {n ∷ ns} (nzn ∷ nzns) = m*n≢0 n _ {{nzn}} {{product≢0 nzns}}
331328

332329
productOfPrimes≥1 : {as} All Prime as product as ≥ 1
333330
productOfPrimes≥1 {as} pas = >-nonZero⁻¹ _ {{productOfPrimes≢0 pas}}

src/Data/Nat/Properties.agda

+8-5
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,12 @@ m≤n*m m n@(suc _) = begin
10001000
m * n ≡⟨ *-comm m n ⟩
10011001
n * m ∎
10021002

1003+
m≤n⇒m≤o*n : o .{{_ : NonZero o}} m ≤ n m ≤ o * n
1004+
m≤n⇒m≤o*n o m≤n = ≤-trans m≤n (m≤n*m _ o)
1005+
1006+
m≤n⇒m≤n*o : o .{{_ : NonZero o}} m ≤ n m ≤ n * o
1007+
m≤n⇒m≤n*o o m≤n = ≤-trans m≤n (m≤m*n _ o)
1008+
10031009
m<m*n : m n .{{_ : NonZero m}} 1 < n m < m * n
10041010
m<m*n m@(suc m-1) n@(suc (suc n-2)) (s≤s (s≤s _)) = begin-strict
10051011
m <⟨ s≤s (s≤s (m≤n+m m-1 n-2)) ⟩
@@ -1008,13 +1014,10 @@ m<m*n m@(suc m-1) n@(suc (suc n-2)) (s≤s (s≤s _)) = begin-strict
10081014
m * n ∎
10091015

10101016
m<n⇒m<n*o : o .{{_ : NonZero o}} m < n m < n * o
1011-
m<n⇒m<n*o {n = n} o m<n = <-≤-trans m<n (m≤m*n n o)
1017+
m<n⇒m<n*o = m≤n⇒m≤n*o
10121018

10131019
m<n⇒m<o*n : {m n} o .{{_ : NonZero o}} m < n m < o * n
1014-
m<n⇒m<o*n {m} {n} o m<n = begin-strict
1015-
m <⟨ m<n⇒m<n*o o m<n ⟩
1016-
n * o ≡⟨ *-comm n o ⟩
1017-
o * n ∎
1020+
m<n⇒m<o*n = m≤n⇒m≤o*n
10181021

10191022
*-cancelʳ-< : RightCancellative _<_ _*_
10201023
*-cancelʳ-< zero zero (suc o) _ = 0<1+n

0 commit comments

Comments
 (0)