Skip to content

Commit 8add6fd

Browse files
authored
More distributivity properties for nats (#2833)
* More distributivity properties for nats * Simplify proof using existing lemma * Use lemma instead of refl In principle this lets us translate more easily to an arbitrary semiring
1 parent 54f5c38 commit 8add6fd

File tree

3 files changed

+33
-4
lines changed

3 files changed

+33
-4
lines changed

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,18 @@ Additions to existing modules
7272
≟-≢ : (i≢j : i ≢ j) → (i ≟ j) ≡ no i≢j
7373
```
7474

75+
* In `Data.Nat.ListAction.Properties`
76+
```agda
77+
*-distribˡ-sum : ∀ m ns → m * sum ns ≡ sum (map (m *_) ns)
78+
*-distribʳ-sum : ∀ m ns → sum ns * m ≡ sum (map (_* m) ns)
79+
^-distribʳ-product : ∀ m ns → product ns ^ m ≡ product (map (_^ m) ns)
80+
```
81+
7582
* In `Data.Nat.Properties`:
7683
```agda
7784
≟-≢ : (m≢n : m ≢ n) → (m ≟ n) ≡ no m≢n
7885
∸-suc : m ≤ n → suc n ∸ m ≡ suc (n ∸ m)
86+
^-distribʳ-* : ∀ m n o → (n * o) ^ m ≡ n ^ m * o ^ m
7987
```
8088

8189
* In `Data.Vec.Properties`:

src/Data/Nat/ListAction/Properties.agda

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,23 +12,25 @@
1212
module Data.Nat.ListAction.Properties where
1313

1414
open import Algebra.Bundles using (CommutativeMonoid)
15-
open import Data.List.Base using (List; []; _∷_; _++_)
15+
open import Data.List.Base using (List; []; _∷_; _++_; map)
1616
open import Data.List.Membership.Propositional using (_∈_)
1717
open import Data.List.Relation.Binary.Permutation.Propositional
1818
using (_↭_; ↭⇒↭ₛ)
1919
open import Data.List.Relation.Binary.Permutation.Setoid.Properties
2020
using (foldr-commMonoid)
2121
open import Data.List.Relation.Unary.All using (All; []; _∷_)
2222
open import Data.List.Relation.Unary.Any using (here; there)
23-
open import Data.Nat.Base using (ℕ; _+_; _*_; NonZero; _≤_)
23+
open import Data.Nat.Base using (ℕ; _+_; _*_; _^_; NonZero; _≤_)
2424
open import Data.Nat.Divisibility using (_∣_; m∣m*n; ∣n⇒∣m*n)
2525
open import Data.Nat.ListAction using (sum; product)
2626
open import Data.Nat.Properties
2727
using (+-assoc; *-assoc; *-identityˡ; m*n≢0; m≤m*n; m≤n⇒m≤o*n
28-
; +-0-commutativeMonoid; *-1-commutativeMonoid)
28+
; +-0-commutativeMonoid; *-1-commutativeMonoid
29+
; *-zeroˡ; *-zeroʳ; *-distribˡ-+; *-distribʳ-+
30+
; ^-zeroˡ; ^-distribʳ-*)
2931
open import Relation.Binary.Core using (_Preserves_⟶_)
3032
open import Relation.Binary.PropositionalEquality.Core
31-
using (_≡_; refl; sym; cong)
33+
using (_≡_; refl; sym; trans; cong)
3234
open import Relation.Binary.PropositionalEquality.Properties
3335
using (module ≡-Reasoning)
3436

@@ -51,6 +53,14 @@ sum-++ (m ∷ ms) ns = begin
5153
(m + sum ms) + sum ns ∎
5254
where open ≡-Reasoning
5355

56+
*-distribˡ-sum : m ns m * sum ns ≡ sum (map (m *_) ns)
57+
*-distribˡ-sum m [] = *-zeroʳ m
58+
*-distribˡ-sum m (n ∷ ns) = trans (*-distribˡ-+ m n (sum ns)) (cong (m * n +_) (*-distribˡ-sum m ns))
59+
60+
*-distribʳ-sum : m ns sum ns * m ≡ sum (map (_* m) ns)
61+
*-distribʳ-sum m [] = *-zeroˡ m
62+
*-distribʳ-sum m (n ∷ ns) = trans (*-distribʳ-+ m n (sum ns)) (cong (n * m +_) (*-distribʳ-sum m ns))
63+
5464
sum-↭ : sum Preserves _↭_ ⟶ _≡_
5565
sum-↭ p = foldr-commMonoid ℕ-+-0.setoid ℕ-+-0.isCommutativeMonoid (↭⇒↭ₛ p)
5666
where module ℕ-+-0 = CommutativeMonoid +-0-commutativeMonoid
@@ -78,6 +88,10 @@ product≢0 (n≢0 ∷ ns≢0) = m*n≢0 _ _ {{n≢0}} {{product≢0 ns≢0}}
7888
∈⇒≤product (n≢0 ∷ ns≢0) (here refl) = m≤m*n _ _ {{product≢0 ns≢0}}
7989
∈⇒≤product (n≢0 ∷ ns≢0) (there n∈ns) = m≤n⇒m≤o*n _ {{n≢0}} (∈⇒≤product ns≢0 n∈ns)
8090

91+
^-distribʳ-product : m ns product ns ^ m ≡ product (map (_^ m) ns)
92+
^-distribʳ-product m [] = ^-zeroˡ m
93+
^-distribʳ-product m (n ∷ ns) = trans (^-distribʳ-* m n (product ns)) (cong (n ^ m *_) (^-distribʳ-product m ns))
94+
8195
product-↭ : product Preserves _↭_ ⟶ _≡_
8296
product-↭ p = foldr-commMonoid ℕ-*-1.setoid ℕ-*-1.isCommutativeMonoid (↭⇒↭ₛ p)
8397
where module ℕ-*-1 = CommutativeMonoid *-1-commutativeMonoid

src/Data/Nat/Properties.agda

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,13 @@ m<n⇒m<o*n = m≤n⇒m≤o*n
10671067
m * ((m ^ n) * (m ^ o)) ≡⟨ sym (*-assoc m _ _) ⟩
10681068
(m * (m ^ n)) * (m ^ o) ∎
10691069

1070+
^-distribʳ-* : m n o (n * o) ^ m ≡ n ^ m * o ^ m
1071+
^-distribʳ-* zero n o = sym (*-identityˡ 1)
1072+
^-distribʳ-* (suc m) n o = begin-equality
1073+
(n * o) * (n * o) ^ m ≡⟨ cong (n * o *_) (^-distribʳ-* m n o) ⟩
1074+
(n * o) * (n ^ m * o ^ m) ≡⟨ [m*n]*[o*p]≡[m*o]*[n*p] n o (n ^ m) (o ^ m) ⟩
1075+
n ^ suc m * o ^ suc m ∎
1076+
10701077
^-semigroup-morphism : {n} (n ^_) Is +-semigroup -Semigroup⟶ *-semigroup
10711078
^-semigroup-morphism = record
10721079
{ ⟦⟧-cong = cong (_ ^_)

0 commit comments

Comments
 (0)