12
12
module Data.Nat.ListAction.Properties where
13
13
14
14
open import Algebra.Bundles using (CommutativeMonoid)
15
- open import Data.List.Base using (List; []; _∷_; _++_)
15
+ open import Data.List.Base using (List; []; _∷_; _++_; map )
16
16
open import Data.List.Membership.Propositional using (_∈_)
17
17
open import Data.List.Relation.Binary.Permutation.Propositional
18
18
using (_↭_; ↭⇒↭ₛ)
19
19
open import Data.List.Relation.Binary.Permutation.Setoid.Properties
20
20
using (foldr-commMonoid)
21
21
open import Data.List.Relation.Unary.All using (All; []; _∷_)
22
22
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; _≤_)
24
24
open import Data.Nat.Divisibility using (_∣_; m∣m*n; ∣n⇒∣m*n)
25
25
open import Data.Nat.ListAction using (sum; product)
26
26
open import Data.Nat.Properties
27
27
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ʳ-*)
29
31
open import Relation.Binary.Core using (_Preserves_⟶_)
30
32
open import Relation.Binary.PropositionalEquality.Core
31
- using (_≡_; refl; sym; cong)
33
+ using (_≡_; refl; sym; trans; cong)
32
34
open import Relation.Binary.PropositionalEquality.Properties
33
35
using (module ≡-Reasoning )
34
36
@@ -51,6 +53,14 @@ sum-++ (m ∷ ms) ns = begin
51
53
(m + sum ms) + sum ns ∎
52
54
where open ≡-Reasoning
53
55
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
+
54
64
sum-↭ : sum Preserves _↭_ ⟶ _≡_
55
65
sum-↭ p = foldr-commMonoid ℕ-+-0.setoid ℕ-+-0.isCommutativeMonoid (↭⇒↭ₛ p)
56
66
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}}
78
88
∈⇒≤product (n≢0 ∷ ns≢0) (here refl) = m≤m*n _ _ {{product≢0 ns≢0}}
79
89
∈⇒≤product (n≢0 ∷ ns≢0) (there n∈ns) = m≤n⇒m≤o*n _ {{n≢0}} (∈⇒≤product ns≢0 n∈ns)
80
90
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
+
81
95
product-↭ : product Preserves _↭_ ⟶ _≡_
82
96
product-↭ p = foldr-commMonoid ℕ-*-1.setoid ℕ-*-1.isCommutativeMonoid (↭⇒↭ₛ p)
83
97
where module ℕ-*-1 = CommutativeMonoid *-1-commutativeMonoid
0 commit comments