Products of finite families of elements in commutative semigroups

Content created by Louis Wasserman.

Created on 2026-04-29.
Last modified on 2026-04-29.

{-# OPTIONS --lossy-unification #-}

module group-theory.products-of-finite-families-of-elements-commutative-semigroups where
Imports
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.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.inhabited-types
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 group-theory.commutative-semigroups
open import group-theory.products-of-finite-sequences-of-elements-commutative-semigroups

open import univalent-combinatorics.coproduct-types
open import univalent-combinatorics.coproducts-inhabited-finite-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.inhabited-finite-types
open import univalent-combinatorics.standard-finite-types

Idea

The product operation extends the binary operation on a commutative semigroup G to any family of elements of G indexed by an inhabited finite type.

Products over counted types

Definition

product-count-Commutative-Semigroup :
  {l1 l2 : Level} (G : Commutative-Semigroup l1) (A : UU l2) 
  is-inhabited A  count A  (A  type-Commutative-Semigroup G) 
  type-Commutative-Semigroup G
product-count-Commutative-Semigroup G A |A| cA@(zero-ℕ , _) _ =
  ex-falso
    ( is-nonempty-is-inhabited
      ( |A|)
      ( is-empty-is-zero-number-of-elements-count cA refl))
product-count-Commutative-Semigroup G A _ (succ-ℕ n , Fin-sn≃A) f =
  product-fin-sequence-type-Commutative-Semigroup G n (f  map-equiv Fin-sn≃A)

Properties

Products for a counted type are homotopy invariant

module _
  {l1 l2 : Level} (G : Commutative-Semigroup l1) (A : UU l2)
  (|A| : is-inhabited A)
  where abstract

  htpy-product-count-Commutative-Semigroup :
    (c : count A) 
    {f g : A  type-Commutative-Semigroup G}  (f ~ g) 
    product-count-Commutative-Semigroup G A |A| c f 
    product-count-Commutative-Semigroup G A |A| c g
  htpy-product-count-Commutative-Semigroup cA@(zero-ℕ , _) _ =
    ex-falso
      ( is-nonempty-is-inhabited
        ( |A|)
        ( is-empty-is-zero-number-of-elements-count cA refl))
  htpy-product-count-Commutative-Semigroup (succ-ℕ nA , _) H =
    htpy-product-fin-sequence-type-Commutative-Semigroup G nA  i  H _)

Two counts for the same type produce equal products

module _
  {l1 l2 : Level} (G : Commutative-Semigroup l1) (A : UU l2)
  (|A| : is-inhabited A)
  where

  abstract
    eq-product-count-equiv-Commutative-Semigroup :
      (n : )  (equiv1 equiv2 : Fin (succ-ℕ n)  A) 
      (f : A  type-Commutative-Semigroup G) 
      product-count-Commutative-Semigroup G A |A| (succ-ℕ n , equiv1) f 
      product-count-Commutative-Semigroup G A |A| (succ-ℕ n , equiv2) f
    eq-product-count-equiv-Commutative-Semigroup n equiv1 equiv2 f =
      equational-reasoning
      product-fin-sequence-type-Commutative-Semigroup G n (f  map-equiv equiv1)
      
        product-fin-sequence-type-Commutative-Semigroup
          ( G)
          ( n)
          ( (f  map-equiv equiv1)  (map-inv-equiv equiv1  map-equiv equiv2))
        by
          preserves-product-permutation-fin-sequence-type-Commutative-Semigroup
            ( G)
            ( n)
            ( inv-equiv equiv1 ∘e equiv2)
            ( f  map-equiv equiv1)
      
        product-fin-sequence-type-Commutative-Semigroup G
          ( n)
          ( f  map-equiv equiv2)
        by
          ap
            ( λ g 
              product-fin-sequence-type-Commutative-Semigroup
                ( G)
                ( n)
                ( f  (g  map-equiv equiv2)))
            ( eq-htpy (is-section-map-inv-equiv equiv1))

    eq-product-count-Commutative-Semigroup :
      (f : A  type-Commutative-Semigroup G) (c1 c2 : count A) 
      product-count-Commutative-Semigroup G A |A| c1 f 
      product-count-Commutative-Semigroup G A |A| c2 f
    eq-product-count-Commutative-Semigroup f c1@(zero-ℕ , _) _ =
      ex-falso
        ( is-nonempty-is-inhabited
          ( |A|)
          ( is-empty-is-zero-number-of-elements-count c1 refl))
    eq-product-count-Commutative-Semigroup f c1@(succ-ℕ n , e1) c2@(_ , e2)
      with double-counting c1 c2
    ... | refl = eq-product-count-equiv-Commutative-Semigroup n e1 e2 f

Products of counted families indexed by equivalent types are equal

module _
  {l1 l2 l3 : Level} (G : Commutative-Semigroup l1)
  (A : UU l2) (|A| : is-inhabited A) (B : UU l3) (|B| : is-inhabited B)
  (H : A  B)
  where

  abstract
    product-equiv-count-Commutative-Semigroup :
      (cA : count A) (cB : count B) (f : A  type-Commutative-Semigroup G) 
      product-count-Commutative-Semigroup G A |A| cA f 
      product-count-Commutative-Semigroup G B |B| cB (f  map-inv-equiv H)
    product-equiv-count-Commutative-Semigroup
      cA@(zero-ℕ , _) _ _ =
        ex-falso
        ( is-nonempty-is-inhabited
          ( |A|)
          ( is-empty-is-zero-number-of-elements-count cA refl))
    product-equiv-count-Commutative-Semigroup
      cA@(succ-ℕ nA , Fin-nA≃A) cB@(_ , Fin-nB≃B) f
      with double-counting-equiv cA cB H
    ... | refl =
      preserves-product-permutation-fin-sequence-type-Commutative-Semigroup
        ( G)
        ( nA)
        ( inv-equiv Fin-nA≃A ∘e inv-equiv H ∘e Fin-nB≃B)
        ( _) 
      htpy-product-fin-sequence-type-Commutative-Semigroup
        ( G)
        ( nA)
        ( λ i  ap f (is-section-map-inv-equiv Fin-nA≃A _))

Products of coproducts of counted types

module _
  {l1 l2 l3 : Level} (G : Commutative-Semigroup l1)
  (A : UU l2) (|A| : is-inhabited A) (B : UU l3) (|B| : is-inhabited B)
  (|A+B| : is-inhabited (A + B))
  where

  abstract
    distributive-product-coproduct-count-Commutative-Semigroup :
      (cA : count A) (cB : count B) 
      (f : (A + B)  type-Commutative-Semigroup G) 
      product-count-Commutative-Semigroup
        ( G)
        ( A + B)
        ( |A+B|)
        ( count-coproduct cA cB)
        ( f) 
      mul-Commutative-Semigroup G
        ( product-count-Commutative-Semigroup G A |A| cA (f  inl))
        ( product-count-Commutative-Semigroup G B |B| cB (f  inr))
    distributive-product-coproduct-count-Commutative-Semigroup
      cA@(succ-ℕ nA , Fin-snA≃A) cB@(succ-ℕ nB , Fin-snB≃B) f =
        split-product-fin-sequence-type-Commutative-Semigroup G nA nB _ 
        ap-mul-Commutative-Semigroup G
          ( htpy-product-fin-sequence-type-Commutative-Semigroup G nA
            ( λ i  ap f (map-equiv-count-coproduct-inl-coproduct-Fin cA cB i)))
          ( htpy-product-fin-sequence-type-Commutative-Semigroup G nB
            ( λ i  ap f (map-equiv-count-coproduct-inr-coproduct-Fin cA cB i)))
    distributive-product-coproduct-count-Commutative-Semigroup
      cA@(zero-ℕ , _) cB@(succ-ℕ _ , _) _ =
        ex-falso
        ( is-nonempty-is-inhabited
          ( |A|)
          ( is-empty-is-zero-number-of-elements-count cA refl))
    distributive-product-coproduct-count-Commutative-Semigroup
      cA@(zero-ℕ , _) cB@(zero-ℕ , _) _ =
        ex-falso
        ( is-nonempty-is-inhabited
          ( |A|)
          ( is-empty-is-zero-number-of-elements-count cA refl))
    distributive-product-coproduct-count-Commutative-Semigroup
      cA@(succ-ℕ _ , _) cB@(zero-ℕ , _) _ =
        ex-falso
        ( is-nonempty-is-inhabited
          ( |B|)
          ( is-empty-is-zero-number-of-elements-count cB refl))

Products over finite types

Definition

module _
  {l1 l2 : Level} (G : Commutative-Semigroup l1) (A : Inhabited-Finite-Type l2)
  where opaque

  product-finite-Commutative-Semigroup :
    (f : type-Inhabited-Finite-Type A  type-Commutative-Semigroup G) 
    type-Commutative-Semigroup G
  product-finite-Commutative-Semigroup f =
    map-universal-property-set-quotient-trunc-Prop
      ( set-Commutative-Semigroup G)
      ( λ c 
        product-count-Commutative-Semigroup G
          ( type-Inhabited-Finite-Type A)
          ( is-inhabited-type-Inhabited-Finite-Type A)
          ( c)
          ( f))
      ( eq-product-count-Commutative-Semigroup G
        ( type-Inhabited-Finite-Type A)
        ( is-inhabited-type-Inhabited-Finite-Type A)
        ( f))
      ( is-finite-Inhabited-Finite-Type A)

Properties

The product over a finite type is its product over any count for the type

module _
  {l1 l2 : Level} (G : Commutative-Semigroup l1)
  (A : Inhabited-Finite-Type l2) (cA : count (type-Inhabited-Finite-Type A))
  where

  abstract opaque
    unfolding product-finite-Commutative-Semigroup

    eq-product-finite-product-count-Commutative-Semigroup :
      (f : type-Inhabited-Finite-Type A  type-Commutative-Semigroup G) 
      product-finite-Commutative-Semigroup G A f 
      product-count-Commutative-Semigroup G
        ( type-Inhabited-Finite-Type A)
        ( is-inhabited-type-Inhabited-Finite-Type A) cA f
    eq-product-finite-product-count-Commutative-Semigroup f =
      ( ap
        ( λ c  product-finite-Commutative-Semigroup G ((_ , c) , _) f)
        ( all-elements-equal-type-trunc-Prop _ _)) 
      ( htpy-universal-property-set-quotient-trunc-Prop
        ( set-Commutative-Semigroup G)
        ( λ c 
          product-count-Commutative-Semigroup G
            ( type-Inhabited-Finite-Type A)
            ( is-inhabited-type-Inhabited-Finite-Type A)
            ( c)
            ( f))
        ( eq-product-count-Commutative-Semigroup G
          ( type-Inhabited-Finite-Type A)
          ( is-inhabited-type-Inhabited-Finite-Type A)
          ( f))
        ( cA))

Products over a finite type are homotopy invariant

module _
  {l1 l2 : Level} (G : Commutative-Semigroup l1) (A : Inhabited-Finite-Type l2)
  where

  abstract
    htpy-product-finite-Commutative-Semigroup :
      {f g : type-Inhabited-Finite-Type A  type-Commutative-Semigroup G} 
      f ~ g 
      product-finite-Commutative-Semigroup G A f 
      product-finite-Commutative-Semigroup G A g
    htpy-product-finite-Commutative-Semigroup {f} {g} f~g =
      ap (product-finite-Commutative-Semigroup G A) (eq-htpy f~g)

Products over finite types are preserved by equivalences

module _
  {l1 l2 l3 : Level} (G : Commutative-Semigroup l1)
  (A : Inhabited-Finite-Type l2)
  (B : Inhabited-Finite-Type l3)
  (H : equiv-Inhabited-Finite-Type A B)
  where

  abstract
    product-equiv-finite-Commutative-Semigroup :
      (f : type-Inhabited-Finite-Type A  type-Commutative-Semigroup G) 
      product-finite-Commutative-Semigroup G A f 
      product-finite-Commutative-Semigroup G B (f  map-inv-equiv H)
    product-equiv-finite-Commutative-Semigroup f =
      let
        open
          do-syntax-trunc-Prop
            ( Id-Prop
              ( set-Commutative-Semigroup G)
              ( product-finite-Commutative-Semigroup G A f)
              ( product-finite-Commutative-Semigroup G B (f  map-inv-equiv H)))
      in do
        cA  is-finite-Inhabited-Finite-Type A
        cB  is-finite-Inhabited-Finite-Type B
        ( ( eq-product-finite-product-count-Commutative-Semigroup G _ cA f) 
          ( product-equiv-count-Commutative-Semigroup G _ _ _ _ H cA cB f) 
          ( inv
            ( eq-product-finite-product-count-Commutative-Semigroup G _ cB _)))

Products over finite types distribute over coproducts

module _
  {l1 l2 l3 : Level} (G : Commutative-Semigroup l1)
  (A : Inhabited-Finite-Type l2)
  (B : Inhabited-Finite-Type l3)
  where

  abstract
    distributive-product-coproduct-finite-Commutative-Semigroup :
      (f :
        type-Inhabited-Finite-Type A + type-Inhabited-Finite-Type B 
        type-Commutative-Semigroup G) 
      product-finite-Commutative-Semigroup
        ( G)
        ( coproduct-Inhabited-Finite-Type A B)
        ( f) 
      mul-Commutative-Semigroup
        ( G)
        ( product-finite-Commutative-Semigroup G A (f  inl))
        ( product-finite-Commutative-Semigroup G B (f  inr))
    distributive-product-coproduct-finite-Commutative-Semigroup f =
      let
        open
          do-syntax-trunc-Prop
            ( Id-Prop
              ( set-Commutative-Semigroup G)
              ( product-finite-Commutative-Semigroup
                ( G)
                ( coproduct-Inhabited-Finite-Type A B)
                ( f))
              ( mul-Commutative-Semigroup
                ( G)
                ( product-finite-Commutative-Semigroup G A (f  inl))
                ( product-finite-Commutative-Semigroup G B (f  inr))))
      in do
        cA  is-finite-Inhabited-Finite-Type A
        cB  is-finite-Inhabited-Finite-Type B
        ( ( eq-product-finite-product-count-Commutative-Semigroup
            ( G)
            ( coproduct-Inhabited-Finite-Type A B)
            ( count-coproduct cA cB)
            ( f)) 
          ( distributive-product-coproduct-count-Commutative-Semigroup G
            ( type-Inhabited-Finite-Type A)
            ( is-inhabited-type-Inhabited-Finite-Type A)
            ( type-Inhabited-Finite-Type B)
            ( is-inhabited-type-Inhabited-Finite-Type B)
            ( is-inhabited-type-Inhabited-Finite-Type
              ( coproduct-Inhabited-Finite-Type A B))
            ( cA)
            ( cB)
            ( f)) 
          ap-mul-Commutative-Semigroup G
            ( inv
              ( eq-product-finite-product-count-Commutative-Semigroup G
                ( A)
                ( cA)
                ( f  inl)))
            ( inv
              ( eq-product-finite-product-count-Commutative-Semigroup
                ( G)
                ( B)
                ( cB)
                ( f  inr))))

Recent changes