diff --git a/src/commutative-algebra.lagda.md b/src/commutative-algebra.lagda.md
index 7719d0d4d2..9d4aa29857 100644
--- a/src/commutative-algebra.lagda.md
+++ b/src/commutative-algebra.lagda.md
@@ -16,6 +16,8 @@ open import commutative-algebra.dependent-products-commutative-semirings public
open import commutative-algebra.discrete-fields public
open import commutative-algebra.eisenstein-integers public
open import commutative-algebra.euclidean-domains public
+open import commutative-algebra.formal-power-series-commutative-rings public
+open import commutative-algebra.formal-power-series-commutative-semirings public
open import commutative-algebra.full-ideals-commutative-rings public
open import commutative-algebra.function-commutative-rings public
open import commutative-algebra.function-commutative-semirings public
diff --git a/src/commutative-algebra/commutative-rings.lagda.md b/src/commutative-algebra/commutative-rings.lagda.md
index 06b3e5d600..8460281728 100644
--- a/src/commutative-algebra/commutative-rings.lagda.md
+++ b/src/commutative-algebra/commutative-rings.lagda.md
@@ -318,6 +318,10 @@ module _
add-Commutative-Ring (neg-Commutative-Ring x) (neg-Commutative-Ring y)
distributive-neg-add-Commutative-Ring =
distributive-neg-add-Ab ab-Commutative-Ring
+
+ neg-zero-Commutative-Ring :
+ neg-Commutative-Ring zero-Commutative-Ring = zero-Commutative-Ring
+ neg-zero-Commutative-Ring = neg-zero-Ring ring-Commutative-Ring
```
### Multiplication in a commutative ring
diff --git a/src/commutative-algebra/commutative-semirings.lagda.md b/src/commutative-algebra/commutative-semirings.lagda.md
index 78e21f5b30..257f89fa25 100644
--- a/src/commutative-algebra/commutative-semirings.lagda.md
+++ b/src/commutative-algebra/commutative-semirings.lagda.md
@@ -10,6 +10,7 @@ module commutative-algebra.commutative-semirings where
open import elementary-number-theory.addition-natural-numbers
open import elementary-number-theory.natural-numbers
+open import foundation.action-on-identifications-binary-functions
open import foundation.dependent-pair-types
open import foundation.identity-types
open import foundation.iterated-dependent-product-types
@@ -176,6 +177,11 @@ module _
(x y : type-Commutative-Semiring) → type-Commutative-Semiring
mul-Commutative-Semiring' = mul-Semiring' semiring-Commutative-Semiring
+ ap-mul-Commutative-Semiring :
+ {x x' y y' : type-Commutative-Semiring} (p : Id x x') (q : Id y y') →
+ Id (mul-Commutative-Semiring x y) (mul-Commutative-Semiring x' y')
+ ap-mul-Commutative-Semiring p q = ap-binary mul-Commutative-Semiring p q
+
one-Commutative-Semiring : type-Commutative-Semiring
one-Commutative-Semiring = one-Semiring semiring-Commutative-Semiring
diff --git a/src/commutative-algebra/formal-power-series-commutative-rings.lagda.md b/src/commutative-algebra/formal-power-series-commutative-rings.lagda.md
new file mode 100644
index 0000000000..d57d960cb8
--- /dev/null
+++ b/src/commutative-algebra/formal-power-series-commutative-rings.lagda.md
@@ -0,0 +1,657 @@
+# Formal power series on commutative rings
+
+```agda
+module commutative-algebra.formal-power-series-commutative-rings where
+```
+
+Imports
+
+```agda
+open import commutative-algebra.commutative-rings
+open import commutative-algebra.commutative-semirings
+open import commutative-algebra.formal-power-series-commutative-semirings
+
+open import elementary-number-theory.natural-numbers
+
+open import foundation.dependent-pair-types
+open import foundation.function-extensionality
+open import foundation.function-types
+open import foundation.homotopies
+open import foundation.identity-types
+open import foundation.sets
+open import foundation.unital-binary-operations
+open import foundation.universe-levels
+
+open import group-theory.abelian-groups
+open import group-theory.commutative-monoids
+open import group-theory.groups
+open import group-theory.monoids
+open import group-theory.semigroups
+
+open import ring-theory.rings
+open import ring-theory.semirings
+```
+
+
+
+## Idea
+
+A
+{{#concept "formal power series" Agda=formal-power-series-Commutative-Ring WDID=Q1003025 WD="formal power series"}}
+in a [commutative ring](commutative-algebra.commutative-rings.md) `R` is a
+symbolic infinite sum over all `n : ℕ` of `cₙ xⁿ`, where `cₙ : R`. Convergence
+of this sum is not relevant, but with the standard definitions of addition and
+multiplication for power series, this forms a new commutative ring.
+
+## Definition
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ formal-power-series-Commutative-Ring : UU l
+ formal-power-series-Commutative-Ring =
+ formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ formal-power-series-coefficients-Commutative-Ring :
+ (ℕ → type-Commutative-Ring R) →
+ formal-power-series-Commutative-Ring
+ formal-power-series-coefficients-Commutative-Ring =
+ formal-power-series-coefficients-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ coefficient-formal-power-series-Commutative-Ring :
+ formal-power-series-Commutative-Ring → ℕ → type-Commutative-Ring R
+ coefficient-formal-power-series-Commutative-Ring =
+ coefficient-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ coefficient-formal-power-series-coefficients-Commutative-Ring :
+ (c : ℕ → type-Commutative-Ring R) →
+ coefficient-formal-power-series-Commutative-Ring
+ (formal-power-series-coefficients-Commutative-Ring c) ~ c
+ coefficient-formal-power-series-coefficients-Commutative-Ring =
+ coefficient-formal-power-series-coefficients-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ eq-formal-power-series-coefficients-Commutative-Ring :
+ (p : formal-power-series-Commutative-Ring) →
+ p =
+ formal-power-series-coefficients-Commutative-Ring
+ ( coefficient-formal-power-series-Commutative-Ring p)
+ eq-formal-power-series-coefficients-Commutative-Ring =
+ eq-formal-power-series-coefficients-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ eq-htpy-coefficients-formal-power-series-Commutative-Ring :
+ ( p q : formal-power-series-Commutative-Ring) →
+ ( coefficient-formal-power-series-Commutative-Ring p ~
+ coefficient-formal-power-series-Commutative-Ring q) →
+ p = q
+ eq-htpy-coefficients-formal-power-series-Commutative-Ring =
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ is-set-formal-power-series-Commutative-Ring :
+ is-set formal-power-series-Commutative-Ring
+ is-set-formal-power-series-Commutative-Ring =
+ is-set-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ set-formal-power-series-Commutative-Ring : Set l
+ set-formal-power-series-Commutative-Ring =
+ set-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+## Operations
+
+### Zero formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ zero-formal-power-series-Commutative-Ring :
+ formal-power-series-Commutative-Ring R
+ zero-formal-power-series-Commutative-Ring =
+ zero-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ eq-coefficient-zero-formal-power-series-Commutative-Ring :
+ zero-formal-power-series-Commutative-Ring =
+ formal-power-series-coefficients-Commutative-Ring
+ ( R)
+ ( λ _ → zero-Commutative-Ring R)
+ eq-coefficient-zero-formal-power-series-Commutative-Ring =
+ eq-coefficient-zero-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ htpy-coefficient-zero-formal-power-series-Commutative-Ring :
+ coefficient-formal-power-series-Commutative-Ring
+ ( R)
+ ( zero-formal-power-series-Commutative-Ring) ~
+ ( λ _ → zero-Commutative-Ring R)
+ htpy-coefficient-zero-formal-power-series-Commutative-Ring =
+ htpy-coefficient-zero-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+### Constant formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ coefficient-constant-formal-power-series-Commutative-Ring :
+ type-Commutative-Ring R → ℕ → type-Commutative-Ring R
+ coefficient-constant-formal-power-series-Commutative-Ring =
+ coefficient-constant-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ coefficient-nonzero-constant-formal-power-series-Commutative-Ring :
+ (c : type-Commutative-Ring R) → (n : ℕ) → is-nonzero-ℕ n →
+ is-zero-Commutative-Ring R
+ ( coefficient-constant-formal-power-series-Commutative-Ring c n)
+ coefficient-nonzero-constant-formal-power-series-Commutative-Ring =
+ coefficient-nonzero-constant-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ constant-formal-power-series-Commutative-Ring :
+ type-Commutative-Ring R → formal-power-series-Commutative-Ring R
+ constant-formal-power-series-Commutative-Ring =
+ constant-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ eq-coefficient-constant-formal-power-series-Commutative-Ring :
+ (c : type-Commutative-Ring R) →
+ constant-formal-power-series-Commutative-Ring c =
+ formal-power-series-coefficients-Commutative-Ring
+ ( R)
+ ( coefficient-constant-formal-power-series-Commutative-Ring c)
+ eq-coefficient-constant-formal-power-series-Commutative-Ring =
+ eq-coefficient-constant-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ one-formal-power-series-Commutative-Ring :
+ formal-power-series-Commutative-Ring R
+ one-formal-power-series-Commutative-Ring =
+ one-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+#### The zero formal power series is the constant formal power series for zero
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ eq-zero-constant-formal-power-series-Commutative-Ring :
+ constant-formal-power-series-Commutative-Ring R (zero-Commutative-Ring R) =
+ zero-formal-power-series-Commutative-Ring R
+ eq-zero-constant-formal-power-series-Commutative-Ring =
+ eq-zero-constant-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+### Addition
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ coefficient-add-formal-power-series-Commutative-Ring :
+ (p q : formal-power-series-Commutative-Ring R) (n : ℕ) →
+ type-Commutative-Ring R
+ coefficient-add-formal-power-series-Commutative-Ring =
+ coefficient-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ add-formal-power-series-Commutative-Ring :
+ formal-power-series-Commutative-Ring R →
+ formal-power-series-Commutative-Ring R →
+ formal-power-series-Commutative-Ring R
+ add-formal-power-series-Commutative-Ring =
+ add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ eq-coefficient-add-formal-power-series-Commutative-Ring :
+ (p q : formal-power-series-Commutative-Ring R) →
+ add-formal-power-series-Commutative-Ring p q =
+ formal-power-series-coefficients-Commutative-Ring
+ ( R)
+ ( coefficient-add-formal-power-series-Commutative-Ring p q)
+ eq-coefficient-add-formal-power-series-Commutative-Ring =
+ eq-coefficient-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ htpy-coefficient-add-formal-power-series-Commutative-Ring :
+ (p q : formal-power-series-Commutative-Ring R) →
+ coefficient-formal-power-series-Commutative-Ring
+ ( R)
+ ( add-formal-power-series-Commutative-Ring p q) ~
+ coefficient-add-formal-power-series-Commutative-Ring p q
+ htpy-coefficient-add-formal-power-series-Commutative-Ring =
+ htpy-coefficient-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+#### Commutativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ commutative-add-formal-power-series-Commutative-Ring :
+ (p q : formal-power-series-Commutative-Ring R) →
+ add-formal-power-series-Commutative-Ring R p q =
+ add-formal-power-series-Commutative-Ring R q p
+ commutative-add-formal-power-series-Commutative-Ring =
+ commutative-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+#### Unit laws
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ left-unit-law-add-formal-power-series-Commutative-Ring :
+ (p : formal-power-series-Commutative-Ring R) →
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( zero-formal-power-series-Commutative-Ring R)
+ ( p) = p
+ left-unit-law-add-formal-power-series-Commutative-Ring =
+ left-unit-law-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ right-unit-law-add-formal-power-series-Commutative-Ring :
+ (p : formal-power-series-Commutative-Ring R) →
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( zero-formal-power-series-Commutative-Ring R) = p
+ right-unit-law-add-formal-power-series-Commutative-Ring =
+ right-unit-law-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+#### Associativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ associative-add-formal-power-series-Commutative-Ring :
+ (p q r : formal-power-series-Commutative-Ring R) →
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( add-formal-power-series-Commutative-Ring R p q)
+ ( r) =
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( add-formal-power-series-Commutative-Ring R q r)
+ associative-add-formal-power-series-Commutative-Ring =
+ associative-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+### Negation
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p : formal-power-series-Commutative-Ring R)
+ where
+
+ opaque
+ neg-formal-power-series-Commutative-Ring :
+ formal-power-series-Commutative-Ring R
+ neg-formal-power-series-Commutative-Ring =
+ formal-power-series-coefficients-Commutative-Ring
+ ( R)
+ ( neg-Commutative-Ring R ∘
+ coefficient-formal-power-series-Commutative-Ring R p)
+
+ htpy-coefficient-neg-formal-power-series-Commutative-Ring :
+ coefficient-formal-power-series-Commutative-Ring
+ ( R)
+ ( neg-formal-power-series-Commutative-Ring) ~
+ neg-Commutative-Ring R ∘
+ coefficient-formal-power-series-Commutative-Ring R p
+ htpy-coefficient-neg-formal-power-series-Commutative-Ring =
+ coefficient-formal-power-series-coefficients-Commutative-Ring R _
+
+ eq-coefficient-neg-formal-power-series-Commutative-Ring :
+ neg-formal-power-series-Commutative-Ring =
+ formal-power-series-coefficients-Commutative-Ring
+ ( R)
+ ( neg-Commutative-Ring R ∘
+ coefficient-formal-power-series-Commutative-Ring R p)
+ eq-coefficient-neg-formal-power-series-Commutative-Ring = refl
+```
+
+#### Inverse laws for addition
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p : formal-power-series-Commutative-Ring R)
+ where
+
+ abstract
+ left-inverse-law-add-formal-power-series-Commutative-Ring :
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( neg-formal-power-series-Commutative-Ring R p)
+ ( p) =
+ zero-formal-power-series-Commutative-Ring R
+ left-inverse-law-add-formal-power-series-Commutative-Ring =
+ eq-htpy-coefficients-formal-power-series-Commutative-Ring
+ ( R)
+ ( _)
+ ( _)
+ ( λ n →
+ htpy-coefficient-add-formal-power-series-Commutative-Ring R _ _ n ∙
+ ap-add-Commutative-Ring
+ ( R)
+ ( htpy-coefficient-neg-formal-power-series-Commutative-Ring R p n)
+ ( refl) ∙
+ left-inverse-law-add-Commutative-Ring R _ ∙
+ inv (htpy-coefficient-zero-formal-power-series-Commutative-Ring R n))
+
+ right-inverse-law-add-formal-power-series-Commutative-Ring :
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( neg-formal-power-series-Commutative-Ring R p) =
+ zero-formal-power-series-Commutative-Ring R
+ right-inverse-law-add-formal-power-series-Commutative-Ring =
+ commutative-add-formal-power-series-Commutative-Ring R _ _ ∙
+ left-inverse-law-add-formal-power-series-Commutative-Ring
+```
+
+#### The additive Abelian group of formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ semigroup-add-formal-power-series-Commutative-Ring : Semigroup l
+ semigroup-add-formal-power-series-Commutative-Ring =
+ semigroup-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ is-unital-add-formal-power-series-Commutative-Ring :
+ is-unital (add-formal-power-series-Commutative-Ring R)
+ is-unital-add-formal-power-series-Commutative-Ring =
+ is-unital-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ monoid-add-formal-power-series-Commutative-Ring : Monoid l
+ monoid-add-formal-power-series-Commutative-Ring =
+ monoid-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ commutative-monoid-add-formal-power-series-Commutative-Ring :
+ Commutative-Monoid l
+ commutative-monoid-add-formal-power-series-Commutative-Ring =
+ commutative-monoid-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+ group-add-formal-power-series-Commutative-Ring : Group l
+ group-add-formal-power-series-Commutative-Ring =
+ semigroup-add-formal-power-series-Commutative-Ring ,
+ is-unital-add-formal-power-series-Commutative-Ring ,
+ neg-formal-power-series-Commutative-Ring R ,
+ left-inverse-law-add-formal-power-series-Commutative-Ring R ,
+ right-inverse-law-add-formal-power-series-Commutative-Ring R
+
+ abelian-group-add-formal-power-series-Commutative-Ring : Ab l
+ abelian-group-add-formal-power-series-Commutative-Ring =
+ group-add-formal-power-series-Commutative-Ring ,
+ commutative-add-formal-power-series-Commutative-Ring R
+```
+
+### Multiplication
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p q : formal-power-series-Commutative-Ring R)
+ where
+
+ coefficient-mul-formal-power-series-Commutative-Ring :
+ ℕ → type-Commutative-Ring R
+ coefficient-mul-formal-power-series-Commutative-Ring =
+ coefficient-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+ ( q)
+
+ mul-formal-power-series-Commutative-Ring :
+ formal-power-series-Commutative-Ring R
+ mul-formal-power-series-Commutative-Ring =
+ mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+ ( q)
+
+ eq-coefficient-mul-formal-power-series-Commutative-Ring :
+ coefficient-formal-power-series-Commutative-Ring
+ ( R)
+ ( mul-formal-power-series-Commutative-Ring) ~
+ coefficient-mul-formal-power-series-Commutative-Ring
+ eq-coefficient-mul-formal-power-series-Commutative-Ring =
+ eq-coefficient-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+ ( q)
+```
+
+#### Commutativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p q : formal-power-series-Commutative-Ring R)
+ where
+
+ commutative-mul-formal-power-series-Commutative-Ring :
+ mul-formal-power-series-Commutative-Ring R p q =
+ mul-formal-power-series-Commutative-Ring R q p
+ commutative-mul-formal-power-series-Commutative-Ring =
+ commutative-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+ ( q)
+```
+
+#### Associativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p q r : formal-power-series-Commutative-Ring R)
+ where
+
+ associative-mul-formal-power-series-Commutative-Ring :
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( mul-formal-power-series-Commutative-Ring R p q)
+ ( r) =
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( mul-formal-power-series-Commutative-Ring R q r)
+ associative-mul-formal-power-series-Commutative-Ring =
+ associative-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+ ( q)
+ ( r)
+```
+
+#### Unit laws
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p : formal-power-series-Commutative-Ring R)
+ where
+
+ left-unit-law-mul-formal-power-series-Commutative-Ring :
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( one-formal-power-series-Commutative-Ring R)
+ ( p) = p
+ left-unit-law-mul-formal-power-series-Commutative-Ring =
+ left-unit-law-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+
+ right-unit-law-mul-formal-power-series-Commutative-Ring :
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( one-formal-power-series-Commutative-Ring R) = p
+ right-unit-law-mul-formal-power-series-Commutative-Ring =
+ right-unit-law-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+```
+
+#### Zero laws of multiplication
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ (p : formal-power-series-Commutative-Ring R)
+ where
+
+ left-zero-law-mul-formal-power-series-Commutative-Ring :
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( zero-formal-power-series-Commutative-Ring R)
+ ( p) =
+ zero-formal-power-series-Commutative-Ring R
+ left-zero-law-mul-formal-power-series-Commutative-Ring =
+ left-zero-law-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+
+ right-zero-law-mul-formal-power-series-Commutative-Ring :
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( zero-formal-power-series-Commutative-Ring R) =
+ zero-formal-power-series-Commutative-Ring R
+ right-zero-law-mul-formal-power-series-Commutative-Ring =
+ right-zero-law-mul-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( p)
+```
+
+#### Distributivity of multiplication over addition
+
+```agda
+left-distributive-mul-add-formal-power-series-Commutative-Ring :
+ {l : Level} (R : Commutative-Ring l) →
+ (p q r : formal-power-series-Commutative-Ring R) →
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( p)
+ ( add-formal-power-series-Commutative-Ring R q r) =
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( mul-formal-power-series-Commutative-Ring R p q)
+ ( mul-formal-power-series-Commutative-Ring R p r)
+left-distributive-mul-add-formal-power-series-Commutative-Ring R =
+ left-distributive-mul-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+
+right-distributive-mul-add-formal-power-series-Commutative-Ring :
+ {l : Level} (R : Commutative-Ring l) →
+ (p q r : formal-power-series-Commutative-Ring R) →
+ mul-formal-power-series-Commutative-Ring
+ ( R)
+ ( add-formal-power-series-Commutative-Ring R p q)
+ ( r) =
+ add-formal-power-series-Commutative-Ring
+ ( R)
+ ( mul-formal-power-series-Commutative-Ring R p r)
+ ( mul-formal-power-series-Commutative-Ring R q r)
+right-distributive-mul-add-formal-power-series-Commutative-Ring R =
+ right-distributive-mul-add-formal-power-series-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+```
+
+### The commutative ring of formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Ring l)
+ where
+
+ has-associative-mul-formal-power-series-Commutative-Ring :
+ has-associative-mul (formal-power-series-Commutative-Ring R)
+ has-associative-mul-formal-power-series-Commutative-Ring =
+ mul-formal-power-series-Commutative-Ring R ,
+ associative-mul-formal-power-series-Commutative-Ring R
+
+ unit-laws-mul-formal-power-series-Commutative-Ring :
+ unit-laws
+ ( mul-formal-power-series-Commutative-Ring R)
+ ( one-formal-power-series-Commutative-Ring R)
+ unit-laws-mul-formal-power-series-Commutative-Ring =
+ left-unit-law-mul-formal-power-series-Commutative-Ring R ,
+ right-unit-law-mul-formal-power-series-Commutative-Ring R
+
+ is-unital-mul-formal-power-series-Commutative-Ring :
+ is-unital (mul-formal-power-series-Commutative-Ring R)
+ is-unital-mul-formal-power-series-Commutative-Ring =
+ one-formal-power-series-Commutative-Ring R ,
+ unit-laws-mul-formal-power-series-Commutative-Ring
+
+ semiring-formal-power-series-Commutative-Ring : Semiring l
+ semiring-formal-power-series-Commutative-Ring =
+ commutative-monoid-add-formal-power-series-Commutative-Ring R ,
+ ( has-associative-mul-formal-power-series-Commutative-Ring ,
+ is-unital-mul-formal-power-series-Commutative-Ring ,
+ left-distributive-mul-add-formal-power-series-Commutative-Ring R ,
+ right-distributive-mul-add-formal-power-series-Commutative-Ring R) ,
+ left-zero-law-mul-formal-power-series-Commutative-Ring R ,
+ right-zero-law-mul-formal-power-series-Commutative-Ring R
+
+ commutative-semiring-formal-power-series-Commutative-Ring :
+ Commutative-Semiring l
+ commutative-semiring-formal-power-series-Commutative-Ring =
+ semiring-formal-power-series-Commutative-Ring ,
+ commutative-mul-formal-power-series-Commutative-Ring R
+
+ ring-formal-power-series-Commutative-Ring : Ring l
+ ring-formal-power-series-Commutative-Ring =
+ abelian-group-add-formal-power-series-Commutative-Ring R ,
+ has-associative-mul-formal-power-series-Commutative-Ring ,
+ is-unital-mul-formal-power-series-Commutative-Ring ,
+ left-distributive-mul-add-formal-power-series-Commutative-Ring R ,
+ right-distributive-mul-add-formal-power-series-Commutative-Ring R
+
+ commutative-ring-formal-power-series-Commutative-Ring : Commutative-Ring l
+ commutative-ring-formal-power-series-Commutative-Ring =
+ ring-formal-power-series-Commutative-Ring ,
+ commutative-mul-formal-power-series-Commutative-Ring R
+```
diff --git a/src/commutative-algebra/formal-power-series-commutative-semirings.lagda.md b/src/commutative-algebra/formal-power-series-commutative-semirings.lagda.md
new file mode 100644
index 0000000000..512f6773a2
--- /dev/null
+++ b/src/commutative-algebra/formal-power-series-commutative-semirings.lagda.md
@@ -0,0 +1,876 @@
+# Formal power series on commutative semirings
+
+```agda
+{-# OPTIONS --lossy-unification #-}
+
+module commutative-algebra.formal-power-series-commutative-semirings where
+```
+
+Imports
+
+```agda
+open import commutative-algebra.commutative-semirings
+open import commutative-algebra.sums-commutative-semirings
+
+open import elementary-number-theory.addition-natural-numbers
+open import elementary-number-theory.equality-natural-numbers
+open import elementary-number-theory.inequality-natural-numbers
+open import elementary-number-theory.natural-numbers
+open import elementary-number-theory.pairs-with-natural-sums
+open import elementary-number-theory.strict-inequality-natural-numbers
+
+open import foundation.action-on-identifications-binary-functions
+open import foundation.action-on-identifications-functions
+open import foundation.coproduct-types
+open import foundation.dependent-pair-types
+open import foundation.empty-types
+open import foundation.function-extensionality
+open import foundation.function-types
+open import foundation.homotopies
+open import foundation.identity-types
+open import foundation.sets
+open import foundation.unit-type
+open import foundation.unital-binary-operations
+open import foundation.universe-levels
+
+open import group-theory.abelian-groups
+open import group-theory.commutative-monoids
+open import group-theory.function-commutative-monoids
+open import group-theory.groups
+open import group-theory.monoids
+open import group-theory.semigroups
+
+open import ring-theory.semirings
+
+open import univalent-combinatorics.dependent-pair-types
+```
+
+
+
+## Idea
+
+A
+{{#concept "formal power series" Agda=formal-power-series-Commutative-Semiring WDID=Q1003025 WD="formal power series"}}
+in a [commutative semiring](commutative-algebra.commutative-semirings.md) `R` is
+a symbolic infinite sum over all `n : ℕ` of `cₙ xⁿ`, where `cₙ : R`. Convergence
+of this sum is not relevant, but with the standard definitions of addition and
+multiplication for power series, this forms a new commutative semiring.
+
+## Definition
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ opaque
+ formal-power-series-Commutative-Semiring : UU l
+ formal-power-series-Commutative-Semiring = ℕ → type-Commutative-Semiring R
+
+ formal-power-series-coefficients-Commutative-Semiring :
+ (ℕ → type-Commutative-Semiring R) →
+ formal-power-series-Commutative-Semiring
+ formal-power-series-coefficients-Commutative-Semiring = id
+
+ coefficient-formal-power-series-Commutative-Semiring :
+ formal-power-series-Commutative-Semiring → ℕ → type-Commutative-Semiring R
+ coefficient-formal-power-series-Commutative-Semiring = id
+
+ coefficient-formal-power-series-coefficients-Commutative-Semiring :
+ (c : ℕ → type-Commutative-Semiring R) →
+ coefficient-formal-power-series-Commutative-Semiring
+ (formal-power-series-coefficients-Commutative-Semiring c) ~ c
+ coefficient-formal-power-series-coefficients-Commutative-Semiring _ _ = refl
+
+ eq-formal-power-series-coefficients-Commutative-Semiring :
+ (p : formal-power-series-Commutative-Semiring) →
+ p =
+ formal-power-series-coefficients-Commutative-Semiring
+ ( coefficient-formal-power-series-Commutative-Semiring p)
+ eq-formal-power-series-coefficients-Commutative-Semiring _ = refl
+
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring :
+ ( p q : formal-power-series-Commutative-Semiring) →
+ ( coefficient-formal-power-series-Commutative-Semiring p ~
+ coefficient-formal-power-series-Commutative-Semiring q) →
+ p = q
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring _ _ = eq-htpy
+
+ is-set-formal-power-series-Commutative-Semiring :
+ is-set formal-power-series-Commutative-Semiring
+ is-set-formal-power-series-Commutative-Semiring =
+ is-set-function-type (is-set-type-Set (set-Commutative-Semiring R))
+
+ set-formal-power-series-Commutative-Semiring : Set l
+ set-formal-power-series-Commutative-Semiring =
+ formal-power-series-Commutative-Semiring ,
+ is-set-formal-power-series-Commutative-Semiring
+```
+
+## Operations
+
+### Zero formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ opaque
+ unfolding formal-power-series-Commutative-Semiring
+
+ zero-formal-power-series-Commutative-Semiring :
+ formal-power-series-Commutative-Semiring R
+ zero-formal-power-series-Commutative-Semiring _ =
+ zero-Commutative-Semiring R
+
+ eq-coefficient-zero-formal-power-series-Commutative-Semiring :
+ zero-formal-power-series-Commutative-Semiring =
+ formal-power-series-coefficients-Commutative-Semiring
+ ( R)
+ ( λ _ → zero-Commutative-Semiring R)
+ eq-coefficient-zero-formal-power-series-Commutative-Semiring = refl
+
+ htpy-coefficient-zero-formal-power-series-Commutative-Semiring :
+ coefficient-formal-power-series-Commutative-Semiring
+ ( R)
+ ( zero-formal-power-series-Commutative-Semiring) ~
+ ( λ _ → zero-Commutative-Semiring R)
+ htpy-coefficient-zero-formal-power-series-Commutative-Semiring _ = refl
+```
+
+### Constant formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ coefficient-constant-formal-power-series-Commutative-Semiring :
+ type-Commutative-Semiring R → ℕ → type-Commutative-Semiring R
+ coefficient-constant-formal-power-series-Commutative-Semiring c zero-ℕ = c
+ coefficient-constant-formal-power-series-Commutative-Semiring c (succ-ℕ _) =
+ zero-Commutative-Semiring R
+
+ coefficient-nonzero-constant-formal-power-series-Commutative-Semiring :
+ (c : type-Commutative-Semiring R) → (n : ℕ) → is-nonzero-ℕ n →
+ is-zero-Commutative-Semiring R
+ ( coefficient-constant-formal-power-series-Commutative-Semiring c n)
+ coefficient-nonzero-constant-formal-power-series-Commutative-Semiring
+ c zero-ℕ H = ex-falso (H refl)
+ coefficient-nonzero-constant-formal-power-series-Commutative-Semiring
+ c (succ-ℕ _) _ = refl
+
+ opaque
+ unfolding formal-power-series-Commutative-Semiring
+
+ constant-formal-power-series-Commutative-Semiring :
+ type-Commutative-Semiring R → formal-power-series-Commutative-Semiring R
+ constant-formal-power-series-Commutative-Semiring =
+ coefficient-constant-formal-power-series-Commutative-Semiring
+
+ eq-coefficient-constant-formal-power-series-Commutative-Semiring :
+ (c : type-Commutative-Semiring R) →
+ constant-formal-power-series-Commutative-Semiring c =
+ formal-power-series-coefficients-Commutative-Semiring
+ ( R)
+ ( coefficient-constant-formal-power-series-Commutative-Semiring c)
+ eq-coefficient-constant-formal-power-series-Commutative-Semiring c = refl
+
+ one-formal-power-series-Commutative-Semiring :
+ formal-power-series-Commutative-Semiring R
+ one-formal-power-series-Commutative-Semiring =
+ constant-formal-power-series-Commutative-Semiring
+ ( one-Commutative-Semiring R)
+```
+
+#### The zero formal power series is the constant formal power series for zero
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ opaque
+ unfolding formal-power-series-Commutative-Semiring
+ unfolding zero-formal-power-series-Commutative-Semiring
+ unfolding constant-formal-power-series-Commutative-Semiring
+
+ eq-zero-constant-formal-power-series-Commutative-Semiring :
+ constant-formal-power-series-Commutative-Semiring
+ R (zero-Commutative-Semiring R) =
+ zero-formal-power-series-Commutative-Semiring R
+ eq-zero-constant-formal-power-series-Commutative-Semiring =
+ eq-htpy (λ { zero-ℕ → refl ; (succ-ℕ _) → refl})
+```
+
+### Addition
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ coefficient-add-formal-power-series-Commutative-Semiring :
+ (p q : formal-power-series-Commutative-Semiring R) (n : ℕ) →
+ type-Commutative-Semiring R
+ coefficient-add-formal-power-series-Commutative-Semiring p q =
+ mul-function-Commutative-Monoid
+ ( additive-commutative-monoid-Commutative-Semiring R)
+ ( ℕ)
+ ( coefficient-formal-power-series-Commutative-Semiring R p)
+ ( coefficient-formal-power-series-Commutative-Semiring R q)
+
+ opaque
+ unfolding formal-power-series-Commutative-Semiring
+
+ add-formal-power-series-Commutative-Semiring :
+ formal-power-series-Commutative-Semiring R →
+ formal-power-series-Commutative-Semiring R →
+ formal-power-series-Commutative-Semiring R
+ add-formal-power-series-Commutative-Semiring =
+ coefficient-add-formal-power-series-Commutative-Semiring
+
+ eq-coefficient-add-formal-power-series-Commutative-Semiring :
+ (p q : formal-power-series-Commutative-Semiring R) →
+ add-formal-power-series-Commutative-Semiring p q =
+ formal-power-series-coefficients-Commutative-Semiring
+ ( R)
+ ( coefficient-add-formal-power-series-Commutative-Semiring p q)
+ eq-coefficient-add-formal-power-series-Commutative-Semiring p q = refl
+
+ htpy-coefficient-add-formal-power-series-Commutative-Semiring :
+ (p q : formal-power-series-Commutative-Semiring R) →
+ coefficient-formal-power-series-Commutative-Semiring
+ ( R)
+ ( add-formal-power-series-Commutative-Semiring p q) ~
+ coefficient-add-formal-power-series-Commutative-Semiring p q
+ htpy-coefficient-add-formal-power-series-Commutative-Semiring p q n = refl
+```
+
+#### Commutativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ opaque
+ unfolding add-formal-power-series-Commutative-Semiring
+
+ commutative-add-formal-power-series-Commutative-Semiring :
+ (p q : formal-power-series-Commutative-Semiring R) →
+ add-formal-power-series-Commutative-Semiring R p q =
+ add-formal-power-series-Commutative-Semiring R q p
+ commutative-add-formal-power-series-Commutative-Semiring p q =
+ commutative-mul-function-Commutative-Monoid
+ ( additive-commutative-monoid-Commutative-Semiring R) ℕ _ _
+```
+
+#### Unit laws
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ opaque
+ unfolding add-formal-power-series-Commutative-Semiring
+ unfolding zero-formal-power-series-Commutative-Semiring
+
+ left-unit-law-add-formal-power-series-Commutative-Semiring :
+ (p : formal-power-series-Commutative-Semiring R) →
+ add-formal-power-series-Commutative-Semiring
+ ( R)
+ ( zero-formal-power-series-Commutative-Semiring R)
+ ( p) = p
+ left-unit-law-add-formal-power-series-Commutative-Semiring =
+ left-unit-law-mul-function-Commutative-Monoid
+ ( additive-commutative-monoid-Commutative-Semiring R)
+ ( ℕ)
+
+ right-unit-law-add-formal-power-series-Commutative-Semiring :
+ (p : formal-power-series-Commutative-Semiring R) →
+ add-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( zero-formal-power-series-Commutative-Semiring R) = p
+ right-unit-law-add-formal-power-series-Commutative-Semiring =
+ right-unit-law-mul-function-Commutative-Monoid
+ ( additive-commutative-monoid-Commutative-Semiring R)
+ ( ℕ)
+```
+
+#### Associativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ opaque
+ unfolding formal-power-series-Commutative-Semiring
+ unfolding add-formal-power-series-Commutative-Semiring
+
+ associative-add-formal-power-series-Commutative-Semiring :
+ (p q r : formal-power-series-Commutative-Semiring R) →
+ add-formal-power-series-Commutative-Semiring
+ ( R)
+ ( add-formal-power-series-Commutative-Semiring R p q)
+ ( r) =
+ add-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( add-formal-power-series-Commutative-Semiring R q r)
+ associative-add-formal-power-series-Commutative-Semiring =
+ associative-mul-function-Commutative-Monoid
+ ( additive-commutative-monoid-Commutative-Semiring R)
+ ( ℕ)
+```
+
+#### The additive commutative monoid of formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ semigroup-add-formal-power-series-Commutative-Semiring : Semigroup l
+ semigroup-add-formal-power-series-Commutative-Semiring =
+ set-formal-power-series-Commutative-Semiring R ,
+ add-formal-power-series-Commutative-Semiring R ,
+ associative-add-formal-power-series-Commutative-Semiring R
+
+ is-unital-add-formal-power-series-Commutative-Semiring :
+ is-unital (add-formal-power-series-Commutative-Semiring R)
+ is-unital-add-formal-power-series-Commutative-Semiring =
+ zero-formal-power-series-Commutative-Semiring R ,
+ left-unit-law-add-formal-power-series-Commutative-Semiring R ,
+ right-unit-law-add-formal-power-series-Commutative-Semiring R
+
+ monoid-add-formal-power-series-Commutative-Semiring : Monoid l
+ monoid-add-formal-power-series-Commutative-Semiring =
+ semigroup-add-formal-power-series-Commutative-Semiring ,
+ is-unital-add-formal-power-series-Commutative-Semiring
+
+ commutative-monoid-add-formal-power-series-Commutative-Semiring :
+ Commutative-Monoid l
+ commutative-monoid-add-formal-power-series-Commutative-Semiring =
+ monoid-add-formal-power-series-Commutative-Semiring ,
+ commutative-add-formal-power-series-Commutative-Semiring R
+```
+
+### Multiplication
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ (p q : formal-power-series-Commutative-Semiring R)
+ where
+
+ coefficient-mul-formal-power-series-Commutative-Semiring :
+ ℕ → type-Commutative-Semiring R
+ coefficient-mul-formal-power-series-Commutative-Semiring n =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) →
+ mul-Commutative-Semiring
+ ( R)
+ ( coefficient-formal-power-series-Commutative-Semiring R p a)
+ ( coefficient-formal-power-series-Commutative-Semiring R q b))
+
+ opaque
+ mul-formal-power-series-Commutative-Semiring :
+ formal-power-series-Commutative-Semiring R
+ mul-formal-power-series-Commutative-Semiring =
+ formal-power-series-coefficients-Commutative-Semiring
+ ( R)
+ ( coefficient-mul-formal-power-series-Commutative-Semiring)
+
+ eq-coefficient-mul-formal-power-series-Commutative-Semiring :
+ coefficient-formal-power-series-Commutative-Semiring
+ ( R)
+ ( mul-formal-power-series-Commutative-Semiring) ~
+ coefficient-mul-formal-power-series-Commutative-Semiring
+ eq-coefficient-mul-formal-power-series-Commutative-Semiring =
+ coefficient-formal-power-series-coefficients-Commutative-Semiring R _
+```
+
+#### Commutativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ (p q : formal-power-series-Commutative-Semiring R)
+ where
+
+ opaque
+ unfolding mul-formal-power-series-Commutative-Semiring
+ unfolding formal-power-series-Commutative-Semiring
+
+ commutative-mul-formal-power-series-Commutative-Semiring :
+ mul-formal-power-series-Commutative-Semiring R p q =
+ mul-formal-power-series-Commutative-Semiring R q p
+ commutative-mul-formal-power-series-Commutative-Semiring =
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring
+ ( R)
+ ( _)
+ ( _)
+ ( λ n →
+ htpy-sum-finite-Commutative-Semiring R _
+ ( λ _ → commutative-mul-Commutative-Semiring R _ _) ∙
+ sum-aut-finite-Commutative-Semiring
+ ( R)
+ ( _)
+ ( aut-swap-pair-with-sum-ℕ n)
+ ( _))
+```
+
+#### Associativity
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ (p q r : formal-power-series-Commutative-Semiring R)
+ where
+
+ abstract
+ associative-mul-formal-power-series-Commutative-Semiring :
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( mul-formal-power-series-Commutative-Semiring R p q)
+ ( r) =
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( mul-formal-power-series-Commutative-Semiring R q r)
+ associative-mul-formal-power-series-Commutative-Semiring =
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring
+ ( R)
+ ( _)
+ ( _)
+ ( λ n → equational-reasoning
+ coeff ((p *fps q) *fps r) n
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) → coeff (p *fps q) a *R coeff r b)
+ by
+ eq-coefficient-mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p *fps q)
+ ( r)
+ ( n)
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) →
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ a)
+ ( λ (c , d , _) → (coeff p c *R coeff q d) *R coeff r b))
+ by
+ ap
+ ( sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n))
+ ( eq-htpy
+ ( λ (a , b , _) →
+ ap-mul-Commutative-Semiring
+ ( R)
+ ( eq-coefficient-mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( q)
+ ( a))
+ ( refl) ∙
+ right-distributive-mul-sum-finite-Commutative-Semiring
+ ( R)
+ ( _)
+ ( _)
+ ( coeff r b)))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1))
+ ( λ ((a , b , _) , c , d , _) →
+ (coeff p c *R coeff q d) *R coeff r b)
+ by
+ inv
+ ( sum-Σ-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1)
+ ( _))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1 ∘ pr2))
+ ( λ ((a , b , _) , c , d , _) →
+ (coeff p c *R coeff q d) *R coeff r a)
+ by
+ sum-equiv-finite-Commutative-Semiring R _ _
+ ( equiv-pair-with-sum-pr1-pr2 n)
+ ( _)
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1 ∘ pr2))
+ ( λ ((a , b , _) , c , d , _) →
+ coeff p c *R (coeff q d *R coeff r a))
+ by
+ ap
+ ( sum-finite-Commutative-Semiring R _)
+ ( eq-htpy (λ _ → associative-mul-Commutative-Semiring R _ _ _))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1 ∘ pr2))
+ ( λ ((a , b , _) , c , d , _) →
+ coeff p a *R (coeff q c *R coeff r d))
+ by
+ sum-aut-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1 ∘ pr2))
+ ( equiv-permute-components-triple-with-sum-pr2 n)
+ ( _)
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) →
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ b)
+ ( λ (c , d , _) → coeff p a *R (coeff q c *R coeff r d)))
+ by
+ sum-Σ-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( finite-type-pair-with-sum-ℕ ∘ pr1 ∘ pr2)
+ ( λ (a , b , _) (c , d , _) →
+ coeff p a *R (coeff q c *R coeff r d))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) →
+ coeff p a *R coeff (q *fps r) b)
+ by
+ ap
+ ( sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n))
+ ( eq-htpy
+ ( λ (a , b , _) →
+ inv
+ ( left-distributive-mul-sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ b)
+ ( coeff p a)
+ ( _)) ∙
+ ap
+ ( coeff p a *R_)
+ ( inv
+ ( eq-coefficient-mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( q)
+ ( r)
+ ( b)))))
+ = coeff (p *fps (q *fps r)) n
+ by
+ inv
+ ( eq-coefficient-mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( q *fps r)
+ ( n)))
+ where
+ _*R_ :
+ type-Commutative-Semiring R → type-Commutative-Semiring R →
+ type-Commutative-Semiring R
+ _*R_ = mul-Commutative-Semiring R
+ _*fps_ :
+ formal-power-series-Commutative-Semiring R →
+ formal-power-series-Commutative-Semiring R →
+ formal-power-series-Commutative-Semiring R
+ _*fps_ = mul-formal-power-series-Commutative-Semiring R
+ coeff :
+ formal-power-series-Commutative-Semiring R → ℕ →
+ type-Commutative-Semiring R
+ coeff = coefficient-formal-power-series-Commutative-Semiring R
+```
+
+#### Unit laws
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ (p : formal-power-series-Commutative-Semiring R)
+ where
+
+ abstract
+ htpy-left-unit-law-mul-formal-power-series-Commutative-Semiring :
+ (p : ℕ → type-Commutative-Semiring R) (n : ℕ) →
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) →
+ mul-Commutative-Semiring
+ ( R)
+ ( coefficient-constant-formal-power-series-Commutative-Semiring
+ ( R)
+ ( one-Commutative-Semiring R)
+ ( a))
+ ( p b)) =
+ p n
+ htpy-left-unit-law-mul-formal-power-series-Commutative-Semiring p n =
+ equational-reasoning
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( λ (a , b , _) →
+ mul-Commutative-Semiring
+ ( R)
+ ( coefficient-constant-formal-power-series-Commutative-Semiring
+ ( R)
+ ( one-Commutative-Semiring R)
+ ( a))
+ ( p b))
+ =
+ sum-Commutative-Semiring
+ ( R)
+ ( succ-ℕ n)
+ ( λ {
+ (inr star) →
+ mul-Commutative-Semiring R (one-Commutative-Semiring R) (p n) ;
+ (inl k) →
+ mul-Commutative-Semiring R (zero-Commutative-Semiring R) _})
+ by
+ sum-finite-count-Commutative-Semiring
+ ( R)
+ ( finite-type-pair-with-sum-ℕ n)
+ ( count-pair-with-sum-ℕ n)
+ ( _)
+ =
+ add-Commutative-Semiring
+ ( R)
+ ( sum-Commutative-Semiring
+ ( R)
+ ( n)
+ ( λ k →
+ mul-Commutative-Semiring R (zero-Commutative-Semiring R) _))
+ ( mul-Commutative-Semiring R (one-Commutative-Semiring R) (p n))
+ by
+ cons-sum-Commutative-Semiring R n
+ ( λ {
+ (inr star) →
+ mul-Commutative-Semiring
+ ( R)
+ ( one-Commutative-Semiring R)
+ ( p n) ;
+ (inl k) →
+ mul-Commutative-Semiring R (zero-Commutative-Semiring R) _})
+ ( refl)
+ =
+ add-Commutative-Semiring
+ ( R)
+ ( sum-Commutative-Semiring
+ ( R)
+ ( n)
+ ( λ k → zero-Commutative-Semiring R))
+ ( p n)
+ by
+ ap-add-Commutative-Semiring
+ ( R)
+ ( htpy-sum-Commutative-Semiring
+ ( R)
+ ( n)
+ ( λ k → left-zero-law-mul-Commutative-Semiring R _))
+ ( left-unit-law-mul-Commutative-Semiring R _)
+ =
+ add-Commutative-Semiring
+ ( R)
+ ( zero-Commutative-Semiring R)
+ ( p n)
+ by
+ ap-add-Commutative-Semiring
+ ( R)
+ ( sum-zero-Commutative-Semiring R n)
+ ( refl)
+ = p n by left-unit-law-add-Commutative-Semiring R _
+
+ opaque
+ unfolding mul-formal-power-series-Commutative-Semiring
+ unfolding constant-formal-power-series-Commutative-Semiring
+
+ left-unit-law-mul-formal-power-series-Commutative-Semiring :
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( one-formal-power-series-Commutative-Semiring R)
+ ( p) = p
+ left-unit-law-mul-formal-power-series-Commutative-Semiring =
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring
+ ( R)
+ ( _)
+ ( _)
+ ( htpy-left-unit-law-mul-formal-power-series-Commutative-Semiring p)
+
+ right-unit-law-mul-formal-power-series-Commutative-Semiring :
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( one-formal-power-series-Commutative-Semiring R) = p
+ right-unit-law-mul-formal-power-series-Commutative-Semiring =
+ commutative-mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( one-formal-power-series-Commutative-Semiring R) ∙
+ left-unit-law-mul-formal-power-series-Commutative-Semiring
+```
+
+#### Zero laws of multiplication
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ (p : formal-power-series-Commutative-Semiring R)
+ where
+
+ opaque
+ unfolding mul-formal-power-series-Commutative-Semiring
+ unfolding zero-formal-power-series-Commutative-Semiring
+
+ left-zero-law-mul-formal-power-series-Commutative-Semiring :
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( zero-formal-power-series-Commutative-Semiring R)
+ ( p) =
+ zero-formal-power-series-Commutative-Semiring R
+ left-zero-law-mul-formal-power-series-Commutative-Semiring =
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring
+ ( R)
+ ( _)
+ ( _)
+ ( λ n →
+ htpy-sum-finite-Commutative-Semiring R _
+ ( λ _ → left-zero-law-mul-Commutative-Semiring R _) ∙
+ sum-zero-finite-Commutative-Semiring R _)
+
+ right-zero-law-mul-formal-power-series-Commutative-Semiring :
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( zero-formal-power-series-Commutative-Semiring R) =
+ zero-formal-power-series-Commutative-Semiring R
+ right-zero-law-mul-formal-power-series-Commutative-Semiring =
+ commutative-mul-formal-power-series-Commutative-Semiring R _ _ ∙
+ left-zero-law-mul-formal-power-series-Commutative-Semiring
+```
+
+#### Distributivity of multiplication over addition
+
+```agda
+opaque
+ unfolding formal-power-series-Commutative-Semiring
+ unfolding add-formal-power-series-Commutative-Semiring
+ unfolding mul-formal-power-series-Commutative-Semiring
+
+ left-distributive-mul-add-formal-power-series-Commutative-Semiring :
+ {l : Level} (R : Commutative-Semiring l) →
+ (p q r : formal-power-series-Commutative-Semiring R) →
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( p)
+ ( add-formal-power-series-Commutative-Semiring R q r) =
+ add-formal-power-series-Commutative-Semiring
+ ( R)
+ ( mul-formal-power-series-Commutative-Semiring R p q)
+ ( mul-formal-power-series-Commutative-Semiring R p r)
+ left-distributive-mul-add-formal-power-series-Commutative-Semiring R p q r =
+ eq-htpy-coefficients-formal-power-series-Commutative-Semiring
+ ( R)
+ ( _)
+ ( _)
+ ( λ n →
+ htpy-sum-finite-Commutative-Semiring R _
+ ( λ _ → left-distributive-mul-add-Commutative-Semiring R _ _ _) ∙
+ commute-sum-two-finite-Commutative-Semiring R _ _ _)
+
+abstract
+ right-distributive-mul-add-formal-power-series-Commutative-Semiring :
+ {l : Level} (R : Commutative-Semiring l) →
+ (p q r : formal-power-series-Commutative-Semiring R) →
+ mul-formal-power-series-Commutative-Semiring
+ ( R)
+ ( add-formal-power-series-Commutative-Semiring R p q)
+ ( r) =
+ add-formal-power-series-Commutative-Semiring
+ ( R)
+ ( mul-formal-power-series-Commutative-Semiring R p r)
+ ( mul-formal-power-series-Commutative-Semiring R q r)
+ right-distributive-mul-add-formal-power-series-Commutative-Semiring R p q r =
+ commutative-mul-formal-power-series-Commutative-Semiring R _ _ ∙
+ left-distributive-mul-add-formal-power-series-Commutative-Semiring R r p q ∙
+ ap-binary
+ ( add-formal-power-series-Commutative-Semiring R)
+ ( commutative-mul-formal-power-series-Commutative-Semiring R r p)
+ ( commutative-mul-formal-power-series-Commutative-Semiring R r q)
+```
+
+### The commutative semiring of formal power series
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ has-associative-mul-formal-power-series-Commutative-Semiring :
+ has-associative-mul (formal-power-series-Commutative-Semiring R)
+ has-associative-mul-formal-power-series-Commutative-Semiring =
+ mul-formal-power-series-Commutative-Semiring R ,
+ associative-mul-formal-power-series-Commutative-Semiring R
+
+ unit-laws-mul-formal-power-series-Commutative-Semiring :
+ unit-laws
+ ( mul-formal-power-series-Commutative-Semiring R)
+ ( one-formal-power-series-Commutative-Semiring R)
+ unit-laws-mul-formal-power-series-Commutative-Semiring =
+ left-unit-law-mul-formal-power-series-Commutative-Semiring R ,
+ right-unit-law-mul-formal-power-series-Commutative-Semiring R
+
+ is-unital-mul-formal-power-series-Commutative-Semiring :
+ is-unital (mul-formal-power-series-Commutative-Semiring R)
+ is-unital-mul-formal-power-series-Commutative-Semiring =
+ one-formal-power-series-Commutative-Semiring R ,
+ unit-laws-mul-formal-power-series-Commutative-Semiring
+
+ semiring-formal-power-series-Commutative-Semiring : Semiring l
+ semiring-formal-power-series-Commutative-Semiring =
+ commutative-monoid-add-formal-power-series-Commutative-Semiring R ,
+ ( has-associative-mul-formal-power-series-Commutative-Semiring ,
+ is-unital-mul-formal-power-series-Commutative-Semiring ,
+ left-distributive-mul-add-formal-power-series-Commutative-Semiring R ,
+ right-distributive-mul-add-formal-power-series-Commutative-Semiring R) ,
+ left-zero-law-mul-formal-power-series-Commutative-Semiring R ,
+ right-zero-law-mul-formal-power-series-Commutative-Semiring R
+
+ commutative-semiring-formal-power-series-Commutative-Semiring :
+ Commutative-Semiring l
+ commutative-semiring-formal-power-series-Commutative-Semiring =
+ semiring-formal-power-series-Commutative-Semiring ,
+ commutative-mul-formal-power-series-Commutative-Semiring R
+```
diff --git a/src/commutative-algebra/sums-commutative-rings.lagda.md b/src/commutative-algebra/sums-commutative-rings.lagda.md
index f26a86e6db..c66702d06d 100644
--- a/src/commutative-algebra/sums-commutative-rings.lagda.md
+++ b/src/commutative-algebra/sums-commutative-rings.lagda.md
@@ -8,12 +8,18 @@ module commutative-algebra.sums-commutative-rings where
```agda
open import commutative-algebra.commutative-rings
+open import commutative-algebra.sums-commutative-semirings
open import elementary-number-theory.addition-natural-numbers
open import elementary-number-theory.natural-numbers
+open import finite-group-theory.permutations-standard-finite-types
+
open import foundation.action-on-identifications-functions
+open import foundation.automorphisms
open import foundation.coproduct-types
+open import foundation.empty-types
+open import foundation.equivalences
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
@@ -26,6 +32,9 @@ open import linear-algebra.vectors-on-commutative-rings
open import ring-theory.sums-rings
open import univalent-combinatorics.coproduct-types
+open import univalent-combinatorics.counting
+open import univalent-combinatorics.dependent-pair-types
+open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
@@ -33,8 +42,13 @@ open import univalent-combinatorics.standard-finite-types
## Idea
-The **sum operation** extends the binary addition operation on a commutative
-ring `A` to any family of elements of `A` indexed by a standard finite type.
+The
+{{#concept "sum operation" Disambiguation="in a commutative ring" WD="sum" WDID=Q218005 Agda=sum-Commutative-Ring}}
+extends the binary addition operation on a
+[commutative ring](commutative-algebra.commutative-rings.md) `A` to any family
+of elements of `A` indexed by a
+[standard finite type](univalent-combinatorics.standard-finite-types.md), or by
+a [finite type](univalent-combinatorics.finite-types.md).
## Definition
@@ -43,6 +57,17 @@ sum-Commutative-Ring :
{l : Level} (A : Commutative-Ring l) (n : ℕ) →
(functional-vec-Commutative-Ring A n) → type-Commutative-Ring A
sum-Commutative-Ring A = sum-Ring (ring-Commutative-Ring A)
+
+sum-count-Commutative-Ring :
+ {l1 l2 : Level} (R : Commutative-Ring l1) (A : UU l2) → count A →
+ (A → type-Commutative-Ring R) → type-Commutative-Ring R
+sum-count-Commutative-Ring R = sum-count-Ring (ring-Commutative-Ring R)
+
+sum-finite-Commutative-Ring :
+ {l1 l2 : Level} (R : Commutative-Ring l1) (A : Finite-Type l2) →
+ (type-Finite-Type A → type-Commutative-Ring R) → type-Commutative-Ring R
+sum-finite-Commutative-Ring R =
+ sum-finite-Commutative-Semiring (commutative-semiring-Commutative-Ring R)
```
## Properties
@@ -60,6 +85,12 @@ module _
sum-one-element-Commutative-Ring =
sum-one-element-Ring (ring-Commutative-Ring A)
+ sum-unit-finite-Commutative-Ring :
+ (f : unit → type-Commutative-Ring A) →
+ sum-finite-Commutative-Ring A unit-Finite-Type f = f star
+ sum-unit-finite-Commutative-Ring =
+ sum-unit-finite-Ring (ring-Commutative-Ring A)
+
sum-two-elements-Commutative-Ring :
(f : functional-vec-Commutative-Ring A 2) →
sum-Commutative-Ring A 2 f =
@@ -72,13 +103,20 @@ module _
```agda
module _
- {l : Level} (A : Commutative-Ring l)
+ {l : Level} (R : Commutative-Ring l)
where
htpy-sum-Commutative-Ring :
- (n : ℕ) {f g : functional-vec-Commutative-Ring A n} →
- (f ~ g) → sum-Commutative-Ring A n f = sum-Commutative-Ring A n g
- htpy-sum-Commutative-Ring = htpy-sum-Ring (ring-Commutative-Ring A)
+ (n : ℕ) {f g : functional-vec-Commutative-Ring R n} →
+ (f ~ g) → sum-Commutative-Ring R n f = sum-Commutative-Ring R n g
+ htpy-sum-Commutative-Ring = htpy-sum-Ring (ring-Commutative-Ring R)
+
+ htpy-sum-finite-Commutative-Ring :
+ {l2 : Level} (A : Finite-Type l2) →
+ {f g : type-Finite-Type A → type-Commutative-Ring R} → (f ~ g) →
+ sum-finite-Commutative-Ring R A f = sum-finite-Commutative-Ring R A g
+ htpy-sum-finite-Commutative-Ring =
+ htpy-sum-finite-Ring (ring-Commutative-Ring R)
```
### Sums are equal to the zero-th term plus the rest
@@ -110,24 +148,41 @@ module _
```agda
module _
- {l : Level} (A : Commutative-Ring l)
+ {l : Level} (R : Commutative-Ring l)
where
left-distributive-mul-sum-Commutative-Ring :
- (n : ℕ) (x : type-Commutative-Ring A)
- (f : functional-vec-Commutative-Ring A n) →
- mul-Commutative-Ring A x (sum-Commutative-Ring A n f) =
- sum-Commutative-Ring A n (λ i → mul-Commutative-Ring A x (f i))
+ (n : ℕ) (x : type-Commutative-Ring R)
+ (f : functional-vec-Commutative-Ring R n) →
+ mul-Commutative-Ring R x (sum-Commutative-Ring R n f) =
+ sum-Commutative-Ring R n (λ i → mul-Commutative-Ring R x (f i))
left-distributive-mul-sum-Commutative-Ring =
- left-distributive-mul-sum-Ring (ring-Commutative-Ring A)
+ left-distributive-mul-sum-Ring (ring-Commutative-Ring R)
right-distributive-mul-sum-Commutative-Ring :
- (n : ℕ) (f : functional-vec-Commutative-Ring A n)
- (x : type-Commutative-Ring A) →
- mul-Commutative-Ring A (sum-Commutative-Ring A n f) x =
- sum-Commutative-Ring A n (λ i → mul-Commutative-Ring A (f i) x)
+ (n : ℕ) (f : functional-vec-Commutative-Ring R n)
+ (x : type-Commutative-Ring R) →
+ mul-Commutative-Ring R (sum-Commutative-Ring R n f) x =
+ sum-Commutative-Ring R n (λ i → mul-Commutative-Ring R (f i) x)
right-distributive-mul-sum-Commutative-Ring =
- right-distributive-mul-sum-Ring (ring-Commutative-Ring A)
+ right-distributive-mul-sum-Ring (ring-Commutative-Ring R)
+
+ left-distributive-mul-sum-finite-Commutative-Ring :
+ {l2 : Level} (A : Finite-Type l2) (x : type-Commutative-Ring R) →
+ (f : type-Finite-Type A → type-Commutative-Ring R) →
+ mul-Commutative-Ring R x (sum-finite-Commutative-Ring R A f) =
+ sum-finite-Commutative-Ring R A (mul-Commutative-Ring R x ∘ f)
+ left-distributive-mul-sum-finite-Commutative-Ring =
+ left-distributive-mul-sum-finite-Ring (ring-Commutative-Ring R)
+
+ right-distributive-mul-sum-finite-Commutative-Ring :
+ {l2 : Level} (A : Finite-Type l2) →
+ (f : type-Finite-Type A → type-Commutative-Ring R) →
+ (x : type-Commutative-Ring R) →
+ mul-Commutative-Ring R (sum-finite-Commutative-Ring R A f) x =
+ sum-finite-Commutative-Ring R A (mul-Commutative-Ring' R x ∘ f)
+ right-distributive-mul-sum-finite-Commutative-Ring =
+ right-distributive-mul-sum-finite-Ring (ring-Commutative-Ring R)
```
### Interchange law of sums and addition in a commutative ring
@@ -204,13 +259,136 @@ split-sum-Commutative-Ring A n (succ-ℕ m) f =
```agda
module _
- {l : Level} (A : Commutative-Ring l)
+ {l : Level} (R : Commutative-Ring l)
where
sum-zero-Commutative-Ring :
(n : ℕ) →
- sum-Commutative-Ring A n
- ( zero-functional-vec-Commutative-Ring A n) =
- zero-Commutative-Ring A
- sum-zero-Commutative-Ring = sum-zero-Ring (ring-Commutative-Ring A)
+ sum-Commutative-Ring R n
+ ( zero-functional-vec-Commutative-Ring R n) =
+ zero-Commutative-Ring R
+ sum-zero-Commutative-Ring = sum-zero-Ring (ring-Commutative-Ring R)
+
+ sum-zero-finite-Commutative-Ring :
+ {l2 : Level} (A : Finite-Type l2) →
+ sum-finite-Commutative-Ring R A (λ _ → zero-Commutative-Ring R) =
+ zero-Commutative-Ring R
+ sum-zero-finite-Commutative-Ring =
+ sum-zero-finite-Ring (ring-Commutative-Ring R)
+```
+
+### Permutations preserve sums
+
+```agda
+module _
+ {l : Level} (A : Commutative-Ring l)
+ where
+
+ preserves-sum-permutation-Commutative-Ring :
+ (n : ℕ) → (σ : Permutation n) →
+ (f : functional-vec-Commutative-Ring A n) →
+ sum-Commutative-Ring A n f = sum-Commutative-Ring A n (f ∘ map-equiv σ)
+ preserves-sum-permutation-Commutative-Ring =
+ preserves-sum-permutation-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring A)
+```
+
+### Sums over finite types are preserved by equivalences
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Commutative-Ring l1)
+ (A : Finite-Type l2) (B : Finite-Type l3) (H : equiv-Finite-Type A B)
+ where
+
+ sum-equiv-finite-Commutative-Ring :
+ (f : type-Finite-Type A → type-Commutative-Ring R) →
+ sum-finite-Commutative-Ring R A f =
+ sum-finite-Commutative-Ring R B (f ∘ map-inv-equiv H)
+ sum-equiv-finite-Commutative-Ring =
+ sum-equiv-finite-Commutative-Semiring
+ ( commutative-semiring-Commutative-Ring R)
+ ( A)
+ ( B)
+ ( H)
+
+module _
+ {l1 l2 : Level} (R : Commutative-Ring l1)
+ (A : Finite-Type l2) (σ : Aut (type-Finite-Type A))
+ where
+
+ sum-aut-finite-Commutative-Ring :
+ (f : type-Finite-Type A → type-Commutative-Ring R) →
+ sum-finite-Commutative-Ring R A f =
+ sum-finite-Commutative-Ring R A (f ∘ map-equiv σ)
+ sum-aut-finite-Commutative-Ring =
+ sum-equiv-finite-Commutative-Ring R A A (inv-equiv σ)
+```
+
+### Sums over finite types distribute over coproducts
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Commutative-Ring l1)
+ (A : Finite-Type l2) (B : Finite-Type l3)
+ where
+
+ sum-coproduct-finite-Commutative-Ring :
+ (f :
+ type-Finite-Type A + type-Finite-Type B → type-Commutative-Ring R) →
+ sum-finite-Commutative-Ring R (coproduct-Finite-Type A B) f =
+ add-Commutative-Ring
+ ( R)
+ ( sum-finite-Commutative-Ring R A (f ∘ inl))
+ ( sum-finite-Commutative-Ring R B (f ∘ inr))
+ sum-coproduct-finite-Commutative-Ring =
+ sum-coproduct-finite-Ring (ring-Commutative-Ring R) A B
+```
+
+### Sums distribute over dependent pair types
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Commutative-Ring l1)
+ (A : Finite-Type l2) (B : type-Finite-Type A → Finite-Type l3)
+ where
+
+ sum-Σ-finite-Commutative-Ring :
+ (f :
+ (a : type-Finite-Type A) →
+ type-Finite-Type (B a) →
+ type-Commutative-Ring R) →
+ sum-finite-Commutative-Ring R (Σ-Finite-Type A B) (ind-Σ f) =
+ sum-finite-Commutative-Ring
+ R A (λ a → sum-finite-Commutative-Ring R (B a) (f a))
+ sum-Σ-finite-Commutative-Ring =
+ sum-Σ-finite-Ring (ring-Commutative-Ring R) A B
+```
+
+### The sum over an empty type is zero
+
+```agda
+module _
+ {l1 l2 : Level} (R : Commutative-Ring l1) (A : Finite-Type l2)
+ (H : is-empty (type-Finite-Type A))
+ where
+
+ sum-is-empty-finite-Commutative-Ring :
+ (f : type-Finite-Type A → type-Commutative-Ring R) →
+ is-zero-Commutative-Ring R (sum-finite-Commutative-Ring R A f)
+ sum-is-empty-finite-Commutative-Ring =
+ sum-is-empty-finite-Ring (ring-Commutative-Ring R) A H
+```
+
+### The sum over a finite type is the sum over any count for that type
+
+```agda
+sum-finite-count-Commutative-Ring :
+ {l1 l2 : Level} (R : Commutative-Ring l1) (A : Finite-Type l2)
+ (cA : count (type-Finite-Type A))
+ (f : type-Finite-Type A → type-Commutative-Ring R) →
+ sum-finite-Commutative-Ring R A f =
+ sum-count-Commutative-Ring R (type-Finite-Type A) cA f
+sum-finite-count-Commutative-Ring R =
+ sum-finite-count-Ring (ring-Commutative-Ring R)
```
diff --git a/src/commutative-algebra/sums-commutative-semirings.lagda.md b/src/commutative-algebra/sums-commutative-semirings.lagda.md
index 16eaf02de8..d640aa1973 100644
--- a/src/commutative-algebra/sums-commutative-semirings.lagda.md
+++ b/src/commutative-algebra/sums-commutative-semirings.lagda.md
@@ -12,17 +12,32 @@ open import commutative-algebra.commutative-semirings
open import elementary-number-theory.addition-natural-numbers
open import elementary-number-theory.natural-numbers
+open import finite-group-theory.permutations-standard-finite-types
+
+open import foundation.automorphisms
+open import foundation.coproduct-types
+open import foundation.empty-types
+open import foundation.equivalences
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
+open import foundation.negated-equality
+open import foundation.type-arithmetic-cartesian-product-types
+open import foundation.unit-type
open import foundation.universe-levels
open import linear-algebra.vectors
open import linear-algebra.vectors-on-commutative-semirings
+open import lists.lists
+
open import ring-theory.sums-semirings
+open import univalent-combinatorics.cartesian-product-types
open import univalent-combinatorics.coproduct-types
+open import univalent-combinatorics.counting
+open import univalent-combinatorics.dependent-pair-types
+open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
@@ -30,8 +45,13 @@ open import univalent-combinatorics.standard-finite-types
## Idea
-The **sum operation** extends the binary addition operation on a commutative
-semiring `R` to any family of elements of `R` indexed by a standard finite type.
+The
+{{#concept "sum operation" Disambiguation="in a commutative semiring" WD="sum" WDID=Q218005 Agda=sum-Commutative-Semiring}}
+extends the binary addition operation on a
+[commutative semiring](commutative-algebra.commutative-semirings.md) `R` to any
+family of elements of `R` indexed by a
+[standard finite type](univalent-combinatorics.standard-finite-types.md), or by
+a [finite type](univalent-combinatorics.finite-types.md).
## Definition
@@ -40,6 +60,19 @@ sum-Commutative-Semiring :
{l : Level} (A : Commutative-Semiring l) (n : ℕ) →
(functional-vec-Commutative-Semiring A n) → type-Commutative-Semiring A
sum-Commutative-Semiring A = sum-Semiring (semiring-Commutative-Semiring A)
+
+sum-count-Commutative-Semiring :
+ {l1 l2 : Level} (R : Commutative-Semiring l1) (A : UU l2) → count A →
+ (A → type-Commutative-Semiring R) → type-Commutative-Semiring R
+sum-count-Commutative-Semiring R =
+ sum-count-Semiring (semiring-Commutative-Semiring R)
+
+sum-finite-Commutative-Semiring :
+ {l1 l2 : Level} (R : Commutative-Semiring l1) (A : Finite-Type l2) →
+ (type-Finite-Type A → type-Commutative-Semiring R) →
+ type-Commutative-Semiring R
+sum-finite-Commutative-Semiring R =
+ sum-finite-Semiring (semiring-Commutative-Semiring R)
```
## Properties
@@ -57,6 +90,12 @@ module _
sum-one-element-Commutative-Semiring =
sum-one-element-Semiring (semiring-Commutative-Semiring A)
+ sum-unit-finite-Commutative-Semiring :
+ (f : unit → type-Commutative-Semiring A) →
+ sum-finite-Commutative-Semiring A unit-Finite-Type f = f star
+ sum-unit-finite-Commutative-Semiring =
+ sum-unit-finite-Semiring (semiring-Commutative-Semiring A)
+
sum-two-elements-Commutative-Semiring :
(f : functional-vec-Commutative-Semiring A 2) →
sum-Commutative-Semiring A 2 f =
@@ -69,14 +108,22 @@ module _
```agda
module _
- {l : Level} (A : Commutative-Semiring l)
+ {l : Level} (R : Commutative-Semiring l)
where
htpy-sum-Commutative-Semiring :
- (n : ℕ) {f g : functional-vec-Commutative-Semiring A n} →
- (f ~ g) → sum-Commutative-Semiring A n f = sum-Commutative-Semiring A n g
+ (n : ℕ) {f g : functional-vec-Commutative-Semiring R n} →
+ (f ~ g) → sum-Commutative-Semiring R n f = sum-Commutative-Semiring R n g
htpy-sum-Commutative-Semiring =
- htpy-sum-Semiring (semiring-Commutative-Semiring A)
+ htpy-sum-Semiring (semiring-Commutative-Semiring R)
+
+ htpy-sum-finite-Commutative-Semiring :
+ {l2 : Level} (A : Finite-Type l2) →
+ {f g : type-Finite-Type A → type-Commutative-Semiring R} → (f ~ g) →
+ sum-finite-Commutative-Semiring R A f =
+ sum-finite-Commutative-Semiring R A g
+ htpy-sum-finite-Commutative-Semiring =
+ htpy-sum-finite-Semiring (semiring-Commutative-Semiring R)
```
### Sums are equal to the zero-th term plus the rest
@@ -110,24 +157,41 @@ module _
```agda
module _
- {l : Level} (A : Commutative-Semiring l)
+ {l : Level} (R : Commutative-Semiring l)
where
left-distributive-mul-sum-Commutative-Semiring :
- (n : ℕ) (x : type-Commutative-Semiring A)
- (f : functional-vec-Commutative-Semiring A n) →
- mul-Commutative-Semiring A x (sum-Commutative-Semiring A n f) =
- sum-Commutative-Semiring A n (λ i → mul-Commutative-Semiring A x (f i))
+ (n : ℕ) (x : type-Commutative-Semiring R)
+ (f : functional-vec-Commutative-Semiring R n) →
+ mul-Commutative-Semiring R x (sum-Commutative-Semiring R n f) =
+ sum-Commutative-Semiring R n (λ i → mul-Commutative-Semiring R x (f i))
left-distributive-mul-sum-Commutative-Semiring =
- left-distributive-mul-sum-Semiring (semiring-Commutative-Semiring A)
+ left-distributive-mul-sum-Semiring (semiring-Commutative-Semiring R)
right-distributive-mul-sum-Commutative-Semiring :
- (n : ℕ) (f : functional-vec-Commutative-Semiring A n)
- (x : type-Commutative-Semiring A) →
- mul-Commutative-Semiring A (sum-Commutative-Semiring A n f) x =
- sum-Commutative-Semiring A n (λ i → mul-Commutative-Semiring A (f i) x)
+ (n : ℕ) (f : functional-vec-Commutative-Semiring R n)
+ (x : type-Commutative-Semiring R) →
+ mul-Commutative-Semiring R (sum-Commutative-Semiring R n f) x =
+ sum-Commutative-Semiring R n (λ i → mul-Commutative-Semiring R (f i) x)
right-distributive-mul-sum-Commutative-Semiring =
- right-distributive-mul-sum-Semiring (semiring-Commutative-Semiring A)
+ right-distributive-mul-sum-Semiring (semiring-Commutative-Semiring R)
+
+ left-distributive-mul-sum-finite-Commutative-Semiring :
+ {l2 : Level} (A : Finite-Type l2) (x : type-Commutative-Semiring R) →
+ (f : type-Finite-Type A → type-Commutative-Semiring R) →
+ mul-Commutative-Semiring R x (sum-finite-Commutative-Semiring R A f) =
+ sum-finite-Commutative-Semiring R A (mul-Commutative-Semiring R x ∘ f)
+ left-distributive-mul-sum-finite-Commutative-Semiring =
+ left-distributive-mul-sum-finite-Semiring (semiring-Commutative-Semiring R)
+
+ right-distributive-mul-sum-finite-Commutative-Semiring :
+ {l2 : Level} (A : Finite-Type l2) →
+ (f : type-Finite-Type A → type-Commutative-Semiring R) →
+ (x : type-Commutative-Semiring R) →
+ mul-Commutative-Semiring R (sum-finite-Commutative-Semiring R A f) x =
+ sum-finite-Commutative-Semiring R A (mul-Commutative-Semiring' R x ∘ f)
+ right-distributive-mul-sum-finite-Commutative-Semiring =
+ right-distributive-mul-sum-finite-Semiring (semiring-Commutative-Semiring R)
```
### Interchange law of sums and addition in a commutative semiring
@@ -188,16 +252,23 @@ module _
```agda
module _
- {l : Level} (A : Commutative-Semiring l)
+ {l : Level} (R : Commutative-Semiring l)
where
sum-zero-Commutative-Semiring :
(n : ℕ) →
- sum-Commutative-Semiring A n
- ( zero-functional-vec-Commutative-Semiring A n) =
- zero-Commutative-Semiring A
+ sum-Commutative-Semiring R n
+ ( zero-functional-vec-Commutative-Semiring R n) =
+ zero-Commutative-Semiring R
sum-zero-Commutative-Semiring =
- sum-zero-Semiring (semiring-Commutative-Semiring A)
+ sum-zero-Semiring (semiring-Commutative-Semiring R)
+
+ sum-zero-finite-Commutative-Semiring :
+ {l2 : Level} (A : Finite-Type l2) →
+ sum-finite-Commutative-Semiring R A (λ _ → zero-Commutative-Semiring R) =
+ zero-Commutative-Semiring R
+ sum-zero-finite-Commutative-Semiring =
+ sum-zero-finite-Semiring (semiring-Commutative-Semiring R)
```
### Splitting sums
@@ -213,3 +284,204 @@ split-sum-Commutative-Semiring :
split-sum-Commutative-Semiring A =
split-sum-Semiring (semiring-Commutative-Semiring A)
```
+
+### Permutations preserve sums
+
+```agda
+module _
+ {l : Level} (R : Commutative-Semiring l)
+ where
+
+ preserves-sum-permutation-Commutative-Semiring :
+ (n : ℕ) → (σ : Permutation n) →
+ (f : functional-vec-Commutative-Semiring R n) →
+ sum-Commutative-Semiring R n f =
+ sum-Commutative-Semiring R n (f ∘ map-equiv σ)
+ preserves-sum-permutation-Commutative-Semiring =
+ preserves-sum-permutation-Semiring (semiring-Commutative-Semiring R)
+```
+
+### Sums over finite types are preserved by equivalences
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Commutative-Semiring l1)
+ (A : Finite-Type l2) (B : Finite-Type l3) (H : equiv-Finite-Type A B)
+ where
+
+ sum-equiv-finite-Commutative-Semiring :
+ (f : type-Finite-Type A → type-Commutative-Semiring R) →
+ sum-finite-Commutative-Semiring R A f =
+ sum-finite-Commutative-Semiring R B (f ∘ map-inv-equiv H)
+ sum-equiv-finite-Commutative-Semiring =
+ sum-equiv-finite-Semiring (semiring-Commutative-Semiring R) A B H
+
+module _
+ {l1 l2 : Level} (R : Commutative-Semiring l1)
+ (A : Finite-Type l2) (σ : Aut (type-Finite-Type A))
+ where
+
+ sum-aut-finite-Commutative-Semiring :
+ (f : type-Finite-Type A → type-Commutative-Semiring R) →
+ sum-finite-Commutative-Semiring R A f =
+ sum-finite-Commutative-Semiring R A (f ∘ map-equiv σ)
+ sum-aut-finite-Commutative-Semiring =
+ sum-equiv-finite-Commutative-Semiring R A A (inv-equiv σ)
+```
+
+### Sums over finite types distribute over coproducts
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Commutative-Semiring l1)
+ (A : Finite-Type l2) (B : Finite-Type l3)
+ where
+
+ sum-coproduct-finite-Commutative-Semiring :
+ (f :
+ type-Finite-Type A + type-Finite-Type B → type-Commutative-Semiring R) →
+ sum-finite-Commutative-Semiring R (coproduct-Finite-Type A B) f =
+ add-Commutative-Semiring
+ ( R)
+ ( sum-finite-Commutative-Semiring R A (f ∘ inl))
+ ( sum-finite-Commutative-Semiring R B (f ∘ inr))
+ sum-coproduct-finite-Commutative-Semiring =
+ sum-coproduct-finite-Semiring (semiring-Commutative-Semiring R) A B
+```
+
+### Sums distribute over dependent pair types
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Commutative-Semiring l1)
+ (A : Finite-Type l2) (B : type-Finite-Type A → Finite-Type l3)
+ where
+
+ sum-Σ-finite-Commutative-Semiring :
+ (f :
+ (a : type-Finite-Type A) →
+ type-Finite-Type (B a) →
+ type-Commutative-Semiring R) →
+ sum-finite-Commutative-Semiring R (Σ-Finite-Type A B) (ind-Σ f) =
+ sum-finite-Commutative-Semiring
+ R A (λ a → sum-finite-Commutative-Semiring R (B a) (f a))
+ sum-Σ-finite-Commutative-Semiring =
+ sum-Σ-finite-Semiring (semiring-Commutative-Semiring R) A B
+```
+
+### The sum over an empty type is zero
+
+```agda
+module _
+ {l1 l2 : Level} (R : Commutative-Semiring l1) (A : Finite-Type l2)
+ (H : is-empty (type-Finite-Type A))
+ where
+
+ sum-is-empty-finite-Commutative-Semiring :
+ (f : type-Finite-Type A → type-Commutative-Semiring R) →
+ is-zero-Commutative-Semiring R (sum-finite-Commutative-Semiring R A f)
+ sum-is-empty-finite-Commutative-Semiring =
+ sum-is-empty-finite-Semiring (semiring-Commutative-Semiring R) A H
+```
+
+### The sum over a finite type is the sum over any count for that type
+
+```agda
+sum-finite-count-Commutative-Semiring :
+ {l1 l2 : Level} (R : Commutative-Semiring l1) (A : Finite-Type l2)
+ (cA : count (type-Finite-Type A))
+ (f : type-Finite-Type A → type-Commutative-Semiring R) →
+ sum-finite-Commutative-Semiring R A f =
+ sum-count-Commutative-Semiring R (type-Finite-Type A) cA f
+sum-finite-count-Commutative-Semiring R =
+ sum-finite-count-Semiring (semiring-Commutative-Semiring R)
+```
+
+### Commuting sums
+
+```agda
+module _
+ {l1 l2 : Level} (R : Commutative-Semiring l1) (A : Finite-Type l2)
+ where
+
+ commute-sum-two-finite-Commutative-Semiring :
+ (f g : type-Finite-Type A → type-Commutative-Semiring R) →
+ sum-finite-Commutative-Semiring R A
+ (λ a → add-Commutative-Semiring R (f a) (g a)) =
+ add-Commutative-Semiring R
+ (sum-finite-Commutative-Semiring R A f)
+ (sum-finite-Commutative-Semiring R A g)
+ commute-sum-two-finite-Commutative-Semiring f g = equational-reasoning
+ sum-finite-Commutative-Semiring R A
+ ( λ a → add-Commutative-Semiring R (f a) (g a))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( A)
+ ( λ a → sum-Commutative-Semiring R 2 (h a))
+ by
+ htpy-sum-finite-Commutative-Semiring
+ ( R)
+ ( A)
+ ( λ a → inv (sum-two-elements-Commutative-Semiring R (h a)))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( A)
+ ( λ a →
+ sum-finite-Commutative-Semiring R (Fin-Finite-Type 2) (h a))
+ by
+ htpy-sum-finite-Commutative-Semiring R A
+ ( λ a →
+ inv
+ ( sum-finite-count-Commutative-Semiring
+ ( R)
+ ( Fin-Finite-Type 2)
+ ( count-Fin 2)
+ ( h a)))
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type A (λ _ → Fin-Finite-Type 2))
+ ( ind-Σ h)
+ by inv (sum-Σ-finite-Commutative-Semiring R A (λ _ → Fin-Finite-Type 2) h)
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Σ-Finite-Type (Fin-Finite-Type 2) (λ _ → A))
+ ( λ (i , a) → h a i)
+ by
+ sum-equiv-finite-Commutative-Semiring R _ _
+ ( commutative-product)
+ ( ind-Σ h)
+ =
+ sum-finite-Commutative-Semiring
+ ( R)
+ ( Fin-Finite-Type 2)
+ ( λ i → sum-finite-Commutative-Semiring R A (λ a → h a i))
+ by sum-Σ-finite-Commutative-Semiring R _ _ _
+ =
+ sum-Commutative-Semiring
+ ( R)
+ ( 2)
+ ( λ i → sum-finite-Commutative-Semiring R A (λ a → h a i))
+ by
+ sum-finite-count-Commutative-Semiring
+ ( R)
+ ( Fin-Finite-Type 2)
+ ( count-Fin 2)
+ ( _)
+ =
+ add-Commutative-Semiring
+ ( R)
+ ( sum-finite-Commutative-Semiring R A f)
+ ( sum-finite-Commutative-Semiring R A g)
+ by
+ sum-two-elements-Commutative-Semiring
+ ( R)
+ ( λ i → sum-finite-Commutative-Semiring R A (λ a → h a i))
+ where
+ h : type-Finite-Type A → Fin 2 → type-Commutative-Semiring R
+ h a (inl (inr _)) = f a
+ h a (inr _) = g a
+```
diff --git a/src/elementary-number-theory.lagda.md b/src/elementary-number-theory.lagda.md
index 8d04d1a4f3..c751026403 100644
--- a/src/elementary-number-theory.lagda.md
+++ b/src/elementary-number-theory.lagda.md
@@ -136,6 +136,7 @@ open import elementary-number-theory.nonzero-integers public
open import elementary-number-theory.nonzero-natural-numbers public
open import elementary-number-theory.nonzero-rational-numbers public
open import elementary-number-theory.ordinal-induction-natural-numbers public
+open import elementary-number-theory.pairs-with-natural-sums public
open import elementary-number-theory.parity-natural-numbers public
open import elementary-number-theory.peano-arithmetic public
open import elementary-number-theory.pisano-periods public
diff --git a/src/elementary-number-theory/equality-natural-numbers.lagda.md b/src/elementary-number-theory/equality-natural-numbers.lagda.md
index bb335e5e58..c3d5e54b9c 100644
--- a/src/elementary-number-theory/equality-natural-numbers.lagda.md
+++ b/src/elementary-number-theory/equality-natural-numbers.lagda.md
@@ -19,6 +19,7 @@ open import foundation.equivalences
open import foundation.function-types
open import foundation.fundamental-theorem-of-identity-types
open import foundation.identity-types
+open import foundation.negation
open import foundation.propositions
open import foundation.set-truncations
open import foundation.sets
@@ -93,6 +94,17 @@ pr1 (is-zero-ℕ-Prop n) = is-zero-ℕ n
pr2 (is-zero-ℕ-Prop n) = is-prop-is-zero-ℕ n
```
+### The property of being nonzero
+
+```agda
+is-prop-is-nonzero-ℕ : (n : ℕ) → is-prop (is-nonzero-ℕ n)
+is-prop-is-nonzero-ℕ n = is-prop-neg
+
+is-nonzero-ℕ-Prop : ℕ → Prop lzero
+pr1 (is-nonzero-ℕ-Prop n) = is-nonzero-ℕ n
+pr2 (is-nonzero-ℕ-Prop n) = is-prop-is-nonzero-ℕ n
+```
+
### The property of being one
```agda
diff --git a/src/elementary-number-theory/pairs-with-natural-sums.lagda.md b/src/elementary-number-theory/pairs-with-natural-sums.lagda.md
new file mode 100644
index 0000000000..96f863f4db
--- /dev/null
+++ b/src/elementary-number-theory/pairs-with-natural-sums.lagda.md
@@ -0,0 +1,290 @@
+# Pairs of natural numbers with a given sum
+
+```agda
+module elementary-number-theory.pairs-with-natural-sums where
+```
+
+Imports
+
+```agda
+open import elementary-number-theory.addition-natural-numbers
+open import elementary-number-theory.equality-natural-numbers
+open import elementary-number-theory.inequality-natural-numbers
+open import elementary-number-theory.natural-numbers
+
+open import foundation.action-on-identifications-functions
+open import foundation.automorphisms
+open import foundation.cartesian-product-types
+open import foundation.complements-subtypes
+open import foundation.conjunction
+open import foundation.contractible-types
+open import foundation.coproduct-types
+open import foundation.decidable-subtypes
+open import foundation.dependent-pair-types
+open import foundation.equality-dependent-pair-types
+open import foundation.equivalences
+open import foundation.function-types
+open import foundation.functoriality-coproduct-types
+open import foundation.identity-types
+open import foundation.involutions
+open import foundation.negation
+open import foundation.propositions
+open import foundation.retractions
+open import foundation.sections
+open import foundation.sets
+open import foundation.subtypes
+open import foundation.type-arithmetic-coproduct-types
+open import foundation.unit-type
+open import foundation.universe-levels
+
+open import logic.complements-decidable-subtypes
+
+open import univalent-combinatorics.counting
+open import univalent-combinatorics.finite-types
+open import univalent-combinatorics.standard-finite-types
+```
+
+
+
+## Idea
+
+A pair of natural numbers with a specific known sum resembles an
+[integer partition](elementary-number-theory.integer-partitions.md), but is
+ordered, and the components may be zero.
+
+## Definition
+
+```agda
+pair-with-sum-ℕ : ℕ → UU lzero
+pair-with-sum-ℕ n = Σ ℕ ( λ a → Σ ℕ (λ b → b +ℕ a = n))
+```
+
+## Properties
+
+### Equality characterization
+
+```agda
+module _
+ (n : ℕ)
+ where
+
+ Eq-pair-with-sum-ℕ : pair-with-sum-ℕ n → pair-with-sum-ℕ n → UU lzero
+ Eq-pair-with-sum-ℕ (a , b , _) (a' , b' , _) = a = a'
+
+ is-prop-Eq-pair-with-sum-ℕ :
+ (x y : pair-with-sum-ℕ n) → is-prop (Eq-pair-with-sum-ℕ x y)
+ is-prop-Eq-pair-with-sum-ℕ (a , _) (a' , _) =
+ is-prop-type-Prop (Id-Prop ℕ-Set a a')
+
+ refl-Eq-pair-with-sum-ℕ : (x : pair-with-sum-ℕ n) → Eq-pair-with-sum-ℕ x x
+ refl-Eq-pair-with-sum-ℕ _ = refl
+
+ eq-Eq-pair-with-sum-ℕ :
+ (x y : pair-with-sum-ℕ n) → Eq-pair-with-sum-ℕ x y → x = y
+ eq-Eq-pair-with-sum-ℕ (a , b , b+a=n) (.a , b' , b'+a=n) refl =
+ eq-pair-eq-fiber
+ ( eq-pair-Σ
+ ( is-injective-right-add-ℕ a (b+a=n ∙ inv b'+a=n))
+ ( eq-type-Prop (Id-Prop ℕ-Set _ _)))
+
+ abstract
+ is-set-pair-with-sum-ℕ : is-set (pair-with-sum-ℕ n)
+ is-set-pair-with-sum-ℕ =
+ is-set-prop-in-id
+ Eq-pair-with-sum-ℕ
+ is-prop-Eq-pair-with-sum-ℕ
+ refl-Eq-pair-with-sum-ℕ
+ eq-Eq-pair-with-sum-ℕ
+
+ set-pair-with-sum-ℕ : Set lzero
+ set-pair-with-sum-ℕ = pair-with-sum-ℕ n , is-set-pair-with-sum-ℕ
+```
+
+### Involution of swapping the components
+
+```agda
+module _
+ (n : ℕ)
+ where
+
+ swap-pair-with-sum-ℕ : pair-with-sum-ℕ n → pair-with-sum-ℕ n
+ swap-pair-with-sum-ℕ (a , b , b+a=n) =
+ (b , a , commutative-add-ℕ a b ∙ b+a=n)
+
+ is-involution-swap-pair-with-sum-ℕ : is-involution swap-pair-with-sum-ℕ
+ is-involution-swap-pair-with-sum-ℕ _ = eq-Eq-pair-with-sum-ℕ n _ _ refl
+
+ aut-swap-pair-with-sum-ℕ : Aut (pair-with-sum-ℕ n)
+ aut-swap-pair-with-sum-ℕ =
+ swap-pair-with-sum-ℕ ,
+ is-equiv-is-involution is-involution-swap-pair-with-sum-ℕ
+```
+
+### Equivalence of dependent pairs further partitioning a component
+
+```agda
+module _
+ (n : ℕ)
+ where
+
+ map-equiv-pair-with-sum-pr1-pr2 :
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1) →
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2)
+ pr1 (map-equiv-pair-with-sum-pr1-pr2 ((p , c , c+p=n) , _)) =
+ (c , p , commutative-add-ℕ p c ∙ c+p=n)
+ pr2 (map-equiv-pair-with-sum-pr1-pr2 (_ , y)) = y
+
+ map-inv-equiv-pair-with-sum-pr1-pr2 :
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2) →
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1)
+ pr1 (map-inv-equiv-pair-with-sum-pr1-pr2 ((c , p , p+c=n) , _)) =
+ (p , c , commutative-add-ℕ c p ∙ p+c=n)
+ pr2 (map-inv-equiv-pair-with-sum-pr1-pr2 (_ , y)) = y
+
+ abstract
+ is-section-map-inv-equiv-pair-with-sum-pr1-pr2 :
+ is-section
+ map-equiv-pair-with-sum-pr1-pr2
+ map-inv-equiv-pair-with-sum-pr1-pr2
+ is-section-map-inv-equiv-pair-with-sum-pr1-pr2
+ x@((c , p , p+c=n) , a , b , b+a=p) =
+ inv
+ ( ind-Id
+ ( p+c=n)
+ ( λ H' H=H' → x = ((c , p , H') , a , b , b+a=p))
+ ( refl)
+ ( _)
+ ( eq-type-Prop (Id-Prop ℕ-Set _ _)))
+
+ is-retraction-map-inv-equiv-pair-with-sum-pr1-pr2 :
+ is-retraction
+ map-equiv-pair-with-sum-pr1-pr2
+ map-inv-equiv-pair-with-sum-pr1-pr2
+ is-retraction-map-inv-equiv-pair-with-sum-pr1-pr2
+ x@((p , c , c+p=n) , a , b , b+a=p) =
+ inv
+ ( ind-Id
+ ( c+p=n)
+ ( λ H' H=H' → x = ((p , c , H') , a , b , b+a=p))
+ ( refl)
+ ( _)
+ ( eq-type-Prop (Id-Prop ℕ-Set _ _)))
+
+ equiv-pair-with-sum-pr1-pr2 :
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1) ≃
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2)
+ equiv-pair-with-sum-pr1-pr2 =
+ map-equiv-pair-with-sum-pr1-pr2 ,
+ ( map-inv-equiv-pair-with-sum-pr1-pr2 ,
+ is-section-map-inv-equiv-pair-with-sum-pr1-pr2) ,
+ ( map-inv-equiv-pair-with-sum-pr1-pr2 ,
+ is-retraction-map-inv-equiv-pair-with-sum-pr1-pr2)
+```
+
+### Pairs with a fixed sum are a finite type
+
+```agda
+module _
+ (n : ℕ)
+ where
+
+ equiv-pair-with-sum-leq-ℕ :
+ Σ ℕ (λ k → leq-ℕ k n) ≃ pair-with-sum-ℕ n
+ equiv-pair-with-sum-leq-ℕ =
+ ( λ (k , k≤n) → k , subtraction-leq-ℕ k n k≤n) ,
+ ((λ (k , l , l+k=n) → k , leq-subtraction-ℕ k n l l+k=n) ,
+ λ (k , l , l+k=n) →
+ let
+ (l' , l'+k=n) =
+ subtraction-leq-ℕ k n (leq-subtraction-ℕ k n l l+k=n)
+ in
+ eq-pair-eq-fiber
+ ( eq-pair-Σ
+ ( is-injective-right-add-ℕ k (l'+k=n ∙ inv l+k=n))
+ ( eq-type-Prop (Id-Prop ℕ-Set (l +ℕ k) n)))) ,
+ (( λ (k , l , l+k=n) → k , leq-subtraction-ℕ k n l l+k=n) ,
+ (λ (k , k≤n) → eq-pair-eq-fiber (eq-type-Prop (leq-ℕ-Prop k n))))
+
+ count-pair-with-sum-ℕ : count (pair-with-sum-ℕ n)
+ count-pair-with-sum-ℕ =
+ succ-ℕ n , equiv-pair-with-sum-leq-ℕ ∘e equiv-fin-succ-leq-ℕ n
+
+ finite-type-pair-with-sum-ℕ : Finite-Type lzero
+ finite-type-pair-with-sum-ℕ =
+ pair-with-sum-ℕ n ,
+ is-finite-count count-pair-with-sum-ℕ
+```
+
+### Permuting components in a triple of sums
+
+```agda
+module _
+ (n : ℕ)
+ where
+
+ map-equiv-permute-components-triple-with-sum-pr2 :
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2) →
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2)
+ map-equiv-permute-components-triple-with-sum-pr2
+ ((c , p , p+c=n) , a , b , b+a=p) =
+ ( b , a +ℕ c ,
+ ( equational-reasoning
+ (a +ℕ c) +ℕ b
+ = b +ℕ (a +ℕ c) by commutative-add-ℕ (a +ℕ c) b
+ = (b +ℕ a) +ℕ c by inv (associative-add-ℕ b a c)
+ = p +ℕ c by ap (_+ℕ c) b+a=p
+ = n by p+c=n)) ,
+ c , a , refl
+
+ map-inv-equiv-permute-components-triple-with-sum-pr2 :
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2) →
+ Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2)
+ map-inv-equiv-permute-components-triple-with-sum-pr2
+ ((c , p , p+c=n) , a , b , b+a=p) =
+ ( a , c +ℕ b ,
+ ( equational-reasoning
+ (c +ℕ b) +ℕ a
+ = c +ℕ (b +ℕ a) by associative-add-ℕ c b a
+ = c +ℕ p by ap (c +ℕ_) b+a=p
+ = p +ℕ c by commutative-add-ℕ c p
+ = n by p+c=n)) ,
+ b , c , refl
+
+ abstract
+ is-section-map-inv-equiv-permute-components-triple-with-sum-pr2 :
+ is-section
+ map-equiv-permute-components-triple-with-sum-pr2
+ map-inv-equiv-permute-components-triple-with-sum-pr2
+ is-section-map-inv-equiv-permute-components-triple-with-sum-pr2
+ x@((c , .(b +ℕ a) , p+c=n) , a , b , refl) =
+ inv
+ ( ind-Id
+ ( p+c=n)
+ ( λ H' H=H' → x = ((c , b +ℕ a , H') , a , b , refl))
+ ( refl)
+ ( _)
+ ( eq-type-Prop (Id-Prop ℕ-Set _ _)))
+
+ is-retraction-map-inv-equiv-permute-components-triple-with-sum-pr2 :
+ is-retraction
+ map-equiv-permute-components-triple-with-sum-pr2
+ map-inv-equiv-permute-components-triple-with-sum-pr2
+ is-retraction-map-inv-equiv-permute-components-triple-with-sum-pr2
+ x@((c , .(b +ℕ a) , p+c=n) , a , b , refl) =
+ inv
+ ( ind-Id
+ ( p+c=n)
+ ( λ H' H=H' → x = ((c , b +ℕ a , H') , a , b , refl))
+ ( refl)
+ ( _)
+ ( eq-type-Prop (Id-Prop ℕ-Set _ _)))
+
+ equiv-permute-components-triple-with-sum-pr2 :
+ Aut (Σ (pair-with-sum-ℕ n) (pair-with-sum-ℕ ∘ pr1 ∘ pr2))
+ equiv-permute-components-triple-with-sum-pr2 =
+ map-equiv-permute-components-triple-with-sum-pr2 ,
+ ( ( map-inv-equiv-permute-components-triple-with-sum-pr2 ,
+ is-section-map-inv-equiv-permute-components-triple-with-sum-pr2) ,
+ ( map-inv-equiv-permute-components-triple-with-sum-pr2 ,
+ is-retraction-map-inv-equiv-permute-components-triple-with-sum-pr2))
+```
diff --git a/src/elementary-number-theory/strict-inequality-natural-numbers.lagda.md b/src/elementary-number-theory/strict-inequality-natural-numbers.lagda.md
index 623bc26c65..95445f132a 100644
--- a/src/elementary-number-theory/strict-inequality-natural-numbers.lagda.md
+++ b/src/elementary-number-theory/strict-inequality-natural-numbers.lagda.md
@@ -20,12 +20,16 @@ open import foundation.coproduct-types
open import foundation.decidable-types
open import foundation.dependent-pair-types
open import foundation.empty-types
+open import foundation.equality-dependent-pair-types
+open import foundation.equivalences
open import foundation.function-types
open import foundation.functoriality-coproduct-types
open import foundation.identity-types
open import foundation.negated-equality
open import foundation.negation
open import foundation.propositions
+open import foundation.retractions
+open import foundation.sections
open import foundation.transport-along-identifications
open import foundation.unit-type
open import foundation.universe-levels
@@ -308,6 +312,19 @@ le-succ-leq-ℕ zero-ℕ y H = star
le-succ-leq-ℕ (succ-ℕ x) (succ-ℕ y) H = le-succ-leq-ℕ x y H
```
+### There is an equivalence between natural numbers less than `succ-ℕ n` and natural numbers less than or equal to `n`
+
+```agda
+equiv-le-succ-ℕ-leq-ℕ :
+ (n : ℕ) → Σ ℕ (λ k → le-ℕ k (succ-ℕ n)) ≃ Σ ℕ (λ k → leq-ℕ k n)
+equiv-le-succ-ℕ-leq-ℕ n =
+ ( λ (k , kImports
```agda
+open import foundation.action-on-identifications-functions
+open import foundation.coproduct-types
open import foundation.decidable-subtypes
open import foundation.dependent-pair-types
+open import foundation.disjoint-subtypes
open import foundation.disjunction
+open import foundation.empty-types
+open import foundation.equivalences
+open import foundation.functoriality-dependent-pair-types
open import foundation.large-locale-of-subtypes
+open import foundation.logical-equivalences
open import foundation.powersets
open import foundation.propositional-truncations
+open import foundation.propositions
+open import foundation.type-arithmetic-coproduct-types
open import foundation.universe-levels
open import foundation-core.subtypes
@@ -101,3 +110,56 @@ module _
( union-family-of-subtypes B x)
( λ (i , q) → unit-trunc-Prop (i , H i x q))
```
+
+### The union of disjoint subtypes is equivalent to their coproduct
+
+```agda
+module _
+ {l1 l2 l3 : Level} {X : UU l1} (A : subtype l2 X) (B : subtype l3 X)
+ (H : disjoint-subtype A B)
+ where
+
+ all-elements-equal-coproduct-disjoint-prop :
+ (x : X) → all-elements-equal (type-Prop (A x) + type-Prop (B x))
+ all-elements-equal-coproduct-disjoint-prop x (inl _) (inl _) =
+ ap inl (eq-type-Prop (A x))
+ all-elements-equal-coproduct-disjoint-prop x (inr _) (inr _) =
+ ap inr (eq-type-Prop (B x))
+ all-elements-equal-coproduct-disjoint-prop x (inl ax) (inr bx) =
+ ex-falso (H x (ax , bx))
+ all-elements-equal-coproduct-disjoint-prop x (inr bx) (inl ax) =
+ ex-falso (H x (ax , bx))
+
+ is-prop-coproduct-disjoint-prop :
+ (x : X) → is-prop (type-Prop (A x) + type-Prop (B x))
+ is-prop-coproduct-disjoint-prop x =
+ is-prop-all-elements-equal (all-elements-equal-coproduct-disjoint-prop x)
+
+ subtype-coproduct-disjoint-subtype : subtype (l2 ⊔ l3) X
+ subtype-coproduct-disjoint-subtype x =
+ type-Prop (A x) + type-Prop (B x) , is-prop-coproduct-disjoint-prop x
+
+ iff-disjunction-coproduct-disjoint-subtype :
+ (x : X) → type-iff-Prop (A x ∨ B x) (subtype-coproduct-disjoint-subtype x)
+ pr1 (iff-disjunction-coproduct-disjoint-subtype x) =
+ elim-disjunction (subtype-coproduct-disjoint-subtype x) inl inr
+ pr2 (iff-disjunction-coproduct-disjoint-subtype x) =
+ rec-coproduct inl-disjunction inr-disjunction
+
+ equiv-union-subtype-coproduct-disjoint-subtype :
+ type-subtype (union-subtype A B) ≃
+ type-subtype subtype-coproduct-disjoint-subtype
+ equiv-union-subtype-coproduct-disjoint-subtype =
+ equiv-tot
+ ( λ x →
+ equiv-iff'
+ ( A x ∨ B x)
+ ( subtype-coproduct-disjoint-subtype x)
+ ( iff-disjunction-coproduct-disjoint-subtype x))
+
+ equiv-union-coproduct-disjoint-subtype :
+ type-subtype (union-subtype A B) ≃ type-subtype A + type-subtype B
+ equiv-union-coproduct-disjoint-subtype =
+ left-distributive-Σ-coproduct X (is-in-subtype A) (is-in-subtype B) ∘e
+ equiv-union-subtype-coproduct-disjoint-subtype
+```
diff --git a/src/group-theory.lagda.md b/src/group-theory.lagda.md
index 6d7a7e8e31..4273264e24 100644
--- a/src/group-theory.lagda.md
+++ b/src/group-theory.lagda.md
@@ -157,6 +157,7 @@ open import group-theory.principal-group-actions public
open import group-theory.principal-torsors-concrete-groups public
open import group-theory.products-of-elements-monoids public
open import group-theory.products-of-tuples-of-elements-commutative-monoids public
+open import group-theory.products-of-tuples-of-elements-monoids public
open import group-theory.pullbacks-subgroups public
open import group-theory.pullbacks-subsemigroups public
open import group-theory.quotient-groups public
diff --git a/src/group-theory/function-commutative-monoids.lagda.md b/src/group-theory/function-commutative-monoids.lagda.md
index 57b44087dc..a86b1a44b5 100644
--- a/src/group-theory/function-commutative-monoids.lagda.md
+++ b/src/group-theory/function-commutative-monoids.lagda.md
@@ -20,7 +20,7 @@ open import group-theory.monoids
## Idea
-Given a commutative monoid `M` and a type `X`, the function commuative monoid
+Given a commutative monoid `M` and a type `X`, the function commutative monoid
`M^X` consists of functions from `X` to the underlying type of `M`. The
multiplicative operation and the unit are given pointwise.
diff --git a/src/group-theory/products-of-tuples-of-elements-commutative-monoids.lagda.md b/src/group-theory/products-of-tuples-of-elements-commutative-monoids.lagda.md
index 120ca6b54c..4ad9969f5e 100644
--- a/src/group-theory/products-of-tuples-of-elements-commutative-monoids.lagda.md
+++ b/src/group-theory/products-of-tuples-of-elements-commutative-monoids.lagda.md
@@ -1,22 +1,57 @@
# Products of tuples of elements in commutative monoids
```agda
+{-# OPTIONS --lossy-unification #-}
+
module group-theory.products-of-tuples-of-elements-commutative-monoids where
```
Imports
```agda
+open import elementary-number-theory.addition-natural-numbers
open import elementary-number-theory.natural-numbers
+open import finite-group-theory.permutations-standard-finite-types
+open import finite-group-theory.transpositions-standard-finite-types
+
+open import foundation.action-on-identifications-functions
+open import foundation.cartesian-product-types
open import foundation.coproduct-types
+open import foundation.dependent-pair-types
+open import foundation.empty-types
+open import foundation.equivalences
+open import foundation.function-extensionality
open import foundation.function-types
+open import foundation.functoriality-coproduct-types
+open import foundation.functoriality-dependent-pair-types
+open import foundation.homotopies
+open import foundation.identity-types
+open import foundation.negated-equality
+open import foundation.propositional-truncations
+open import foundation.sets
+open import foundation.type-arithmetic-coproduct-types
+open import foundation.type-arithmetic-empty-type
+open import foundation.type-arithmetic-unit-type
open import foundation.unit-type
+open import foundation.universal-property-propositional-truncation-into-sets
open import foundation.universe-levels
+open import foundation.whiskering-homotopies-composition
open import group-theory.commutative-monoids
+open import group-theory.monoids
+open import group-theory.products-of-tuples-of-elements-monoids
+
+open import linear-algebra.vectors-on-commutative-monoids
+open import lists.lists
+
+open import univalent-combinatorics.coproduct-types
open import univalent-combinatorics.counting
+open import univalent-combinatorics.counting-dependent-pair-types
+open import univalent-combinatorics.dependent-pair-types
+open import univalent-combinatorics.double-counting
+open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
@@ -24,60 +59,856 @@ open import univalent-combinatorics.standard-finite-types
## Idea
-Given an unordered `n`-tuple of elements in a commutative monoid, we can define
-their product.
+The product operation extends the binary multiplication operation on a
+[commutative monoid](group-theory.commutative-monoids.md) `M` to any family of
+elements of `M` indexed by a
+[standard finite type](univalent-combinatorics.standard-finite-types.md), or to
+any [finite type](univalent-combinatorics.finite-types.md).
## Definition
-### Products of ordered n-tuples of elements in commutative monoids
+```agda
+mul-fin-Commutative-Monoid :
+ {l : Level} (M : Commutative-Monoid l) (n : ℕ) →
+ (functional-vec-Commutative-Monoid M n) → type-Commutative-Monoid M
+mul-fin-Commutative-Monoid M =
+ mul-fin-Monoid (monoid-Commutative-Monoid M)
+```
+
+## Properties
+
+### Products of one and two elements
```agda
module _
{l : Level} (M : Commutative-Monoid l)
where
- mul-fin-Commutative-Monoid :
- (n : ℕ) → (Fin n → type-Commutative-Monoid M) → type-Commutative-Monoid M
- mul-fin-Commutative-Monoid zero-ℕ x = unit-Commutative-Monoid M
- mul-fin-Commutative-Monoid (succ-ℕ n) x =
+ mul-one-element-Commutative-Monoid :
+ (f : functional-vec-Commutative-Monoid M 1) →
+ mul-fin-Commutative-Monoid M 1 f =
+ head-functional-vec-Commutative-Monoid M 0 f
+ mul-one-element-Commutative-Monoid =
+ mul-one-element-Monoid (monoid-Commutative-Monoid M)
+
+ mul-two-elements-Commutative-Monoid :
+ (f : functional-vec-Commutative-Monoid M 2) →
+ mul-fin-Commutative-Monoid M 2 f =
+ mul-Commutative-Monoid M (f (zero-Fin 1)) (f (one-Fin 1))
+ mul-two-elements-Commutative-Monoid =
+ mul-two-elements-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Products are homotopy invariant
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ htpy-mul-fin-Commutative-Monoid :
+ (n : ℕ) {f g : functional-vec-Commutative-Monoid M n} →
+ (f ~ g) →
+ mul-fin-Commutative-Monoid M n f = mul-fin-Commutative-Monoid M n g
+ htpy-mul-fin-Commutative-Monoid =
+ htpy-mul-fin-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Products are equal to the zero-th term plus the rest
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ cons-mul-fin-Commutative-Monoid :
+ (n : ℕ) (f : functional-vec-Commutative-Monoid M (succ-ℕ n)) →
+ {x : type-Commutative-Monoid M} →
+ head-functional-vec-Commutative-Monoid M n f = x →
+ mul-fin-Commutative-Monoid M (succ-ℕ n) f =
+ mul-Commutative-Monoid M (mul-fin-Commutative-Monoid M n (f ∘ inl-Fin n)) x
+ cons-mul-fin-Commutative-Monoid =
+ cons-mul-fin-Monoid (monoid-Commutative-Monoid M)
+
+ snoc-mul-fin-Commutative-Monoid :
+ (n : ℕ) (f : functional-vec-Commutative-Monoid M (succ-ℕ n)) →
+ {x : type-Commutative-Monoid M} → f (zero-Fin n) = x →
+ mul-fin-Commutative-Monoid M (succ-ℕ n) f =
mul-Commutative-Monoid M
- ( mul-fin-Commutative-Monoid n (x ∘ inl))
- ( x (inr star))
+ ( x)
+ ( mul-fin-Commutative-Monoid M n (f ∘ inr-Fin n))
+ snoc-mul-fin-Commutative-Monoid =
+ snoc-mul-fin-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Extending a product of elements in a monoid
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ extend-mul-fin-Commutative-Monoid :
+ (n : ℕ) (f : functional-vec-Commutative-Monoid M n) →
+ mul-fin-Commutative-Monoid M
+ ( succ-ℕ n)
+ ( cons-functional-vec-Commutative-Monoid
+ ( M)
+ ( n)
+ ( unit-Commutative-Monoid M) f) =
+ mul-fin-Commutative-Monoid M n f
+ extend-mul-fin-Commutative-Monoid =
+ extend-mul-fin-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Shifting a product of elements in a monoid
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ shift-mul-fin-Commutative-Monoid :
+ (n : ℕ) (f : functional-vec-Commutative-Monoid M n) →
+ mul-fin-Commutative-Monoid M
+ ( succ-ℕ n)
+ ( snoc-functional-vec-Commutative-Monoid M n f
+ ( unit-Commutative-Monoid M)) =
+ mul-fin-Commutative-Monoid M n f
+ shift-mul-fin-Commutative-Monoid =
+ shift-mul-fin-Monoid (monoid-Commutative-Monoid M)
+```
+
+### A product of units is the unit
- mul-count-Commutative-Monoid :
- {l2 : Level} {A : UU l2} → count A →
- (A → type-Commutative-Monoid M) → type-Commutative-Monoid M
- mul-count-Commutative-Monoid e x =
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ mul-fin-unit-Commutative-Monoid :
+ (n : ℕ) →
mul-fin-Commutative-Monoid
- ( number-of-elements-count e)
- ( x ∘ map-equiv-count e)
+ ( M)
+ ( n)
+ ( zero-functional-vec-Commutative-Monoid M n) =
+ unit-Commutative-Monoid M
+ mul-fin-unit-Commutative-Monoid =
+ mul-fin-unit-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Splitting products
+
+```agda
+split-mul-fin-Commutative-Monoid :
+ {l : Level} (M : Commutative-Monoid l)
+ (n m : ℕ) (f : functional-vec-Commutative-Monoid M (n +ℕ m)) →
+ mul-fin-Commutative-Monoid M (n +ℕ m) f =
+ mul-Commutative-Monoid M
+ ( mul-fin-Commutative-Monoid M n (f ∘ inl-coproduct-Fin n m))
+ ( mul-fin-Commutative-Monoid M m (f ∘ inr-coproduct-Fin n m))
+split-mul-fin-Commutative-Monoid M =
+ split-mul-fin-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Permutations preserve products
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ abstract
+ preserves-product-adjacent-transposition-mul-fin-Commutative-Monoid :
+ (n : ℕ) → (k : Fin n) →
+ (f : functional-vec-Commutative-Monoid M (succ-ℕ n)) →
+ mul-fin-Commutative-Monoid M (succ-ℕ n) f =
+ mul-fin-Commutative-Monoid
+ M (succ-ℕ n) (f ∘ map-adjacent-transposition-Fin n k)
+ preserves-product-adjacent-transposition-mul-fin-Commutative-Monoid
+ (succ-ℕ n) (inl x) f =
+ ap-mul-Commutative-Monoid
+ ( M)
+ ( preserves-product-adjacent-transposition-mul-fin-Commutative-Monoid
+ ( n)
+ ( x)
+ ( f ∘ inl-Fin (succ-ℕ n)))
+ ( refl)
+ preserves-product-adjacent-transposition-mul-fin-Commutative-Monoid
+ (succ-ℕ n) (inr star) f = right-swap-mul-Commutative-Monoid M _ _ _
+
+ preserves-product-permutation-list-adjacent-transpositions-Commutative-Monoid :
+ (n : ℕ) → (L : list (Fin n)) →
+ (f : functional-vec-Commutative-Monoid M (succ-ℕ n)) →
+ mul-fin-Commutative-Monoid M (succ-ℕ n) f =
+ mul-fin-Commutative-Monoid
+ M (succ-ℕ n) (f ∘ map-permutation-list-adjacent-transpositions n L)
+ preserves-product-permutation-list-adjacent-transpositions-Commutative-Monoid
+ n nil f = refl
+ preserves-product-permutation-list-adjacent-transpositions-Commutative-Monoid
+ n (cons x L) f =
+ preserves-product-adjacent-transposition-mul-fin-Commutative-Monoid
+ ( n)
+ ( x)
+ ( f) ∙
+ preserves-product-permutation-list-adjacent-transpositions-Commutative-Monoid
+ ( n)
+ ( L)
+ ( f ∘ map-adjacent-transposition-Fin n x)
+
+ preserves-product-transposition-Commutative-Monoid :
+ (n : ℕ) (i j : Fin (succ-ℕ n)) (neq : i ≠ j) →
+ (f : functional-vec-Commutative-Monoid M (succ-ℕ n)) →
+ mul-fin-Commutative-Monoid M (succ-ℕ n) f =
+ mul-fin-Commutative-Monoid
+ M (succ-ℕ n) (f ∘ map-transposition-Fin (succ-ℕ n) i j neq)
+ preserves-product-transposition-Commutative-Monoid n i j i≠j f =
+ preserves-product-permutation-list-adjacent-transpositions-Commutative-Monoid
+ ( n)
+ ( list-adjacent-transpositions-transposition-Fin n i j)
+ ( f) ∙
+ ap
+ ( λ g → mul-fin-Commutative-Monoid M (succ-ℕ n) (f ∘ map-equiv g))
+ ( eq-permutation-list-adjacent-transpositions-transposition-Fin
+ ( n)
+ ( i)
+ ( j)
+ ( i≠j))
+
+ preserves-product-permutation-list-standard-transpositions-Commutative-Monoid :
+ (n : ℕ) → (L : list (Σ (Fin n × Fin n) ( λ (i , j) → i ≠ j))) →
+ (f : functional-vec-Commutative-Monoid M n) →
+ mul-fin-Commutative-Monoid M n f =
+ mul-fin-Commutative-Monoid
+ M n (f ∘ map-equiv (permutation-list-standard-transpositions-Fin n L))
+ preserves-product-permutation-list-standard-transpositions-Commutative-Monoid
+ zero-ℕ _ _ = refl
+ preserves-product-permutation-list-standard-transpositions-Commutative-Monoid
+ (succ-ℕ n) nil f = refl
+ preserves-product-permutation-list-standard-transpositions-Commutative-Monoid
+ (succ-ℕ n) (cons ((i , j) , i≠j) L) f =
+ preserves-product-transposition-Commutative-Monoid n i j i≠j f ∙
+ preserves-product-permutation-list-standard-transpositions-Commutative-Monoid
+ ( succ-ℕ n)
+ ( L)
+ ( f ∘ map-transposition-Fin (succ-ℕ n) i j i≠j)
+
+ preserves-product-permutation-Commutative-Monoid :
+ (n : ℕ) → (σ : Permutation n) →
+ (f : functional-vec-Commutative-Monoid M n) →
+ mul-fin-Commutative-Monoid M n f =
+ mul-fin-Commutative-Monoid M n (f ∘ map-equiv σ)
+ preserves-product-permutation-Commutative-Monoid n σ f =
+ preserves-product-permutation-list-standard-transpositions-Commutative-Monoid
+ ( n)
+ ( list-standard-transpositions-permutation-Fin n σ)
+ ( f) ∙
+ ap
+ ( λ τ → mul-fin-Commutative-Monoid M n (f ∘ map-equiv τ))
+ ( eq-permutation-list-standard-transpositions-Fin n σ)
+```
+
+### Products for a count for a type
+
+```agda
+mul-count-Commutative-Monoid :
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : UU l2) →
+ count A → (A → type-Commutative-Monoid M) → type-Commutative-Monoid M
+mul-count-Commutative-Monoid M A (n , Fin-n≃A) f =
+ mul-fin-Commutative-Monoid M n (f ∘ map-equiv Fin-n≃A)
+```
+
+### Products for a count for a type are homotopy invariant
+
+```agda
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : UU l2)
+ where
+
+ htpy-mul-count-Commutative-Monoid :
+ (c : count A) →
+ {f g : A → type-Commutative-Monoid M} → (f ~ g) →
+ mul-count-Commutative-Monoid M A c f =
+ mul-count-Commutative-Monoid M A c g
+ htpy-mul-count-Commutative-Monoid (nA , _) H =
+ htpy-mul-fin-Commutative-Monoid M nA (λ i → H _)
+```
+
+### Two counts for the same set produce equal products
+
+```agda
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : UU l2)
+ where
+
+ abstract
+ eq-mul-count-equiv-Commutative-Monoid :
+ (n : ℕ) → (equiv1 equiv2 : Fin n ≃ A) →
+ (f : A → type-Commutative-Monoid M) →
+ mul-count-Commutative-Monoid M A (n , equiv1) f =
+ mul-count-Commutative-Monoid M A (n , equiv2) f
+ eq-mul-count-equiv-Commutative-Monoid n equiv1 equiv2 f =
+ equational-reasoning
+ mul-fin-Commutative-Monoid M n (f ∘ map-equiv equiv1)
+ =
+ mul-fin-Commutative-Monoid
+ ( M)
+ ( n)
+ ( (f ∘ map-equiv equiv1) ∘ (map-inv-equiv equiv1 ∘ map-equiv equiv2))
+ by
+ preserves-product-permutation-Commutative-Monoid
+ ( M)
+ ( n)
+ ( inv-equiv equiv1 ∘e equiv2)
+ ( f ∘ map-equiv equiv1)
+ = mul-fin-Commutative-Monoid M n (f ∘ map-equiv equiv2)
+ by
+ ap
+ ( λ g → mul-fin-Commutative-Monoid M n (f ∘ (g ∘ map-equiv equiv2)))
+ ( eq-htpy (is-section-map-inv-equiv equiv1))
+
+ eq-mul-count-Commutative-Monoid :
+ (f : A → type-Commutative-Monoid M) (c1 c2 : count A) →
+ mul-count-Commutative-Monoid M A c1 f =
+ mul-count-Commutative-Monoid M A c2 f
+ eq-mul-count-Commutative-Monoid f c1@(n , e1) c2@(_ , e2)
+ with double-counting c1 c2
+ ... | refl = eq-mul-count-equiv-Commutative-Monoid n e1 e2 f
+```
+
+### Products over finite types
+
+```agda
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : Finite-Type l2)
+ where
+
+ mul-finite-Commutative-Monoid :
+ (f : type-Finite-Type A → type-Commutative-Monoid M) →
+ type-Commutative-Monoid M
+ mul-finite-Commutative-Monoid f =
+ map-universal-property-set-quotient-trunc-Prop
+ ( set-Commutative-Monoid M)
+ ( λ c → mul-count-Commutative-Monoid M (type-Finite-Type A) c f)
+ ( eq-mul-count-Commutative-Monoid M (type-Finite-Type A) f)
+ ( is-finite-type-Finite-Type A)
+```
+
+### The product over a finite type is its product over any count for the type
+
+```agda
+module _
+ {l1 l2 l3 : Level} (M : Commutative-Monoid l1)
+ (A : UU l2) (B : UU l3) (H : A ≃ B)
+ where
+
+ abstract
+ mul-equiv-count-Commutative-Monoid :
+ (cA : count A) (cB : count B) (f : A → type-Commutative-Monoid M) →
+ mul-count-Commutative-Monoid M A cA f =
+ mul-count-Commutative-Monoid M B cB (f ∘ map-inv-equiv H)
+ mul-equiv-count-Commutative-Monoid
+ cA@(nA , Fin-nA≃A) cB@(_ , Fin-nB≃B) f
+ with double-counting-equiv cA cB H
+ ... | refl =
+ preserves-product-permutation-Commutative-Monoid
+ ( M)
+ ( nA)
+ ( inv-equiv Fin-nA≃A ∘e inv-equiv H ∘e Fin-nB≃B)
+ ( _) ∙
+ htpy-mul-fin-Commutative-Monoid
+ ( M)
+ ( nA)
+ ( λ i → ap f (is-section-map-inv-equiv Fin-nA≃A _))
+
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1)
+ (A : Finite-Type l2) (cA : count (type-Finite-Type A))
+ where
+
+ abstract
+ mul-finite-count-Commutative-Monoid :
+ (f : type-Finite-Type A → type-Commutative-Monoid M) →
+ mul-finite-Commutative-Monoid M A f =
+ mul-count-Commutative-Monoid M (type-Finite-Type A) cA f
+ mul-finite-count-Commutative-Monoid f =
+ equational-reasoning
+ mul-finite-Commutative-Monoid M A f
+ =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( type-Finite-Type A , unit-trunc-Prop cA)
+ ( f)
+ by
+ ap
+ ( λ c →
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( type-Finite-Type A , c)
+ ( f))
+ ( all-elements-equal-type-trunc-Prop
+ ( is-finite-type-Finite-Type A)
+ ( unit-trunc-Prop cA))
+ = mul-count-Commutative-Monoid M (type-Finite-Type A) cA f
+ by
+ htpy-universal-property-set-quotient-trunc-Prop
+ ( set-Commutative-Monoid M)
+ ( λ c →
+ mul-count-Commutative-Monoid M (type-Finite-Type A) c f)
+ ( eq-mul-count-Commutative-Monoid M (type-Finite-Type A) f)
+ ( cA)
+```
+
+### The product over an empty type is the unit
+
+```agda
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : Finite-Type l2)
+ (H : is-empty (type-Finite-Type A))
+ where
+
+ abstract
+ mul-is-empty-finite-Commutative-Monoid :
+ (f : type-Finite-Type A → type-Commutative-Monoid M) →
+ is-unit-Commutative-Monoid M (mul-finite-Commutative-Monoid M A f)
+ mul-is-empty-finite-Commutative-Monoid =
+ mul-finite-count-Commutative-Monoid M A (count-is-empty H)
+```
-{-
- compute-permutation-mul-fin-Commutative-Monoid :
- (n : ℕ) (e : Fin n ≃ Fin n) (x : Fin n → type-Commutative-Monoid M) →
- Id ( mul-fin-Commutative-Monoid n (x ∘ map-equiv e))
- ( mul-fin-Commutative-Monoid n x)
- compute-permutation-mul-fin-Commutative-Monoid zero-ℕ e x = refl
- compute-permutation-mul-fin-Commutative-Monoid (succ-ℕ n) e x = {!!}
+### The product of units is the unit
+
+```agda
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : Finite-Type l2)
+ where
+
+ mul-finite-unit-Commutative-Monoid :
+ is-unit-Commutative-Monoid
+ ( M)
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( A)
+ ( λ _ → unit-Commutative-Monoid M))
+ mul-finite-unit-Commutative-Monoid =
+ let
+ open
+ do-syntax-trunc-Prop
+ (is-unit-prop-Commutative-Monoid
+ ( M)
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( A)
+ ( λ _ → unit-Commutative-Monoid M)))
+ in do
+ cA ← is-finite-type-Finite-Type A
+ mul-finite-count-Commutative-Monoid M A cA _ ∙
+ mul-fin-unit-Commutative-Monoid M _
+```
+
+### Products over a finite type are homotopy invariant
+
+```agda
+module _
+ {l1 l2 : Level} (M : Commutative-Monoid l1) (A : Finite-Type l2)
+ where
+
+ abstract
+ htpy-mul-finite-Commutative-Monoid :
+ {f g : type-Finite-Type A → type-Commutative-Monoid M} →
+ f ~ g →
+ mul-finite-Commutative-Monoid M A f = mul-finite-Commutative-Monoid M A g
+ htpy-mul-finite-Commutative-Monoid {f} {g} H =
+ let
+ open
+ do-syntax-trunc-Prop
+ ( Id-Prop
+ ( set-Commutative-Monoid M)
+ ( mul-finite-Commutative-Monoid M A f)
+ ( mul-finite-Commutative-Monoid M A g))
+ in do
+ cA ← is-finite-type-Finite-Type A
+ equational-reasoning
+ mul-finite-Commutative-Monoid M A f
+ = mul-count-Commutative-Monoid M (type-Finite-Type A) cA f
+ by mul-finite-count-Commutative-Monoid M A cA f
+ = mul-count-Commutative-Monoid M (type-Finite-Type A) cA g
+ by htpy-mul-count-Commutative-Monoid M (type-Finite-Type A) cA H
+ = mul-finite-Commutative-Monoid M A g
+ by inv (mul-finite-count-Commutative-Monoid M A cA g)
+```
+
+### Products over finite types are preserved by equivalences
+
+```agda
+module _
+ {l1 l2 l3 : Level} (M : Commutative-Monoid l1)
+ (A : Finite-Type l2) (B : Finite-Type l3)
+ (H : equiv-Finite-Type A B)
+ where
+
+ abstract
+ mul-equiv-finite-Commutative-Monoid :
+ (f : type-Finite-Type A → type-Commutative-Monoid M) →
+ mul-finite-Commutative-Monoid M A f =
+ mul-finite-Commutative-Monoid M B (f ∘ map-inv-equiv H)
+ mul-equiv-finite-Commutative-Monoid f =
+ let
+ open
+ do-syntax-trunc-Prop
+ ( Id-Prop
+ ( set-Commutative-Monoid M)
+ ( mul-finite-Commutative-Monoid M A f)
+ ( mul-finite-Commutative-Monoid M B (f ∘ map-inv-equiv H)))
+ in do
+ cA ← is-finite-type-Finite-Type A
+ cB ← is-finite-type-Finite-Type B
+ equational-reasoning
+ mul-finite-Commutative-Monoid M A f
+ =
+ mul-count-Commutative-Monoid M (type-Finite-Type A) cA f
+ by mul-finite-count-Commutative-Monoid M A cA f
+ =
+ mul-count-Commutative-Monoid
+ ( M)
+ ( type-Finite-Type B)
+ ( cB)
+ ( f ∘ map-inv-equiv H)
+ by
+ mul-equiv-count-Commutative-Monoid
+ ( M)
+ ( type-Finite-Type A)
+ ( type-Finite-Type B)
+ ( H)
+ ( cA)
+ ( cB)
+ ( f)
+ = mul-finite-Commutative-Monoid M B (f ∘ map-inv-equiv H)
+ by inv (mul-finite-count-Commutative-Monoid M B cB _)
+```
+
+### Products over finite types distribute over coproducts
+
+```agda
+module _
+ {l1 l2 l3 : Level} (M : Commutative-Monoid l1)
+ (A : Finite-Type l2) (B : Finite-Type l3)
+ where
+
+ abstract
+ mul-coproduct-finite-Commutative-Monoid :
+ (f :
+ type-Finite-Type A + type-Finite-Type B → type-Commutative-Monoid M) →
+ mul-finite-Commutative-Monoid M (coproduct-Finite-Type A B) f =
+ mul-Commutative-Monoid
+ ( M)
+ ( mul-finite-Commutative-Monoid M A (f ∘ inl))
+ ( mul-finite-Commutative-Monoid M B (f ∘ inr))
+ mul-coproduct-finite-Commutative-Monoid f =
+ let
+ open
+ do-syntax-trunc-Prop
+ ( Id-Prop
+ ( set-Commutative-Monoid M)
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( coproduct-Finite-Type A B)
+ ( f))
+ ( mul-Commutative-Monoid
+ ( M)
+ ( mul-finite-Commutative-Monoid M A (f ∘ inl))
+ ( mul-finite-Commutative-Monoid M B (f ∘ inr))))
+ in do
+ cA@(nA , Fin-nA≃A) ← is-finite-type-Finite-Type A
+ cB@(nB , Fin-nB≃B) ← is-finite-type-Finite-Type B
+ equational-reasoning
+ mul-finite-Commutative-Monoid M (coproduct-Finite-Type A B) f
+ =
+ mul-fin-Commutative-Monoid
+ ( M)
+ ( nA +ℕ nB)
+ ( f ∘ map-equiv-count (count-coproduct cA cB))
+ by
+ mul-finite-count-Commutative-Monoid
+ ( M)
+ ( coproduct-Finite-Type A B)
+ ( count-coproduct cA cB)
+ ( f)
+ =
+ mul-Commutative-Monoid M
+ ( mul-fin-Commutative-Monoid
+ ( M)
+ ( nA)
+ ( f ∘
+ map-equiv-count (count-coproduct cA cB) ∘
+ inl-coproduct-Fin nA nB))
+ ( mul-fin-Commutative-Monoid
+ ( M)
+ ( nB)
+ ( f ∘
+ map-equiv-count (count-coproduct cA cB) ∘
+ inr-coproduct-Fin nA nB))
+ by
+ split-mul-fin-Commutative-Monoid
+ ( M)
+ ( nA)
+ ( nB)
+ ( f ∘ map-equiv-count (count-coproduct cA cB))
+ =
+ mul-Commutative-Monoid
+ ( M)
+ ( mul-fin-Commutative-Monoid
+ ( M)
+ ( nA)
+ ( f ∘ inl ∘ map-equiv-count cA))
+ ( mul-fin-Commutative-Monoid
+ ( M)
+ ( nB)
+ ( f ∘ inr ∘ map-equiv-count cB))
+ by
+ ap-mul-Commutative-Monoid
+ ( M)
+ ( ap
+ ( λ g → mul-fin-Commutative-Monoid M nA (f ∘ g))
+ ( eq-htpy
+ ( map-equiv-count-coproduct-inl-coproduct-Fin cA cB)))
+ ( ap
+ ( λ g → mul-fin-Commutative-Monoid M nB (f ∘ g))
+ ( eq-htpy
+ ( map-equiv-count-coproduct-inr-coproduct-Fin cA cB)))
+ =
+ mul-Commutative-Monoid
+ ( M)
+ ( mul-finite-Commutative-Monoid M A (f ∘ inl))
+ ( mul-finite-Commutative-Monoid M B (f ∘ inr))
+ by
+ inv
+ ( ap-mul-Commutative-Monoid
+ ( M)
+ ( mul-finite-count-Commutative-Monoid
+ ( M)
+ ( A)
+ ( cA)
+ ( f ∘ inl))
+ ( mul-finite-count-Commutative-Monoid
+ ( M)
+ ( B)
+ ( cB)
+ ( f ∘ inr)))
+```
+
+### Products distribute over dependent pair types
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ abstract
+ mul-fin-finite-Σ-Commutative-Monoid :
+ (n : ℕ) →
+ {l2 : Level} →
+ (B : Fin n → Finite-Type l2) →
+ (f : (k : Fin n) → type-Finite-Type (B k) → type-Commutative-Monoid M) →
+ mul-fin-Commutative-Monoid M n
+ (λ k → mul-finite-Commutative-Monoid M (B k) (f k)) =
+ mul-finite-Commutative-Monoid
+ M (Σ-Finite-Type (Fin-Finite-Type n) B) (ind-Σ f)
+ mul-fin-finite-Σ-Commutative-Monoid zero-ℕ B f =
+ inv
+ ( mul-is-empty-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type zero-ℕ) B)
+ ( λ ())
+ ( ind-Σ f))
+ mul-fin-finite-Σ-Commutative-Monoid (succ-ℕ n) B f =
+ equational-reasoning
+ mul-fin-Commutative-Monoid
+ ( M)
+ ( succ-ℕ n)
+ ( λ k → mul-finite-Commutative-Monoid M (B k) (f k))
+ =
+ mul-Commutative-Monoid
+ ( M)
+ ( mul-fin-Commutative-Monoid
+ ( M)
+ ( n)
+ ( λ k →
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( B (inl k))
+ ( f (inl k))))
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( B (inr star))
+ ( f (inr star)))
+ by
+ cons-mul-fin-Commutative-Monoid
+ ( M)
+ ( n)
+ ( λ k → mul-finite-Commutative-Monoid M (B k) (f k))
+ ( refl)
+ =
+ mul-Commutative-Monoid
+ ( M)
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type n) (B ∘ inl))
+ ( ind-Σ (f ∘ inl)))
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( B (inr star))
+ ( f (inr star)))
+ by
+ ap-mul-Commutative-Monoid
+ ( M)
+ ( mul-fin-finite-Σ-Commutative-Monoid
+ ( n)
+ ( B ∘ inl)
+ ( f ∘ inl))
+ ( refl)
+ =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( coproduct-Finite-Type
+ ( Σ-Finite-Type (Fin-Finite-Type n) (B ∘ inl))
+ ( B (inr star)))
+ ( rec-coproduct (ind-Σ (f ∘ inl)) (f (inr star)))
+ by
+ inv
+ ( mul-coproduct-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type n) (B ∘ inl))
+ ( B (inr star))
+ ( rec-coproduct (ind-Σ (f ∘ inl)) (f (inr star))))
+ =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type (succ-ℕ n)) B)
+ ( rec-coproduct (ind-Σ (f ∘ inl)) (f (inr star)) ∘
+ map-coproduct
+ ( id)
+ ( map-left-unit-law-Σ (type-Finite-Type ∘ B ∘ inr)) ∘
+ map-right-distributive-Σ-coproduct
+ ( Fin n)
+ ( unit)
+ ( type-Finite-Type ∘ B))
+ by
+ mul-equiv-finite-Commutative-Monoid
+ ( M)
+ ( coproduct-Finite-Type
+ ( Σ-Finite-Type (Fin-Finite-Type n) (B ∘ inl))
+ ( B (inr star)))
+ (Σ-Finite-Type (Fin-Finite-Type (succ-ℕ n)) B)
+ ( inv-equiv
+ ( equiv-coproduct
+ ( id-equiv)
+ ( left-unit-law-Σ (type-Finite-Type ∘ B ∘ inr)) ∘e
+ right-distributive-Σ-coproduct
+ ( Fin n)
+ ( unit)
+ ( type-Finite-Type ∘ B)))
+ _
+ =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type (succ-ℕ n)) B)
+ ( ind-Σ f)
+ by
+ htpy-mul-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type (succ-ℕ n)) B)
+ ( λ { (inl k , b) → refl ; (inr k , b) → refl})
+
+module _
+ {l1 l2 l3 : Level} (M : Commutative-Monoid l1)
+ (A : Finite-Type l2) (B : type-Finite-Type A → Finite-Type l3)
+ where
- compute-mul-double-counting-Commutative-Monoid :
- {l2 : Level} {A : UU l2} (e1 : count A) (e2 : count A) →
- (x : A → type-Commutative-Monoid M) →
- Id (mul-count-Commutative-Monoid e1 x) (mul-count-Commutative-Monoid e2 x)
- compute-mul-double-counting-Commutative-Monoid e1 e2 x = {!!}
--}
+ abstract
+ mul-Σ-finite-Commutative-Monoid :
+ (f :
+ (a : type-Finite-Type A) →
+ type-Finite-Type (B a) →
+ type-Commutative-Monoid M) →
+ mul-finite-Commutative-Monoid M (Σ-Finite-Type A B) (ind-Σ f) =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( A)
+ ( λ a → mul-finite-Commutative-Monoid M (B a) (f a))
+ mul-Σ-finite-Commutative-Monoid f =
+ let
+ open
+ do-syntax-trunc-Prop
+ ( Id-Prop
+ ( set-Commutative-Monoid M)
+ ( mul-finite-Commutative-Monoid M (Σ-Finite-Type A B) (ind-Σ f))
+ ( mul-finite-Commutative-Monoid
+ ( M)
+ ( A)
+ ( λ a → mul-finite-Commutative-Monoid M (B a) (f a))))
+ in do
+ cA@(nA , Fin-nA≃A) ← is-finite-type-Finite-Type A
+ equational-reasoning
+ mul-finite-Commutative-Monoid M (Σ-Finite-Type A B) (ind-Σ f)
+ =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type (Fin-Finite-Type nA) (B ∘ map-equiv Fin-nA≃A))
+ ( ind-Σ (f ∘ map-equiv Fin-nA≃A))
+ by
+ mul-equiv-finite-Commutative-Monoid
+ ( M)
+ ( Σ-Finite-Type A B)
+ ( Σ-Finite-Type (Fin-Finite-Type nA) (B ∘ map-equiv Fin-nA≃A))
+ ( inv-equiv
+ ( equiv-Σ-equiv-base (type-Finite-Type ∘ B) Fin-nA≃A))
+ ( _)
+ =
+ mul-count-Commutative-Monoid
+ ( M)
+ ( type-Finite-Type A)
+ ( cA)
+ ( λ a → mul-finite-Commutative-Monoid M (B a) (f a))
+ by
+ inv
+ ( mul-fin-finite-Σ-Commutative-Monoid
+ ( M)
+ ( nA)
+ ( B ∘ map-equiv Fin-nA≃A)
+ ( f ∘ map-equiv Fin-nA≃A))
+ =
+ mul-finite-Commutative-Monoid
+ ( M)
+ ( A)
+ ( λ a → mul-finite-Commutative-Monoid M (B a) (f a))
+ by inv (mul-finite-count-Commutative-Monoid M A cA _)
```
-### Products of unordered n-tuples of elements in commutative monoids
+### Products over the unit type
```agda
module _
{l : Level} (M : Commutative-Monoid l)
where
-{-
- mul-tuple-Commutative-Monoid :
- {n : ℕ} → unordered-tuple-Commutative-Monoid n M → type-Commutative-Monoid M
- mul-tuple-Commutative-Monoid {n} (pair I x) = {!!}
--}
+ abstract
+ mul-unit-finite-Commutative-Monoid :
+ (f : unit → type-Commutative-Monoid M) →
+ mul-finite-Commutative-Monoid M unit-Finite-Type f = f star
+ mul-unit-finite-Commutative-Monoid f =
+ equational-reasoning
+ mul-finite-Commutative-Monoid M unit-Finite-Type f
+ =
+ mul-count-Commutative-Monoid
+ ( M)
+ ( unit)
+ ( count-unit)
+ ( f)
+ by
+ mul-finite-count-Commutative-Monoid
+ ( M)
+ ( unit-Finite-Type)
+ ( count-unit)
+ ( f)
+ = f star by mul-one-element-Commutative-Monoid M _
```
diff --git a/src/group-theory/products-of-tuples-of-elements-monoids.lagda.md b/src/group-theory/products-of-tuples-of-elements-monoids.lagda.md
new file mode 100644
index 0000000000..68964b6a1f
--- /dev/null
+++ b/src/group-theory/products-of-tuples-of-elements-monoids.lagda.md
@@ -0,0 +1,201 @@
+# Products of tuples of elements in monoids
+
+```agda
+module group-theory.products-of-tuples-of-elements-monoids where
+```
+
+Imports
+
+```agda
+open import elementary-number-theory.addition-natural-numbers
+open import elementary-number-theory.natural-numbers
+
+open import foundation.action-on-identifications-functions
+open import foundation.coproduct-types
+open import foundation.function-types
+open import foundation.homotopies
+open import foundation.identity-types
+open import foundation.unit-type
+open import foundation.universe-levels
+open import foundation.whiskering-homotopies-composition
+
+open import group-theory.monoids
+
+open import linear-algebra.vectors-on-monoids
+
+open import univalent-combinatorics.coproduct-types
+open import univalent-combinatorics.standard-finite-types
+```
+
+
+
+## Idea
+
+The product operation extends the binary multiplication operation on a
+[monoid](group-theory.monoids.md) `M` to any family of elements of `M` indexed
+by a [standard finite type](univalent-combinatorics.standard-finite-types.md).
+
+## Definition
+
+```agda
+mul-fin-Monoid :
+ {l : Level} (M : Monoid l) (n : ℕ) →
+ (functional-vec-Monoid M n) → type-Monoid M
+mul-fin-Monoid M zero-ℕ f = unit-Monoid M
+mul-fin-Monoid M (succ-ℕ n) f =
+ mul-Monoid M
+ ( mul-fin-Monoid M n (f ∘ inl-Fin n))
+ ( f (inr star))
+```
+
+## Properties
+
+### Products of one and two elements
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ mul-one-element-Monoid :
+ (f : functional-vec-Monoid M 1) →
+ mul-fin-Monoid M 1 f = head-functional-vec-Monoid M 0 f
+ mul-one-element-Monoid f =
+ left-unit-law-mul-Monoid M (f (inr star))
+
+ mul-two-elements-Monoid :
+ (f : functional-vec-Monoid M 2) →
+ mul-fin-Monoid M 2 f = mul-Monoid M (f (zero-Fin 1)) (f (one-Fin 1))
+ mul-two-elements-Monoid f =
+ ( associative-mul-Monoid M
+ (unit-Monoid M) (f (zero-Fin 1)) (f (one-Fin 1))) ∙
+ ( left-unit-law-mul-Monoid M
+ ( mul-Monoid M (f (zero-Fin 1)) (f (one-Fin 1))))
+```
+
+### Products are homotopy invariant
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ htpy-mul-fin-Monoid :
+ (n : ℕ) {f g : functional-vec-Monoid M n} →
+ (f ~ g) → mul-fin-Monoid M n f = mul-fin-Monoid M n g
+ htpy-mul-fin-Monoid zero-ℕ H = refl
+ htpy-mul-fin-Monoid (succ-ℕ n) H =
+ ap-mul-Monoid M
+ ( htpy-mul-fin-Monoid n (H ·r inl-Fin n))
+ ( H (inr star))
+```
+
+### Products are equal to the zero-th term times the rest
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ cons-mul-fin-Monoid :
+ (n : ℕ) (f : functional-vec-Monoid M (succ-ℕ n)) →
+ {x : type-Monoid M} → head-functional-vec-Monoid M n f = x →
+ mul-fin-Monoid M (succ-ℕ n) f =
+ mul-Monoid M (mul-fin-Monoid M n (f ∘ inl-Fin n)) x
+ cons-mul-fin-Monoid n f refl = refl
+
+ snoc-mul-fin-Monoid :
+ (n : ℕ) (f : functional-vec-Monoid M (succ-ℕ n)) →
+ {x : type-Monoid M} → f (zero-Fin n) = x →
+ mul-fin-Monoid M (succ-ℕ n) f =
+ mul-Monoid M
+ ( x)
+ ( mul-fin-Monoid M n (f ∘ inr-Fin n))
+ snoc-mul-fin-Monoid zero-ℕ f refl =
+ ( mul-one-element-Monoid M f) ∙
+ ( inv (right-unit-law-mul-Monoid M (f (zero-Fin 0))))
+ snoc-mul-fin-Monoid (succ-ℕ n) f refl =
+ ( ap
+ ( mul-Monoid' M (head-functional-vec-Monoid M (succ-ℕ n) f))
+ ( snoc-mul-fin-Monoid n (f ∘ inl-Fin (succ-ℕ n)) refl)) ∙
+ ( associative-mul-Monoid M
+ ( f (zero-Fin (succ-ℕ n)))
+ ( mul-fin-Monoid M n (f ∘ (inr-Fin (succ-ℕ n) ∘ inl-Fin n)))
+ ( head-functional-vec-Monoid M (succ-ℕ n) f))
+```
+
+### Extending a product of elements in a monoid
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ extend-mul-fin-Monoid :
+ (n : ℕ) (f : functional-vec-Monoid M n) →
+ mul-fin-Monoid M
+ ( succ-ℕ n)
+ ( cons-functional-vec-Monoid M n (unit-Monoid M) f) =
+ mul-fin-Monoid M n f
+ extend-mul-fin-Monoid n f =
+ right-unit-law-mul-Monoid M (mul-fin-Monoid M n f)
+```
+
+### Shifting a product of elements in a monoid
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ shift-mul-fin-Monoid :
+ (n : ℕ) (f : functional-vec-Monoid M n) →
+ mul-fin-Monoid M
+ ( succ-ℕ n)
+ ( snoc-functional-vec-Monoid M n f
+ ( unit-Monoid M)) =
+ mul-fin-Monoid M n f
+ shift-mul-fin-Monoid zero-ℕ f =
+ left-unit-law-mul-Monoid M (unit-Monoid M)
+ shift-mul-fin-Monoid (succ-ℕ n) f =
+ ap
+ ( mul-Monoid' M
+ ( head-functional-vec-Monoid M n f))
+ ( shift-mul-fin-Monoid n
+ ( tail-functional-vec-Monoid M n f))
+```
+
+### A product of units is the unit
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ abstract
+ mul-fin-unit-Monoid :
+ (n : ℕ) →
+ mul-fin-Monoid M n (zero-functional-vec-Monoid M n) = unit-Monoid M
+ mul-fin-unit-Monoid zero-ℕ = refl
+ mul-fin-unit-Monoid (succ-ℕ n) =
+ right-unit-law-mul-Monoid M _ ∙ mul-fin-unit-Monoid n
+```
+
+### Splitting products
+
+```agda
+split-mul-fin-Monoid :
+ {l : Level} (M : Monoid l)
+ (n m : ℕ) (f : functional-vec-Monoid M (n +ℕ m)) →
+ mul-fin-Monoid M (n +ℕ m) f =
+ mul-Monoid M
+ ( mul-fin-Monoid M n (f ∘ inl-coproduct-Fin n m))
+ ( mul-fin-Monoid M m (f ∘ inr-coproduct-Fin n m))
+split-mul-fin-Monoid M n zero-ℕ f =
+ inv (right-unit-law-mul-Monoid M (mul-fin-Monoid M n f))
+split-mul-fin-Monoid M n (succ-ℕ m) f =
+ ( ap
+ ( mul-Monoid' M (f (inr star)))
+ ( split-mul-fin-Monoid M n m (f ∘ inl))) ∙
+ ( associative-mul-Monoid M _ _ _)
+```
diff --git a/src/linear-algebra.lagda.md b/src/linear-algebra.lagda.md
index 883be1c3fa..f3c4499d73 100644
--- a/src/linear-algebra.lagda.md
+++ b/src/linear-algebra.lagda.md
@@ -18,9 +18,11 @@ open import linear-algebra.scalar-multiplication-vectors public
open import linear-algebra.scalar-multiplication-vectors-on-rings public
open import linear-algebra.transposition-matrices public
open import linear-algebra.vectors public
+open import linear-algebra.vectors-on-commutative-monoids public
open import linear-algebra.vectors-on-commutative-rings public
open import linear-algebra.vectors-on-commutative-semirings public
open import linear-algebra.vectors-on-euclidean-domains public
+open import linear-algebra.vectors-on-monoids public
open import linear-algebra.vectors-on-rings public
open import linear-algebra.vectors-on-semirings public
```
diff --git a/src/linear-algebra/vectors-on-commutative-monoids.lagda.md b/src/linear-algebra/vectors-on-commutative-monoids.lagda.md
new file mode 100644
index 0000000000..04439a10a3
--- /dev/null
+++ b/src/linear-algebra/vectors-on-commutative-monoids.lagda.md
@@ -0,0 +1,240 @@
+# Vectors on commutative monoids
+
+```agda
+module linear-algebra.vectors-on-commutative-monoids where
+```
+
+Imports
+
+```agda
+open import elementary-number-theory.natural-numbers
+
+open import foundation.action-on-identifications-binary-functions
+open import foundation.dependent-pair-types
+open import foundation.function-extensionality
+open import foundation.identity-types
+open import foundation.universe-levels
+
+open import group-theory.commutative-monoids
+open import group-theory.monoids
+open import group-theory.semigroups
+
+open import linear-algebra.constant-vectors
+open import linear-algebra.functoriality-vectors
+open import linear-algebra.vectors
+open import linear-algebra.vectors-on-monoids
+```
+
+
+
+## Idea
+
+Given a [commutative monoid](group-theory.commutative-monoids.md) `M`, the type
+`vec n M` of `n`-dimensional `M`-[vectors](linear-algebra.vectors.md) is a
+commutative monoid given by componentwise addition.
+
+We use additive terminology for vectors, as is standard in linear algebra
+contexts, despite using multiplicative terminology for monoids.
+
+## Definitions
+
+### Listed vectors on commutative monoids
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ vec-Commutative-Monoid : ℕ → UU l
+ vec-Commutative-Monoid = vec-Monoid (monoid-Commutative-Monoid M)
+
+ head-vec-Commutative-Monoid :
+ {n : ℕ} → vec-Commutative-Monoid (succ-ℕ n) → type-Commutative-Monoid M
+ head-vec-Commutative-Monoid = head-vec-Monoid (monoid-Commutative-Monoid M)
+
+ tail-vec-Commutative-Monoid :
+ {n : ℕ} → vec-Commutative-Monoid (succ-ℕ n) → vec-Commutative-Monoid n
+ tail-vec-Commutative-Monoid = tail-vec-Monoid (monoid-Commutative-Monoid M)
+
+ snoc-vec-Commutative-Monoid :
+ {n : ℕ} → vec-Commutative-Monoid n → type-Commutative-Monoid M →
+ vec-Commutative-Monoid (succ-ℕ n)
+ snoc-vec-Commutative-Monoid = snoc-vec-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Functional vectors on commutative monoids
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ functional-vec-Commutative-Monoid : ℕ → UU l
+ functional-vec-Commutative-Monoid =
+ functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ head-functional-vec-Commutative-Monoid :
+ (n : ℕ) → functional-vec-Commutative-Monoid (succ-ℕ n) →
+ type-Commutative-Monoid M
+ head-functional-vec-Commutative-Monoid =
+ head-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ tail-functional-vec-Commutative-Monoid :
+ (n : ℕ) → functional-vec-Commutative-Monoid (succ-ℕ n) →
+ functional-vec-Commutative-Monoid n
+ tail-functional-vec-Commutative-Monoid =
+ tail-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ cons-functional-vec-Commutative-Monoid :
+ (n : ℕ) → type-Commutative-Monoid M →
+ functional-vec-Commutative-Monoid n →
+ functional-vec-Commutative-Monoid (succ-ℕ n)
+ cons-functional-vec-Commutative-Monoid =
+ cons-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ snoc-functional-vec-Commutative-Monoid :
+ (n : ℕ) → functional-vec-Commutative-Monoid n →
+ type-Commutative-Monoid M → functional-vec-Commutative-Monoid (succ-ℕ n)
+ snoc-functional-vec-Commutative-Monoid =
+ snoc-functional-vec-Monoid (monoid-Commutative-Monoid M)
+```
+
+### Zero vectors of a commutative monoid
+
+#### The zero listed vector
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ zero-vec-Commutative-Monoid : {n : ℕ} → vec-Commutative-Monoid M n
+ zero-vec-Commutative-Monoid = constant-vec (unit-Commutative-Monoid M)
+```
+
+#### The zero functional vector
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ zero-functional-vec-Commutative-Monoid :
+ (n : ℕ) → functional-vec-Commutative-Monoid M n
+ zero-functional-vec-Commutative-Monoid n i = unit-Commutative-Monoid M
+```
+
+### Pointwise addition of vectors on a commutative monoid
+
+#### Pointwise addition of listed vectors on a commutative monoid
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ add-vec-Commutative-Monoid :
+ {n : ℕ} → vec-Commutative-Monoid M n → vec-Commutative-Monoid M n →
+ vec-Commutative-Monoid M n
+ add-vec-Commutative-Monoid =
+ add-vec-Monoid (monoid-Commutative-Monoid M)
+
+ associative-add-vec-Commutative-Monoid :
+ {n : ℕ} (v1 v2 v3 : vec-Commutative-Monoid M n) →
+ add-vec-Commutative-Monoid (add-vec-Commutative-Monoid v1 v2) v3 =
+ add-vec-Commutative-Monoid v1 (add-vec-Commutative-Monoid v2 v3)
+ associative-add-vec-Commutative-Monoid =
+ associative-add-vec-Monoid (monoid-Commutative-Monoid M)
+
+ vec-Commutative-Monoid-Semigroup : ℕ → Semigroup l
+ vec-Commutative-Monoid-Semigroup =
+ vec-Monoid-Semigroup (monoid-Commutative-Monoid M)
+
+ left-unit-law-add-vec-Commutative-Monoid :
+ {n : ℕ} (v : vec-Commutative-Monoid M n) →
+ add-vec-Commutative-Monoid (zero-vec-Commutative-Monoid M) v = v
+ left-unit-law-add-vec-Commutative-Monoid =
+ left-unit-law-add-vec-Monoid (monoid-Commutative-Monoid M)
+
+ right-unit-law-add-vec-Commutative-Monoid :
+ {n : ℕ} (v : vec-Commutative-Monoid M n) →
+ add-vec-Commutative-Monoid v (zero-vec-Commutative-Monoid M) = v
+ right-unit-law-add-vec-Commutative-Monoid =
+ right-unit-law-add-vec-Monoid (monoid-Commutative-Monoid M)
+
+ vec-Commutative-Monoid-Monoid : ℕ → Monoid l
+ vec-Commutative-Monoid-Monoid =
+ vec-Monoid-Monoid (monoid-Commutative-Monoid M)
+
+ commutative-add-vec-Commutative-Monoid :
+ {n : ℕ} (v w : vec-Commutative-Monoid M n) →
+ add-vec-Commutative-Monoid v w = add-vec-Commutative-Monoid w v
+ commutative-add-vec-Commutative-Monoid empty-vec empty-vec = refl
+ commutative-add-vec-Commutative-Monoid (x ∷ v1) (y ∷ v2) =
+ ap-binary _∷_
+ (commutative-mul-Commutative-Monoid M x y)
+ (commutative-add-vec-Commutative-Monoid v1 v2)
+
+ vec-Commutative-Monoid-Commutative-Monoid : ℕ → Commutative-Monoid l
+ vec-Commutative-Monoid-Commutative-Monoid n =
+ vec-Commutative-Monoid-Monoid n ,
+ commutative-add-vec-Commutative-Monoid
+```
+
+#### Pointwise addition of functional vectors on a commutative monoid
+
+```agda
+module _
+ {l : Level} (M : Commutative-Monoid l)
+ where
+
+ add-functional-vec-Commutative-Monoid :
+ (n : ℕ) (v w : functional-vec-Commutative-Monoid M n) →
+ functional-vec-Commutative-Monoid M n
+ add-functional-vec-Commutative-Monoid =
+ add-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ associative-add-functional-vec-Commutative-Monoid :
+ (n : ℕ) (v1 v2 v3 : functional-vec-Commutative-Monoid M n) →
+ ( add-functional-vec-Commutative-Monoid n
+ ( add-functional-vec-Commutative-Monoid n v1 v2) v3) =
+ ( add-functional-vec-Commutative-Monoid n v1
+ ( add-functional-vec-Commutative-Monoid n v2 v3))
+ associative-add-functional-vec-Commutative-Monoid =
+ associative-add-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ functional-vec-Commutative-Monoid-Semigroup : ℕ → Semigroup l
+ functional-vec-Commutative-Monoid-Semigroup =
+ functional-vec-Monoid-Semigroup (monoid-Commutative-Monoid M)
+
+ left-unit-law-add-functional-vec-Commutative-Monoid :
+ (n : ℕ) (v : functional-vec-Commutative-Monoid M n) →
+ add-functional-vec-Commutative-Monoid n
+ ( zero-functional-vec-Commutative-Monoid M n) v = v
+ left-unit-law-add-functional-vec-Commutative-Monoid =
+ left-unit-law-add-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ right-unit-law-add-functional-vec-Commutative-Monoid :
+ (n : ℕ) (v : functional-vec-Commutative-Monoid M n) →
+ add-functional-vec-Commutative-Monoid n v
+ ( zero-functional-vec-Commutative-Monoid M n) = v
+ right-unit-law-add-functional-vec-Commutative-Monoid =
+ right-unit-law-add-functional-vec-Monoid (monoid-Commutative-Monoid M)
+
+ functional-vec-Commutative-Monoid-Monoid : ℕ → Monoid l
+ functional-vec-Commutative-Monoid-Monoid =
+ functional-vec-Monoid-Monoid (monoid-Commutative-Monoid M)
+
+ commutative-add-functional-vec-Commutative-Monoid :
+ (n : ℕ) (v w : functional-vec-Commutative-Monoid M n) →
+ add-functional-vec-Commutative-Monoid n v w =
+ add-functional-vec-Commutative-Monoid n w v
+ commutative-add-functional-vec-Commutative-Monoid _ _ _ =
+ eq-htpy (λ k → commutative-mul-Commutative-Monoid M _ _)
+
+ functional-vec-Commutative-Monoid-Commutative-Monoid :
+ ℕ → Commutative-Monoid l
+ functional-vec-Commutative-Monoid-Commutative-Monoid n =
+ functional-vec-Commutative-Monoid-Monoid n ,
+ commutative-add-functional-vec-Commutative-Monoid n
+```
diff --git a/src/linear-algebra/vectors-on-monoids.lagda.md b/src/linear-algebra/vectors-on-monoids.lagda.md
new file mode 100644
index 0000000000..eb934ccacd
--- /dev/null
+++ b/src/linear-algebra/vectors-on-monoids.lagda.md
@@ -0,0 +1,213 @@
+# Vectors on monoids
+
+```agda
+module linear-algebra.vectors-on-monoids where
+```
+
+Imports
+
+```agda
+open import elementary-number-theory.natural-numbers
+
+open import foundation.action-on-identifications-binary-functions
+open import foundation.dependent-pair-types
+open import foundation.function-extensionality
+open import foundation.identity-types
+open import foundation.universe-levels
+
+open import group-theory.monoids
+open import group-theory.semigroups
+
+open import linear-algebra.constant-vectors
+open import linear-algebra.functoriality-vectors
+open import linear-algebra.vectors
+```
+
+
+
+## Idea
+
+Given a [monoid](group-theory.monoids.md) `M`, the type `vec n M` of
+`n`-dimensional `M`-[vectors](linear-algebra.vectors.md) is a monoid given by
+componentwise multiplication.
+
+We use additive terminology for vectors, as is standard in linear algebra
+contexts, despite using multiplicative terminology for monoids.
+
+## Definitions
+
+### Listed vectors on monoids
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ vec-Monoid : ℕ → UU l
+ vec-Monoid = vec (type-Monoid M)
+
+ head-vec-Monoid : {n : ℕ} → vec-Monoid (succ-ℕ n) → type-Monoid M
+ head-vec-Monoid v = head-vec v
+
+ tail-vec-Monoid : {n : ℕ} → vec-Monoid (succ-ℕ n) → vec-Monoid n
+ tail-vec-Monoid v = tail-vec v
+
+ snoc-vec-Monoid :
+ {n : ℕ} → vec-Monoid n → type-Monoid M → vec-Monoid (succ-ℕ n)
+ snoc-vec-Monoid v r = snoc-vec v r
+```
+
+### Functional vectors on monoids
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ functional-vec-Monoid : ℕ → UU l
+ functional-vec-Monoid = functional-vec (type-Monoid M)
+
+ head-functional-vec-Monoid :
+ (n : ℕ) → functional-vec-Monoid (succ-ℕ n) → type-Monoid M
+ head-functional-vec-Monoid n v = head-functional-vec n v
+
+ tail-functional-vec-Monoid :
+ (n : ℕ) → functional-vec-Monoid (succ-ℕ n) → functional-vec-Monoid n
+ tail-functional-vec-Monoid = tail-functional-vec
+
+ cons-functional-vec-Monoid :
+ (n : ℕ) → type-Monoid M →
+ functional-vec-Monoid n → functional-vec-Monoid (succ-ℕ n)
+ cons-functional-vec-Monoid = cons-functional-vec
+
+ snoc-functional-vec-Monoid :
+ (n : ℕ) → functional-vec-Monoid n → type-Monoid M →
+ functional-vec-Monoid (succ-ℕ n)
+ snoc-functional-vec-Monoid = snoc-functional-vec
+```
+
+### The zero vector
+
+#### The listed zero vector
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ zero-vec-Monoid : {n : ℕ} → vec-Monoid M n
+ zero-vec-Monoid = constant-vec (unit-Monoid M)
+```
+
+#### The functional zero vector
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ zero-functional-vec-Monoid : (n : ℕ) → functional-vec-Monoid M n
+ zero-functional-vec-Monoid n i = unit-Monoid M
+```
+
+### Pointwise addition of vectors on a monoid
+
+#### Pointwise addition of listed vectors on a monoid
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ add-vec-Monoid :
+ {n : ℕ} → vec-Monoid M n → vec-Monoid M n → vec-Monoid M n
+ add-vec-Monoid = binary-map-vec (mul-Monoid M)
+
+ associative-add-vec-Monoid :
+ {n : ℕ} (v1 v2 v3 : vec-Monoid M n) →
+ add-vec-Monoid (add-vec-Monoid v1 v2) v3 =
+ add-vec-Monoid v1 (add-vec-Monoid v2 v3)
+ associative-add-vec-Monoid empty-vec empty-vec empty-vec = refl
+ associative-add-vec-Monoid (x ∷ v1) (y ∷ v2) (z ∷ v3) =
+ ap-binary _∷_
+ ( associative-mul-Monoid M x y z)
+ ( associative-add-vec-Monoid v1 v2 v3)
+
+ vec-Monoid-Semigroup : ℕ → Semigroup l
+ pr1 (vec-Monoid-Semigroup n) = vec-Set (set-Monoid M) n
+ pr1 (pr2 (vec-Monoid-Semigroup n)) = add-vec-Monoid
+ pr2 (pr2 (vec-Monoid-Semigroup n)) = associative-add-vec-Monoid
+
+ left-unit-law-add-vec-Monoid :
+ {n : ℕ} (v : vec-Monoid M n) →
+ add-vec-Monoid (zero-vec-Monoid M) v = v
+ left-unit-law-add-vec-Monoid empty-vec = refl
+ left-unit-law-add-vec-Monoid (x ∷ v) =
+ ap-binary _∷_
+ ( left-unit-law-mul-Monoid M x)
+ ( left-unit-law-add-vec-Monoid v)
+
+ right-unit-law-add-vec-Monoid :
+ {n : ℕ} (v : vec-Monoid M n) →
+ add-vec-Monoid v (zero-vec-Monoid M) = v
+ right-unit-law-add-vec-Monoid empty-vec = refl
+ right-unit-law-add-vec-Monoid (x ∷ v) =
+ ap-binary _∷_
+ ( right-unit-law-mul-Monoid M x)
+ ( right-unit-law-add-vec-Monoid v)
+
+ vec-Monoid-Monoid : ℕ → Monoid l
+ pr1 (vec-Monoid-Monoid n) = vec-Monoid-Semigroup n
+ pr1 (pr2 (vec-Monoid-Monoid n)) = zero-vec-Monoid M
+ pr1 (pr2 (pr2 (vec-Monoid-Monoid n))) = left-unit-law-add-vec-Monoid
+ pr2 (pr2 (pr2 (vec-Monoid-Monoid n))) = right-unit-law-add-vec-Monoid
+```
+
+#### Pointwise addition of functional vectors on a monoid
+
+```agda
+module _
+ {l : Level} (M : Monoid l)
+ where
+
+ add-functional-vec-Monoid :
+ (n : ℕ) (v w : functional-vec-Monoid M n) → functional-vec-Monoid M n
+ add-functional-vec-Monoid n = binary-map-functional-vec n (mul-Monoid M)
+
+ associative-add-functional-vec-Monoid :
+ (n : ℕ) (v1 v2 v3 : functional-vec-Monoid M n) →
+ ( add-functional-vec-Monoid n (add-functional-vec-Monoid n v1 v2) v3) =
+ ( add-functional-vec-Monoid n v1 (add-functional-vec-Monoid n v2 v3))
+ associative-add-functional-vec-Monoid n v1 v2 v3 =
+ eq-htpy (λ i → associative-mul-Monoid M (v1 i) (v2 i) (v3 i))
+
+ functional-vec-Monoid-Semigroup : ℕ → Semigroup l
+ pr1 (functional-vec-Monoid-Semigroup n) =
+ functional-vec-Set (set-Monoid M) n
+ pr1 (pr2 (functional-vec-Monoid-Semigroup n)) =
+ add-functional-vec-Monoid n
+ pr2 (pr2 (functional-vec-Monoid-Semigroup n)) =
+ associative-add-functional-vec-Monoid n
+
+ left-unit-law-add-functional-vec-Monoid :
+ (n : ℕ) (v : functional-vec-Monoid M n) →
+ add-functional-vec-Monoid n (zero-functional-vec-Monoid M n) v = v
+ left-unit-law-add-functional-vec-Monoid n v =
+ eq-htpy (λ i → left-unit-law-mul-Monoid M (v i))
+
+ right-unit-law-add-functional-vec-Monoid :
+ (n : ℕ) (v : functional-vec-Monoid M n) →
+ add-functional-vec-Monoid n v (zero-functional-vec-Monoid M n) = v
+ right-unit-law-add-functional-vec-Monoid n v =
+ eq-htpy (λ i → right-unit-law-mul-Monoid M (v i))
+
+ functional-vec-Monoid-Monoid : ℕ → Monoid l
+ pr1 (functional-vec-Monoid-Monoid n) =
+ functional-vec-Monoid-Semigroup n
+ pr1 (pr2 (functional-vec-Monoid-Monoid n)) =
+ zero-functional-vec-Monoid M n
+ pr1 (pr2 (pr2 (functional-vec-Monoid-Monoid n))) =
+ left-unit-law-add-functional-vec-Monoid n
+ pr2 (pr2 (pr2 (functional-vec-Monoid-Monoid n))) =
+ right-unit-law-add-functional-vec-Monoid n
+```
diff --git a/src/linear-algebra/vectors-on-semirings.lagda.md b/src/linear-algebra/vectors-on-semirings.lagda.md
index c66387088a..788dfd5770 100644
--- a/src/linear-algebra/vectors-on-semirings.lagda.md
+++ b/src/linear-algebra/vectors-on-semirings.lagda.md
@@ -22,6 +22,7 @@ open import group-theory.semigroups
open import linear-algebra.constant-vectors
open import linear-algebra.functoriality-vectors
open import linear-algebra.vectors
+open import linear-algebra.vectors-on-commutative-monoids
open import ring-theory.semirings
```
@@ -42,7 +43,7 @@ module _
where
vec-Semiring : ℕ → UU l
- vec-Semiring = vec (type-Semiring R)
+ vec-Semiring = vec-Commutative-Monoid (additive-commutative-monoid-Semiring R)
head-vec-Semiring : {n : ℕ} → vec-Semiring (succ-ℕ n) → type-Semiring R
head-vec-Semiring v = head-vec v
@@ -63,7 +64,8 @@ module _
where
functional-vec-Semiring : ℕ → UU l
- functional-vec-Semiring = functional-vec (type-Semiring R)
+ functional-vec-Semiring =
+ functional-vec-Commutative-Monoid (additive-commutative-monoid-Semiring R)
head-functional-vec-Semiring :
(n : ℕ) → functional-vec-Semiring (succ-ℕ n) → type-Semiring R
@@ -94,7 +96,8 @@ module _
where
zero-vec-Semiring : {n : ℕ} → vec-Semiring R n
- zero-vec-Semiring = constant-vec (zero-Semiring R)
+ zero-vec-Semiring =
+ zero-vec-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
#### The zero functional vector
@@ -119,59 +122,51 @@ module _
add-vec-Semiring :
{n : ℕ} → vec-Semiring R n → vec-Semiring R n → vec-Semiring R n
- add-vec-Semiring = binary-map-vec (add-Semiring R)
+ add-vec-Semiring =
+ add-vec-Commutative-Monoid (additive-commutative-monoid-Semiring R)
associative-add-vec-Semiring :
{n : ℕ} (v1 v2 v3 : vec-Semiring R n) →
add-vec-Semiring (add-vec-Semiring v1 v2) v3 =
add-vec-Semiring v1 (add-vec-Semiring v2 v3)
- associative-add-vec-Semiring empty-vec empty-vec empty-vec = refl
- associative-add-vec-Semiring (x ∷ v1) (y ∷ v2) (z ∷ v3) =
- ap-binary _∷_
- ( associative-add-Semiring R x y z)
- ( associative-add-vec-Semiring v1 v2 v3)
+ associative-add-vec-Semiring =
+ associative-add-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
vec-Semiring-Semigroup : ℕ → Semigroup l
- pr1 (vec-Semiring-Semigroup n) = vec-Set (set-Semiring R) n
- pr1 (pr2 (vec-Semiring-Semigroup n)) = add-vec-Semiring
- pr2 (pr2 (vec-Semiring-Semigroup n)) = associative-add-vec-Semiring
+ vec-Semiring-Semigroup =
+ vec-Commutative-Monoid-Semigroup (additive-commutative-monoid-Semiring R)
left-unit-law-add-vec-Semiring :
{n : ℕ} (v : vec-Semiring R n) →
add-vec-Semiring (zero-vec-Semiring R) v = v
- left-unit-law-add-vec-Semiring empty-vec = refl
- left-unit-law-add-vec-Semiring (x ∷ v) =
- ap-binary _∷_
- ( left-unit-law-add-Semiring R x)
- ( left-unit-law-add-vec-Semiring v)
+ left-unit-law-add-vec-Semiring =
+ left-unit-law-add-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
right-unit-law-add-vec-Semiring :
{n : ℕ} (v : vec-Semiring R n) →
add-vec-Semiring v (zero-vec-Semiring R) = v
- right-unit-law-add-vec-Semiring empty-vec = refl
- right-unit-law-add-vec-Semiring (x ∷ v) =
- ap-binary _∷_
- ( right-unit-law-add-Semiring R x)
- ( right-unit-law-add-vec-Semiring v)
+ right-unit-law-add-vec-Semiring =
+ right-unit-law-add-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
vec-Semiring-Monoid : ℕ → Monoid l
- pr1 (vec-Semiring-Monoid n) = vec-Semiring-Semigroup n
- pr1 (pr2 (vec-Semiring-Monoid n)) = zero-vec-Semiring R
- pr1 (pr2 (pr2 (vec-Semiring-Monoid n))) = left-unit-law-add-vec-Semiring
- pr2 (pr2 (pr2 (vec-Semiring-Monoid n))) = right-unit-law-add-vec-Semiring
+ vec-Semiring-Monoid =
+ vec-Commutative-Monoid-Monoid
+ ( additive-commutative-monoid-Semiring R)
commutative-add-vec-Semiring :
{n : ℕ} (v w : vec-Semiring R n) →
add-vec-Semiring v w = add-vec-Semiring w v
- commutative-add-vec-Semiring empty-vec empty-vec = refl
- commutative-add-vec-Semiring (x ∷ v) (y ∷ w) =
- ap-binary _∷_
- ( commutative-add-Semiring R x y)
- ( commutative-add-vec-Semiring v w)
+ commutative-add-vec-Semiring =
+ commutative-add-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
vec-Semiring-Commutative-Monoid : ℕ → Commutative-Monoid l
- pr1 (vec-Semiring-Commutative-Monoid n) = vec-Semiring-Monoid n
- pr2 (vec-Semiring-Commutative-Monoid n) = commutative-add-vec-Semiring
+ vec-Semiring-Commutative-Monoid =
+ vec-Commutative-Monoid-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
```
#### Pointwise addition of functional vectors on a ring
@@ -183,54 +178,51 @@ module _
add-functional-vec-Semiring :
(n : ℕ) (v w : functional-vec-Semiring R n) → functional-vec-Semiring R n
- add-functional-vec-Semiring n = binary-map-functional-vec n (add-Semiring R)
+ add-functional-vec-Semiring =
+ add-functional-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
associative-add-functional-vec-Semiring :
(n : ℕ) (v1 v2 v3 : functional-vec-Semiring R n) →
( add-functional-vec-Semiring n (add-functional-vec-Semiring n v1 v2) v3) =
( add-functional-vec-Semiring n v1 (add-functional-vec-Semiring n v2 v3))
- associative-add-functional-vec-Semiring n v1 v2 v3 =
- eq-htpy (λ i → associative-add-Semiring R (v1 i) (v2 i) (v3 i))
+ associative-add-functional-vec-Semiring =
+ associative-add-functional-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
functional-vec-Semiring-Semigroup : ℕ → Semigroup l
- pr1 (functional-vec-Semiring-Semigroup n) =
- functional-vec-Set (set-Semiring R) n
- pr1 (pr2 (functional-vec-Semiring-Semigroup n)) =
- add-functional-vec-Semiring n
- pr2 (pr2 (functional-vec-Semiring-Semigroup n)) =
- associative-add-functional-vec-Semiring n
+ functional-vec-Semiring-Semigroup =
+ functional-vec-Commutative-Monoid-Semigroup
+ ( additive-commutative-monoid-Semiring R)
left-unit-law-add-functional-vec-Semiring :
(n : ℕ) (v : functional-vec-Semiring R n) →
add-functional-vec-Semiring n (zero-functional-vec-Semiring R n) v = v
- left-unit-law-add-functional-vec-Semiring n v =
- eq-htpy (λ i → left-unit-law-add-Semiring R (v i))
+ left-unit-law-add-functional-vec-Semiring =
+ left-unit-law-add-functional-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
right-unit-law-add-functional-vec-Semiring :
(n : ℕ) (v : functional-vec-Semiring R n) →
add-functional-vec-Semiring n v (zero-functional-vec-Semiring R n) = v
- right-unit-law-add-functional-vec-Semiring n v =
- eq-htpy (λ i → right-unit-law-add-Semiring R (v i))
+ right-unit-law-add-functional-vec-Semiring =
+ right-unit-law-add-functional-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
functional-vec-Semiring-Monoid : ℕ → Monoid l
- pr1 (functional-vec-Semiring-Monoid n) =
- functional-vec-Semiring-Semigroup n
- pr1 (pr2 (functional-vec-Semiring-Monoid n)) =
- zero-functional-vec-Semiring R n
- pr1 (pr2 (pr2 (functional-vec-Semiring-Monoid n))) =
- left-unit-law-add-functional-vec-Semiring n
- pr2 (pr2 (pr2 (functional-vec-Semiring-Monoid n))) =
- right-unit-law-add-functional-vec-Semiring n
+ functional-vec-Semiring-Monoid =
+ functional-vec-Commutative-Monoid-Monoid
+ ( additive-commutative-monoid-Semiring R)
commutative-add-functional-vec-Semiring :
(n : ℕ) (v w : functional-vec-Semiring R n) →
add-functional-vec-Semiring n v w = add-functional-vec-Semiring n w v
- commutative-add-functional-vec-Semiring n v w =
- eq-htpy (λ i → commutative-add-Semiring R (v i) (w i))
+ commutative-add-functional-vec-Semiring =
+ commutative-add-functional-vec-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
functional-vec-Semiring-Commutative-Monoid : ℕ → Commutative-Monoid l
- pr1 (functional-vec-Semiring-Commutative-Monoid n) =
- functional-vec-Semiring-Monoid n
- pr2 (functional-vec-Semiring-Commutative-Monoid n) =
- commutative-add-functional-vec-Semiring n
+ functional-vec-Semiring-Commutative-Monoid =
+ functional-vec-Commutative-Monoid-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
```
diff --git a/src/logic/complements-decidable-subtypes.lagda.md b/src/logic/complements-decidable-subtypes.lagda.md
index ae2a775f33..ee474aa92e 100644
--- a/src/logic/complements-decidable-subtypes.lagda.md
+++ b/src/logic/complements-decidable-subtypes.lagda.md
@@ -13,7 +13,9 @@ open import foundation.decidable-propositions
open import foundation.decidable-subtypes
open import foundation.decidable-types
open import foundation.dependent-pair-types
+open import foundation.disjoint-subtypes
open import foundation.double-negation-stable-propositions
+open import foundation.equivalences
open import foundation.evaluation-functions
open import foundation.full-subtypes
open import foundation.involutions
@@ -51,6 +53,16 @@ complement-decidable-subtype P x = neg-Decidable-Prop (P x)
## Properties
+### The complement of a decidable subtype is disjoint from the subtype
+
+```agda
+disjoint-complement-decidable-subtype :
+ {l1 l2 : Level} {A : UU l1} (P : decidable-subtype l2 A) →
+ disjoint-decidable-subtype P (complement-decidable-subtype P)
+disjoint-complement-decidable-subtype P =
+ disjoint-complement-subtype (subtype-decidable-subtype P)
+```
+
### Taking complements is an involution on decidable subtypes
```agda
@@ -98,3 +110,26 @@ module _
( subtype-decidable-subtype P)
( is-decidable-decidable-subtype P)
```
+
+### `A` is equivalent to the coproduct of a decidable subtype and its complement
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} (P : decidable-subtype l2 A)
+ where
+
+ equiv-coproduct-subtype-complement-decidable-subtype :
+ A ≃
+ type-decidable-subtype P +
+ type-decidable-subtype (complement-decidable-subtype P)
+ equiv-coproduct-subtype-complement-decidable-subtype =
+ equiv-union-coproduct-disjoint-subtype
+ ( subtype-decidable-subtype P)
+ ( subtype-decidable-subtype (complement-decidable-subtype P))
+ ( disjoint-complement-decidable-subtype P) ∘e
+ inv-equiv
+ ( equiv-inclusion-is-full-subtype
+ ( subtype-decidable-subtype
+ ( union-decidable-subtype P (complement-decidable-subtype P)))
+ ( is-full-union-subtype-complement-decidable-subtype P))
+```
diff --git a/src/ring-theory/sums-rings.lagda.md b/src/ring-theory/sums-rings.lagda.md
index f2f5859aa9..78a33c9046 100644
--- a/src/ring-theory/sums-rings.lagda.md
+++ b/src/ring-theory/sums-rings.lagda.md
@@ -10,9 +10,15 @@ module ring-theory.sums-rings where
open import elementary-number-theory.addition-natural-numbers
open import elementary-number-theory.natural-numbers
+open import finite-group-theory.permutations-standard-finite-types
+
+open import foundation.coproduct-types
+open import foundation.empty-types
+open import foundation.equivalences
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
+open import foundation.unit-type
open import foundation.universe-levels
open import linear-algebra.vectors
@@ -22,6 +28,9 @@ open import ring-theory.rings
open import ring-theory.sums-semirings
open import univalent-combinatorics.coproduct-types
+open import univalent-combinatorics.counting
+open import univalent-combinatorics.dependent-pair-types
+open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
@@ -29,8 +38,12 @@ open import univalent-combinatorics.standard-finite-types
## Idea
-The sum operation extends the binary addition operation on a ring `R` to any
-family of elements of `R` indexed by a standard finite type.
+The
+{{#concept "sum operation" Disambiguation="in a ring" WD="sum" WDID=Q218005 Agda=sum-Ring}}
+extends the binary addition operation on a [ring](ring-theory.rings.md) `R` to
+any family of elements of `R` indexed by a
+[standard finite type](univalent-combinatorics.standard-finite-types.md), or by
+a [finite type](univalent-combinatorics.finite-types.md).
## Definition
@@ -38,6 +51,16 @@ family of elements of `R` indexed by a standard finite type.
sum-Ring :
{l : Level} (R : Ring l) (n : ℕ) → functional-vec-Ring R n → type-Ring R
sum-Ring R = sum-Semiring (semiring-Ring R)
+
+sum-count-Ring :
+ {l1 l2 : Level} (R : Ring l1) (A : UU l2) → count A → (A → type-Ring R) →
+ type-Ring R
+sum-count-Ring R = sum-count-Semiring (semiring-Ring R)
+
+sum-finite-Ring :
+ {l1 l2 : Level} (R : Ring l1) (A : Finite-Type l2) →
+ (type-Finite-Type A → type-Ring R) → type-Ring R
+sum-finite-Ring R = sum-finite-Semiring (semiring-Ring R)
```
## Properties
@@ -53,6 +76,10 @@ module _
(f : functional-vec-Ring R 1) → sum-Ring R 1 f = head-functional-vec 0 f
sum-one-element-Ring = sum-one-element-Semiring (semiring-Ring R)
+ sum-unit-finite-Ring :
+ (f : unit → type-Ring R) → sum-finite-Ring R unit-Finite-Type f = f star
+ sum-unit-finite-Ring = sum-unit-finite-Semiring (semiring-Ring R)
+
sum-two-elements-Ring :
(f : functional-vec-Ring R 2) →
sum-Ring R 2 f = add-Ring R (f (zero-Fin 1)) (f (one-Fin 1))
@@ -70,6 +97,12 @@ module _
(n : ℕ) {f g : functional-vec-Ring R n} →
(f ~ g) → sum-Ring R n f = sum-Ring R n g
htpy-sum-Ring = htpy-sum-Semiring (semiring-Ring R)
+
+ htpy-sum-finite-Ring :
+ {l2 : Level} (A : Finite-Type l2) →
+ {f g : type-Finite-Type A → type-Ring R} → (f ~ g) →
+ sum-finite-Ring R A f = sum-finite-Ring R A g
+ htpy-sum-finite-Ring = htpy-sum-finite-Semiring (semiring-Ring R)
```
### Sums are equal to the zero-th term plus the rest
@@ -118,6 +151,22 @@ module _
sum-Ring R n (λ i → mul-Ring R (f i) x)
right-distributive-mul-sum-Ring =
right-distributive-mul-sum-Semiring (semiring-Ring R)
+
+ left-distributive-mul-sum-finite-Ring :
+ {l2 : Level} (A : Finite-Type l2) (x : type-Ring R) →
+ (f : type-Finite-Type A → type-Ring R) →
+ mul-Ring R x (sum-finite-Ring R A f) =
+ sum-finite-Ring R A (mul-Ring R x ∘ f)
+ left-distributive-mul-sum-finite-Ring =
+ left-distributive-mul-sum-finite-Semiring (semiring-Ring R)
+
+ right-distributive-mul-sum-finite-Ring :
+ {l2 : Level} (A : Finite-Type l2) →
+ (f : type-Finite-Type A → type-Ring R) (x : type-Ring R) →
+ mul-Ring R (sum-finite-Ring R A f) x =
+ sum-finite-Ring R A (mul-Ring' R x ∘ f)
+ right-distributive-mul-sum-finite-Ring =
+ right-distributive-mul-sum-finite-Semiring (semiring-Ring R)
```
### Interchange law of sums and addition in a semiring
@@ -180,6 +229,11 @@ module _
sum-zero-Ring :
(n : ℕ) → sum-Ring R n (zero-functional-vec-Ring R n) = zero-Ring R
sum-zero-Ring = sum-zero-Semiring (semiring-Ring R)
+
+ sum-zero-finite-Ring :
+ {l2 : Level} (A : Finite-Type l2) →
+ sum-finite-Ring R A (λ _ → zero-Ring R) = zero-Ring R
+ sum-zero-finite-Ring = sum-zero-finite-Semiring (semiring-Ring R)
```
### Splitting sums
@@ -194,3 +248,92 @@ split-sum-Ring :
( sum-Ring R m (f ∘ inr-coproduct-Fin n m))
split-sum-Ring R = split-sum-Semiring (semiring-Ring R)
```
+
+### Permutations preserve sums
+
+```agda
+module _
+ {l : Level} (R : Ring l)
+ where
+
+ preserves-sum-permutation-Ring :
+ (n : ℕ) → (σ : Permutation n) →
+ (f : functional-vec-Ring R n) →
+ sum-Ring R n f = sum-Ring R n (f ∘ map-equiv σ)
+ preserves-sum-permutation-Ring =
+ preserves-sum-permutation-Semiring (semiring-Ring R)
+```
+
+### Sums over finite types are preserved by equivalences
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Ring l1) (A : Finite-Type l2) (B : Finite-Type l3)
+ (H : equiv-Finite-Type A B)
+ where
+
+ sum-equiv-finite-Ring :
+ (f : type-Finite-Type A → type-Ring R) →
+ sum-finite-Ring R A f =
+ sum-finite-Ring R B (f ∘ map-inv-equiv H)
+ sum-equiv-finite-Ring = sum-equiv-finite-Semiring (semiring-Ring R) A B H
+```
+
+### Sums over finite types distribute over coproducts
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Ring l1)
+ (A : Finite-Type l2) (B : Finite-Type l3)
+ where
+
+ sum-coproduct-finite-Ring :
+ (f :
+ type-Finite-Type A + type-Finite-Type B → type-Ring R) →
+ sum-finite-Ring R (coproduct-Finite-Type A B) f =
+ add-Ring
+ ( R)
+ ( sum-finite-Ring R A (f ∘ inl))
+ ( sum-finite-Ring R B (f ∘ inr))
+ sum-coproduct-finite-Ring =
+ sum-coproduct-finite-Semiring (semiring-Ring R) A B
+```
+
+### Sums distribute over dependent pair types
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Ring l1)
+ (A : Finite-Type l2) (B : type-Finite-Type A → Finite-Type l3)
+ where
+
+ sum-Σ-finite-Ring :
+ (f : (a : type-Finite-Type A) → type-Finite-Type (B a) → type-Ring R) →
+ sum-finite-Ring R (Σ-Finite-Type A B) (ind-Σ f) =
+ sum-finite-Ring R A (λ a → sum-finite-Ring R (B a) (f a))
+ sum-Σ-finite-Ring = sum-Σ-finite-Semiring (semiring-Ring R) A B
+```
+
+### The sum over an empty type is zero
+
+```agda
+module _
+ {l1 l2 : Level} (R : Ring l1) (A : Finite-Type l2)
+ (H : is-empty (type-Finite-Type A))
+ where
+
+ sum-is-empty-finite-Ring :
+ (f : type-Finite-Type A → type-Ring R) →
+ is-zero-Ring R (sum-finite-Ring R A f)
+ sum-is-empty-finite-Ring = sum-is-empty-finite-Semiring (semiring-Ring R) A H
+```
+
+### The sum over a finite type is the sum over any count for that type
+
+```agda
+sum-finite-count-Ring :
+ {l1 l2 : Level} (R : Ring l1) (A : Finite-Type l2)
+ (cA : count (type-Finite-Type A)) (f : type-Finite-Type A → type-Ring R) →
+ sum-finite-Ring R A f = sum-count-Ring R (type-Finite-Type A) cA f
+sum-finite-count-Ring R = sum-finite-count-Semiring (semiring-Ring R)
+```
diff --git a/src/ring-theory/sums-semirings.lagda.md b/src/ring-theory/sums-semirings.lagda.md
index 3f42f0a446..9c33476171 100644
--- a/src/ring-theory/sums-semirings.lagda.md
+++ b/src/ring-theory/sums-semirings.lagda.md
@@ -10,14 +10,21 @@ module ring-theory.sums-semirings where
open import elementary-number-theory.addition-natural-numbers
open import elementary-number-theory.natural-numbers
+open import finite-group-theory.permutations-standard-finite-types
+
open import foundation.action-on-identifications-functions
open import foundation.coproduct-types
+open import foundation.empty-types
+open import foundation.equivalences
open import foundation.function-types
open import foundation.homotopies
open import foundation.identity-types
+open import foundation.propositional-truncations
+open import foundation.sets
open import foundation.unit-type
open import foundation.universe-levels
-open import foundation.whiskering-homotopies-composition
+
+open import group-theory.products-of-tuples-of-elements-commutative-monoids
open import linear-algebra.vectors
open import linear-algebra.vectors-on-semirings
@@ -25,6 +32,9 @@ open import linear-algebra.vectors-on-semirings
open import ring-theory.semirings
open import univalent-combinatorics.coproduct-types
+open import univalent-combinatorics.counting
+open import univalent-combinatorics.dependent-pair-types
+open import univalent-combinatorics.finite-types
open import univalent-combinatorics.standard-finite-types
```
@@ -32,8 +42,12 @@ open import univalent-combinatorics.standard-finite-types
## Idea
-The sum operation extends the binary addition operation on a semiring `R` to any
-family of elements of `R` indexed by a standard finite type.
+The
+{{#concept "sum operation" Disambiguation="in a semiring" WD="sum" WDID=Q218005 Agda=sum-Semiring}}
+extends the binary addition operation on a [semiring](ring-theory.semirings.md)
+`R` to any family of elements of `R` indexed by a
+[standard finite type](univalent-combinatorics.standard-finite-types.md), or by
+a [finite type](univalent-combinatorics.finite-types.md).
## Definition
@@ -41,11 +55,20 @@ family of elements of `R` indexed by a standard finite type.
sum-Semiring :
{l : Level} (R : Semiring l) (n : ℕ) →
(functional-vec-Semiring R n) → type-Semiring R
-sum-Semiring R zero-ℕ f = zero-Semiring R
-sum-Semiring R (succ-ℕ n) f =
- add-Semiring R
- ( sum-Semiring R n (f ∘ inl-Fin n))
- ( f (inr star))
+sum-Semiring R =
+ mul-fin-Commutative-Monoid (additive-commutative-monoid-Semiring R)
+
+sum-count-Semiring :
+ {l1 l2 : Level} (R : Semiring l1) (A : UU l2) (cA : count A) →
+ (A → type-Semiring R) → type-Semiring R
+sum-count-Semiring R =
+ mul-count-Commutative-Monoid (additive-commutative-monoid-Semiring R)
+
+sum-finite-Semiring :
+ {l1 l2 : Level} (R : Semiring l1) (A : Finite-Type l2) →
+ (type-Finite-Type A → type-Semiring R) → type-Semiring R
+sum-finite-Semiring R =
+ mul-finite-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
## Properties
@@ -60,17 +83,22 @@ module _
sum-one-element-Semiring :
(f : functional-vec-Semiring R 1) →
sum-Semiring R 1 f = head-functional-vec 0 f
- sum-one-element-Semiring f =
- left-unit-law-add-Semiring R (f (inr star))
+ sum-one-element-Semiring =
+ mul-one-element-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+
+ sum-unit-finite-Semiring :
+ (f : unit → type-Semiring R) →
+ sum-finite-Semiring R unit-Finite-Type f = f star
+ sum-unit-finite-Semiring =
+ mul-unit-finite-Commutative-Monoid (additive-commutative-monoid-Semiring R)
sum-two-elements-Semiring :
(f : functional-vec-Semiring R 2) →
sum-Semiring R 2 f = add-Semiring R (f (zero-Fin 1)) (f (one-Fin 1))
- sum-two-elements-Semiring f =
- ( associative-add-Semiring R
- (zero-Semiring R) (f (zero-Fin 1)) (f (one-Fin 1))) ∙
- ( left-unit-law-add-Semiring R
- ( add-Semiring R (f (zero-Fin 1)) (f (one-Fin 1))))
+ sum-two-elements-Semiring =
+ mul-two-elements-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
```
### Sums are homotopy invariant
@@ -83,11 +111,15 @@ module _
htpy-sum-Semiring :
(n : ℕ) {f g : functional-vec-Semiring R n} →
(f ~ g) → sum-Semiring R n f = sum-Semiring R n g
- htpy-sum-Semiring zero-ℕ H = refl
- htpy-sum-Semiring (succ-ℕ n) H =
- ap-add-Semiring R
- ( htpy-sum-Semiring n (H ·r inl-Fin n))
- ( H (inr star))
+ htpy-sum-Semiring =
+ htpy-mul-fin-Commutative-Monoid (additive-commutative-monoid-Semiring R)
+
+ htpy-sum-finite-Semiring :
+ {l2 : Level} (A : Finite-Type l2) →
+ {f g : type-Finite-Type A → type-Semiring R} → (f ~ g) →
+ sum-finite-Semiring R A f = sum-finite-Semiring R A g
+ htpy-sum-finite-Semiring =
+ htpy-mul-finite-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
### Sums are equal to the zero-th term plus the rest
@@ -111,17 +143,8 @@ module _
add-Semiring R
( x)
( sum-Semiring R n (f ∘ inr-Fin n))
- snoc-sum-Semiring zero-ℕ f refl =
- ( sum-one-element-Semiring R f) ∙
- ( inv (right-unit-law-add-Semiring R (f (zero-Fin 0))))
- snoc-sum-Semiring (succ-ℕ n) f refl =
- ( ap
- ( add-Semiring' R (head-functional-vec (succ-ℕ n) f))
- ( snoc-sum-Semiring n (f ∘ inl-Fin (succ-ℕ n)) refl)) ∙
- ( associative-add-Semiring R
- ( f (zero-Fin (succ-ℕ n)))
- ( sum-Semiring R n (f ∘ (inr-Fin (succ-ℕ n) ∘ inl-Fin n)))
- ( head-functional-vec (succ-ℕ n) f))
+ snoc-sum-Semiring =
+ snoc-mul-fin-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
### Multiplication distributes over sums
@@ -131,36 +154,125 @@ module _
{l : Level} (R : Semiring l)
where
- left-distributive-mul-sum-Semiring :
- (n : ℕ) (x : type-Semiring R)
- (f : functional-vec-Semiring R n) →
- mul-Semiring R x (sum-Semiring R n f) =
- sum-Semiring R n (λ i → mul-Semiring R x (f i))
- left-distributive-mul-sum-Semiring zero-ℕ x f =
- right-zero-law-mul-Semiring R x
- left-distributive-mul-sum-Semiring (succ-ℕ n) x f =
- ( left-distributive-mul-add-Semiring R x
- ( sum-Semiring R n (f ∘ inl-Fin n))
- ( f (inr star))) ∙
- ( ap
- ( add-Semiring' R (mul-Semiring R x (f (inr star))))
- ( left-distributive-mul-sum-Semiring n x (f ∘ inl-Fin n)))
-
- right-distributive-mul-sum-Semiring :
- (n : ℕ) (f : functional-vec-Semiring R n)
- (x : type-Semiring R) →
- mul-Semiring R (sum-Semiring R n f) x =
- sum-Semiring R n (λ i → mul-Semiring R (f i) x)
- right-distributive-mul-sum-Semiring zero-ℕ f x =
- left-zero-law-mul-Semiring R x
- right-distributive-mul-sum-Semiring (succ-ℕ n) f x =
- ( right-distributive-mul-add-Semiring R
- ( sum-Semiring R n (f ∘ inl-Fin n))
- ( f (inr star))
- ( x)) ∙
- ( ap
- ( add-Semiring' R (mul-Semiring R (f (inr star)) x))
- ( right-distributive-mul-sum-Semiring n (f ∘ inl-Fin n) x))
+ abstract
+ left-distributive-mul-sum-Semiring :
+ (n : ℕ) (x : type-Semiring R)
+ (f : functional-vec-Semiring R n) →
+ mul-Semiring R x (sum-Semiring R n f) =
+ sum-Semiring R n (λ i → mul-Semiring R x (f i))
+ left-distributive-mul-sum-Semiring zero-ℕ x f =
+ right-zero-law-mul-Semiring R x
+ left-distributive-mul-sum-Semiring (succ-ℕ n) x f =
+ ( left-distributive-mul-add-Semiring R x
+ ( sum-Semiring R n (f ∘ inl-Fin n))
+ ( f (inr star))) ∙
+ ( ap
+ ( add-Semiring' R (mul-Semiring R x (f (inr star))))
+ ( left-distributive-mul-sum-Semiring n x (f ∘ inl-Fin n)))
+
+ right-distributive-mul-sum-Semiring :
+ (n : ℕ) (f : functional-vec-Semiring R n)
+ (x : type-Semiring R) →
+ mul-Semiring R (sum-Semiring R n f) x =
+ sum-Semiring R n (λ i → mul-Semiring R (f i) x)
+ right-distributive-mul-sum-Semiring zero-ℕ f x =
+ left-zero-law-mul-Semiring R x
+ right-distributive-mul-sum-Semiring (succ-ℕ n) f x =
+ ( right-distributive-mul-add-Semiring R
+ ( sum-Semiring R n (f ∘ inl-Fin n))
+ ( f (inr star))
+ ( x)) ∙
+ ( ap
+ ( add-Semiring' R (mul-Semiring R (f (inr star)) x))
+ ( right-distributive-mul-sum-Semiring n (f ∘ inl-Fin n) x))
+
+ left-distributive-mul-sum-finite-Semiring :
+ {l2 : Level} (A : Finite-Type l2) (x : type-Semiring R) →
+ (f : type-Finite-Type A → type-Semiring R) →
+ mul-Semiring R x (sum-finite-Semiring R A f) =
+ sum-finite-Semiring R A (mul-Semiring R x ∘ f)
+ left-distributive-mul-sum-finite-Semiring A x f =
+ let
+ open
+ do-syntax-trunc-Prop
+ ( Id-Prop
+ ( set-Semiring R)
+ ( mul-Semiring R x (sum-finite-Semiring R A f))
+ ( sum-finite-Semiring R A (mul-Semiring R x ∘ f)))
+ in do
+ cA ← is-finite-type-Finite-Type A
+ equational-reasoning
+ mul-Semiring R x (sum-finite-Semiring R A f)
+ =
+ mul-Semiring
+ ( R)
+ ( x)
+ ( mul-count-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( type-Finite-Type A)
+ ( cA)
+ ( f))
+ by
+ ap
+ ( mul-Semiring R x)
+ ( mul-finite-count-Commutative-Monoid _ A cA f)
+ =
+ mul-count-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( type-Finite-Type A)
+ ( cA)
+ ( mul-Semiring R x ∘ f)
+ by
+ left-distributive-mul-sum-Semiring
+ ( number-of-elements-count cA)
+ ( x)
+ ( f ∘ map-equiv-count cA)
+ = sum-finite-Semiring R A (mul-Semiring R x ∘ f)
+ by inv (mul-finite-count-Commutative-Monoid _ A cA _)
+
+ right-distributive-mul-sum-finite-Semiring :
+ {l2 : Level} (A : Finite-Type l2) →
+ (f : type-Finite-Type A → type-Semiring R) (x : type-Semiring R) →
+ mul-Semiring R (sum-finite-Semiring R A f) x =
+ sum-finite-Semiring R A (mul-Semiring' R x ∘ f)
+ right-distributive-mul-sum-finite-Semiring A f x =
+ let
+ open
+ do-syntax-trunc-Prop
+ ( Id-Prop
+ ( set-Semiring R)
+ ( mul-Semiring R (sum-finite-Semiring R A f) x)
+ ( sum-finite-Semiring R A (mul-Semiring' R x ∘ f)))
+ in do
+ cA ← is-finite-type-Finite-Type A
+ equational-reasoning
+ mul-Semiring R (sum-finite-Semiring R A f) x
+ =
+ mul-Semiring
+ ( R)
+ ( mul-count-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( type-Finite-Type A)
+ ( cA)
+ ( f))
+ ( x)
+ by
+ ap
+ ( mul-Semiring' R x)
+ ( mul-finite-count-Commutative-Monoid _ A cA f)
+ =
+ mul-count-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( type-Finite-Type A)
+ ( cA)
+ ( mul-Semiring' R x ∘ f)
+ by
+ right-distributive-mul-sum-Semiring
+ ( number-of-elements-count cA)
+ ( f ∘ map-equiv-count cA)
+ ( x)
+ = sum-finite-Semiring R A (mul-Semiring' R x ∘ f)
+ by inv (mul-finite-count-Commutative-Monoid _ A cA _)
```
### Interchange law of sums and addition in a semiring
@@ -206,8 +318,8 @@ module _
( succ-ℕ n)
( cons-functional-vec-Semiring R n (zero-Semiring R) f) =
sum-Semiring R n f
- extend-sum-Semiring n f =
- right-unit-law-add-Semiring R (sum-Semiring R n f)
+ extend-sum-Semiring =
+ extend-mul-fin-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
### Shifting a sum of elements in a semiring
@@ -224,14 +336,8 @@ module _
( snoc-functional-vec-Semiring R n f
( zero-Semiring R)) =
sum-Semiring R n f
- shift-sum-Semiring zero-ℕ f =
- left-unit-law-add-Semiring R (zero-Semiring R)
- shift-sum-Semiring (succ-ℕ n) f =
- ap
- ( add-Semiring' R
- ( head-functional-vec-Semiring R n f))
- ( shift-sum-Semiring n
- ( tail-functional-vec-Semiring R n f))
+ shift-sum-Semiring =
+ shift-mul-fin-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
### A sum of zeroes is zero
@@ -244,9 +350,14 @@ module _
sum-zero-Semiring :
(n : ℕ) →
sum-Semiring R n (zero-functional-vec-Semiring R n) = zero-Semiring R
- sum-zero-Semiring zero-ℕ = refl
- sum-zero-Semiring (succ-ℕ n) =
- right-unit-law-add-Semiring R _ ∙ sum-zero-Semiring n
+ sum-zero-Semiring =
+ mul-fin-unit-Commutative-Monoid (additive-commutative-monoid-Semiring R)
+
+ sum-zero-finite-Semiring :
+ {l2 : Level} (A : Finite-Type l2) →
+ sum-finite-Semiring R A (λ _ → zero-Semiring R) = zero-Semiring R
+ sum-zero-finite-Semiring =
+ mul-finite-unit-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
### Splitting sums
@@ -259,11 +370,110 @@ split-sum-Semiring :
add-Semiring R
( sum-Semiring R n (f ∘ inl-coproduct-Fin n m))
( sum-Semiring R m (f ∘ inr-coproduct-Fin n m))
-split-sum-Semiring R n zero-ℕ f =
- inv (right-unit-law-add-Semiring R (sum-Semiring R n f))
-split-sum-Semiring R n (succ-ℕ m) f =
- ( ap
- ( add-Semiring' R (f (inr star)))
- ( split-sum-Semiring R n m (f ∘ inl))) ∙
- ( associative-add-Semiring R _ _ _)
+split-sum-Semiring R =
+ split-mul-fin-Commutative-Monoid (additive-commutative-monoid-Semiring R)
+```
+
+### Permutations preserve sums
+
+```agda
+module _
+ {l : Level} (R : Semiring l)
+ where
+
+ preserves-sum-permutation-Semiring :
+ (n : ℕ) → (σ : Permutation n) →
+ (f : functional-vec-Semiring R n) →
+ sum-Semiring R n f = sum-Semiring R n (f ∘ map-equiv σ)
+ preserves-sum-permutation-Semiring =
+ preserves-product-permutation-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+```
+
+### Sums over finite types are preserved by equivalences
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Semiring l1) (A : Finite-Type l2) (B : Finite-Type l3)
+ (H : equiv-Finite-Type A B)
+ where
+
+ sum-equiv-finite-Semiring :
+ (f : type-Finite-Type A → type-Semiring R) →
+ sum-finite-Semiring R A f = sum-finite-Semiring R B (f ∘ map-inv-equiv H)
+ sum-equiv-finite-Semiring =
+ mul-equiv-finite-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( A)
+ ( B)
+ ( H)
+```
+
+### Sums over finite types distribute over coproducts
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Semiring l1) (A : Finite-Type l2) (B : Finite-Type l3)
+ where
+
+ sum-coproduct-finite-Semiring :
+ (f :
+ type-Finite-Type A + type-Finite-Type B → type-Semiring R) →
+ sum-finite-Semiring R (coproduct-Finite-Type A B) f =
+ add-Semiring
+ ( R)
+ ( sum-finite-Semiring R A (f ∘ inl))
+ ( sum-finite-Semiring R B (f ∘ inr))
+ sum-coproduct-finite-Semiring =
+ mul-coproduct-finite-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( A)
+ ( B)
+```
+
+### Sums distribute over dependent pair types
+
+```agda
+module _
+ {l1 l2 l3 : Level} (R : Semiring l1)
+ (A : Finite-Type l2) (B : type-Finite-Type A → Finite-Type l3)
+ where
+
+ sum-Σ-finite-Semiring :
+ (f : (a : type-Finite-Type A) → type-Finite-Type (B a) → type-Semiring R) →
+ sum-finite-Semiring R (Σ-Finite-Type A B) (ind-Σ f) =
+ sum-finite-Semiring R A (λ a → sum-finite-Semiring R (B a) (f a))
+ sum-Σ-finite-Semiring =
+ mul-Σ-finite-Commutative-Monoid (additive-commutative-monoid-Semiring R) A B
+```
+
+### The sum over an empty type is zero
+
+```agda
+module _
+ {l1 l2 : Level} (R : Semiring l1) (A : Finite-Type l2)
+ (H : is-empty (type-Finite-Type A))
+ where
+
+ sum-is-empty-finite-Semiring :
+ (f : type-Finite-Type A → type-Semiring R) →
+ is-zero-Semiring R (sum-finite-Semiring R A f)
+ sum-is-empty-finite-Semiring =
+ mul-is-empty-finite-Commutative-Monoid
+ ( additive-commutative-monoid-Semiring R)
+ ( A)
+ ( H)
+```
+
+### The sum over a finite type is the sum over any count for that type
+
+```agda
+sum-finite-count-Semiring :
+ {l1 l2 : Level} (R : Semiring l1) (A : Finite-Type l2)
+ (cA : count (type-Finite-Type A))
+ (f : type-Finite-Type A → type-Semiring R) →
+ sum-finite-Semiring R A f =
+ sum-count-Semiring R (type-Finite-Type A) cA f
+sum-finite-count-Semiring R =
+ mul-finite-count-Commutative-Monoid (additive-commutative-monoid-Semiring R)
```
diff --git a/src/univalent-combinatorics/coproduct-types.lagda.md b/src/univalent-combinatorics/coproduct-types.lagda.md
index 87603eab3b..ee2c6015ff 100644
--- a/src/univalent-combinatorics/coproduct-types.lagda.md
+++ b/src/univalent-combinatorics/coproduct-types.lagda.md
@@ -145,6 +145,52 @@ abstract
number-of-elements-count-coproduct (pair k e) (pair l f) = refl
```
+### Mapping the `count-coproduct` equivalence on `inl-coproduct-Fin` is `inl` on the left count
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} (cA : count A) (cB : count B)
+ where
+
+ map-equiv-count-coproduct-inl-coproduct-Fin :
+ map-equiv-count (count-coproduct cA cB) ∘
+ inl-coproduct-Fin
+ ( number-of-elements-count cA)
+ ( number-of-elements-count cB) ~
+ inl ∘ map-equiv-count cA
+ map-equiv-count-coproduct-inl-coproduct-Fin a =
+ ap
+ ( map-coproduct _ _)
+ ( is-retraction-map-inv-equiv
+ ( compute-coproduct-Fin
+ ( number-of-elements-count cA)
+ ( number-of-elements-count cB))
+ ( inl a))
+```
+
+### Mapping the `count-coproduct` equivalence on `inr-coproduct-Fin` is `inr` on the right count
+
+```agda
+module _
+ {l1 l2 : Level} {A : UU l1} {B : UU l2} (cA : count A) (cB : count B)
+ where
+
+ map-equiv-count-coproduct-inr-coproduct-Fin :
+ map-equiv-count (count-coproduct cA cB) ∘
+ inr-coproduct-Fin
+ ( number-of-elements-count cA)
+ ( number-of-elements-count cB) ~
+ inr ∘ map-equiv-count cB
+ map-equiv-count-coproduct-inr-coproduct-Fin b =
+ ap
+ ( map-coproduct _ _)
+ ( is-retraction-map-inv-equiv
+ ( compute-coproduct-Fin
+ ( number-of-elements-count cA)
+ ( number-of-elements-count cB))
+ ( inr b))
+```
+
### If both `Σ A P` and `Σ A Q` have a count, then `Σ A P + Q` have a count
```agda
diff --git a/src/univalent-combinatorics/standard-finite-types.lagda.md b/src/univalent-combinatorics/standard-finite-types.lagda.md
index 31d90d106c..ef02fb64b0 100644
--- a/src/univalent-combinatorics/standard-finite-types.lagda.md
+++ b/src/univalent-combinatorics/standard-finite-types.lagda.md
@@ -20,7 +20,9 @@ open import foundation.decidable-types
open import foundation.dependent-pair-types
open import foundation.embeddings
open import foundation.empty-types
+open import foundation.equality-cartesian-product-types
open import foundation.equality-coproduct-types
+open import foundation.equality-dependent-pair-types
open import foundation.equivalence-injective-type-families
open import foundation.equivalences
open import foundation.equivalences-maybe
@@ -32,8 +34,10 @@ open import foundation.negated-equality
open import foundation.negation
open import foundation.noncontractible-types
open import foundation.preunivalent-type-families
+open import foundation.propositions
open import foundation.raising-universe-levels
open import foundation.retractions
+open import foundation.sections
open import foundation.sets
open import foundation.transport-along-identifications
open import foundation.unit-type
@@ -228,7 +232,7 @@ nat-Fin (succ-ℕ k) (inl x) = nat-Fin k x
nat-Fin (succ-ℕ k) (inr x) = k
nat-Fin-reverse : (k : ℕ) → Fin k → ℕ
-nat-Fin-reverse (succ-ℕ k) (inl x) = succ-ℕ (nat-Fin k x)
+nat-Fin-reverse (succ-ℕ k) (inl x) = succ-ℕ (nat-Fin-reverse k x)
nat-Fin-reverse (succ-ℕ k) (inr x) = 0
strict-upper-bound-nat-Fin : (k : ℕ) (x : Fin k) → le-ℕ (nat-Fin k x) k
@@ -491,3 +495,39 @@ is-preunivalent-Fin : is-preunivalent Fin
is-preunivalent-Fin =
is-preunivalent-retraction-equiv-tr-Set Fin-Set retraction-equiv-tr-Fin
```
+
+### `Fin n` is equivalent to the set of natural numbers less than `n`
+
+```agda
+nat-le-Fin-reverse : (n : ℕ) (k : Fin n) → Σ ℕ (λ m → le-ℕ m n)
+nat-le-Fin-reverse (succ-ℕ n) (inr star) = zero-ℕ , star
+nat-le-Fin-reverse (succ-ℕ n) (inl k) =
+ ind-Σ (λ m m