Iterated cartesian products of concrete groups

module group-theory.iterated-cartesian-products-concrete-groups where
Imports
open import elementary-number-theory.natural-numbers

open import foundation.0-connected-types
open import foundation.1-types
open import foundation.contractible-types
open import foundation.coproduct-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.functions
open import foundation.functoriality-cartesian-product-types
open import foundation.identity-types
open import foundation.iterated-cartesian-product-types
open import foundation.mere-equality
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.sets
open import foundation.truncated-types
open import foundation.truncation-levels
open import foundation.unit-type
open import foundation.universe-levels

open import group-theory.cartesian-products-concrete-groups
open import group-theory.concrete-groups
open import group-theory.groups

open import higher-group-theory.higher-groups

open import structured-types.pointed-types

open import univalent-combinatorics.standard-finite-types

Idea

The iterated Cartesian product of a family of Concrete-Group over Fin n is defined recursively on Fin n.

Definition

iterated-product-Concrete-Group :
  {l : Level} (n : ) (G : Fin n  Concrete-Group l) 
  Concrete-Group l
iterated-product-Concrete-Group zero-ℕ G = trivial-Concrete-Group
iterated-product-Concrete-Group (succ-ℕ n) G =
  product-Concrete-Group
    ( G (inr star))
    ( iterated-product-Concrete-Group n (G  inl))

module _
  {l : Level} (n : ) (G : Fin n  Concrete-Group l)
  where

  ∞-group-iterated-product-Concrete-Group : ∞-Group l
  ∞-group-iterated-product-Concrete-Group =
    pr1 (iterated-product-Concrete-Group n G)

  classifying-pointed-type-iterated-product-Concrete-Group : Pointed-Type l
  classifying-pointed-type-iterated-product-Concrete-Group =
    classifying-pointed-type-∞-Group ∞-group-iterated-product-Concrete-Group

  classifying-type-iterated-product-Concrete-Group : UU l
  classifying-type-iterated-product-Concrete-Group =
    classifying-type-∞-Group ∞-group-iterated-product-Concrete-Group

  shape-iterated-product-Concrete-Group :
    classifying-type-iterated-product-Concrete-Group
  shape-iterated-product-Concrete-Group =
    shape-∞-Group ∞-group-iterated-product-Concrete-Group

  is-0-connected-classifying-type-iterated-product-Concrete-Group :
    is-0-connected classifying-type-iterated-product-Concrete-Group
  is-0-connected-classifying-type-iterated-product-Concrete-Group =
    is-0-connected-classifying-type-∞-Group
      ∞-group-iterated-product-Concrete-Group

  mere-eq-classifying-type-iterated-product-Concrete-Group :
    (X Y : classifying-type-iterated-product-Concrete-Group)  mere-eq X Y
  mere-eq-classifying-type-iterated-product-Concrete-Group =
    mere-eq-classifying-type-∞-Group ∞-group-iterated-product-Concrete-Group

  elim-prop-classifying-type-iterated-product-Concrete-Group :
    {l2 : Level}
    (P : classifying-type-iterated-product-Concrete-Group  Prop l2) 
    type-Prop (P shape-iterated-product-Concrete-Group) 
    ((X : classifying-type-iterated-product-Concrete-Group)  type-Prop (P X))
  elim-prop-classifying-type-iterated-product-Concrete-Group =
    elim-prop-classifying-type-∞-Group ∞-group-iterated-product-Concrete-Group

  type-iterated-product-Concrete-Group : UU l
  type-iterated-product-Concrete-Group =
    type-∞-Group ∞-group-iterated-product-Concrete-Group

  is-set-type-iterated-product-Concrete-Group :
    is-set type-iterated-product-Concrete-Group
  is-set-type-iterated-product-Concrete-Group =
    pr2 (iterated-product-Concrete-Group n G)

  set-iterated-product-Concrete-Group : Set l
  set-iterated-product-Concrete-Group =
    type-iterated-product-Concrete-Group ,
    is-set-type-iterated-product-Concrete-Group

  is-1-type-classifying-type-iterated-product-Concrete-Group :
    is-trunc one-𝕋 classifying-type-iterated-product-Concrete-Group
  is-1-type-classifying-type-iterated-product-Concrete-Group X Y =
    apply-universal-property-trunc-Prop
      ( mere-eq-classifying-type-iterated-product-Concrete-Group
          shape-iterated-product-Concrete-Group
          X)
      ( is-set-Prop (Id X Y))
      ( λ { refl 
            apply-universal-property-trunc-Prop
              ( mere-eq-classifying-type-iterated-product-Concrete-Group
                  shape-iterated-product-Concrete-Group
                  Y)
              ( is-set-Prop (Id shape-iterated-product-Concrete-Group Y))
              ( λ { refl  is-set-type-iterated-product-Concrete-Group})})

  classifying-1-type-iterated-product-Concrete-Group : Truncated-Type l one-𝕋
  classifying-1-type-iterated-product-Concrete-Group =
    pair
      classifying-type-iterated-product-Concrete-Group
      is-1-type-classifying-type-iterated-product-Concrete-Group

  Id-iterated-product-BG-Set :
    (X Y : classifying-type-iterated-product-Concrete-Group)  Set l
  Id-iterated-product-BG-Set X Y =
    Id-Set classifying-1-type-iterated-product-Concrete-Group X Y

  unit-iterated-product-Concrete-Group : type-iterated-product-Concrete-Group
  unit-iterated-product-Concrete-Group =
    unit-∞-Group ∞-group-iterated-product-Concrete-Group

  mul-iterated-product-Concrete-Group :
    (x y : type-iterated-product-Concrete-Group) 
    type-iterated-product-Concrete-Group
  mul-iterated-product-Concrete-Group =
    mul-∞-Group ∞-group-iterated-product-Concrete-Group

  mul-iterated-product-Concrete-Group' :
    (x y : type-iterated-product-Concrete-Group) 
    type-iterated-product-Concrete-Group
  mul-iterated-product-Concrete-Group' x y =
    mul-iterated-product-Concrete-Group y x

  associative-mul-iterated-product-Concrete-Group :
    (x y z : type-iterated-product-Concrete-Group) 
    Id (mul-iterated-product-Concrete-Group
          ( mul-iterated-product-Concrete-Group x y)
          ( z))
       (mul-iterated-product-Concrete-Group
          ( x)
          ( mul-iterated-product-Concrete-Group y z))
  associative-mul-iterated-product-Concrete-Group =
    associative-mul-∞-Group ∞-group-iterated-product-Concrete-Group

  left-unit-law-mul-iterated-product-Concrete-Group :
    (x : type-iterated-product-Concrete-Group) 
    Id (mul-iterated-product-Concrete-Group
          unit-iterated-product-Concrete-Group
          x)
       x
  left-unit-law-mul-iterated-product-Concrete-Group =
    left-unit-law-mul-∞-Group ∞-group-iterated-product-Concrete-Group

  right-unit-law-mul-iterated-product-Concrete-Group :
    (y : type-iterated-product-Concrete-Group) 
    Id (mul-iterated-product-Concrete-Group
          y
          unit-iterated-product-Concrete-Group)
       y
  right-unit-law-mul-iterated-product-Concrete-Group =
    right-unit-law-mul-∞-Group ∞-group-iterated-product-Concrete-Group

  coherence-unit-laws-mul-iterated-product-Concrete-Group :
    Id ( left-unit-law-mul-iterated-product-Concrete-Group
           unit-iterated-product-Concrete-Group)
       ( right-unit-law-mul-iterated-product-Concrete-Group
           unit-iterated-product-Concrete-Group)
  coherence-unit-laws-mul-iterated-product-Concrete-Group =
    coherence-unit-laws-mul-∞-Group ∞-group-iterated-product-Concrete-Group

  inv-iterated-product-Concrete-Group :
    type-iterated-product-Concrete-Group  type-iterated-product-Concrete-Group
  inv-iterated-product-Concrete-Group =
    inv-∞-Group ∞-group-iterated-product-Concrete-Group

  left-inverse-law-mul-iterated-product-Concrete-Group :
    (x : type-iterated-product-Concrete-Group) 
    Id (mul-iterated-product-Concrete-Group
          (inv-iterated-product-Concrete-Group x)
          x)
       unit-iterated-product-Concrete-Group
  left-inverse-law-mul-iterated-product-Concrete-Group =
    left-inverse-law-mul-∞-Group ∞-group-iterated-product-Concrete-Group

  right-inverse-law-mul-iterated-product-Concrete-Group :
    (x : type-iterated-product-Concrete-Group) 
    Id (mul-iterated-product-Concrete-Group
          x
          (inv-iterated-product-Concrete-Group x))
       unit-iterated-product-Concrete-Group
  right-inverse-law-mul-iterated-product-Concrete-Group =
    right-inverse-law-mul-∞-Group ∞-group-iterated-product-Concrete-Group

  abstract-group-iterated-product-Concrete-Group : Group l
  pr1 (pr1 abstract-group-iterated-product-Concrete-Group) =
    set-iterated-product-Concrete-Group
  pr1 (pr2 (pr1 abstract-group-iterated-product-Concrete-Group)) =
    mul-iterated-product-Concrete-Group
  pr2 (pr2 (pr1 abstract-group-iterated-product-Concrete-Group)) =
    associative-mul-iterated-product-Concrete-Group
  pr1 (pr1 (pr2 abstract-group-iterated-product-Concrete-Group)) =
    unit-iterated-product-Concrete-Group
  pr1 (pr2 (pr1 (pr2 abstract-group-iterated-product-Concrete-Group))) =
    left-unit-law-mul-iterated-product-Concrete-Group
  pr2 (pr2 (pr1 (pr2 abstract-group-iterated-product-Concrete-Group))) =
    right-unit-law-mul-iterated-product-Concrete-Group
  pr1 (pr2 (pr2 abstract-group-iterated-product-Concrete-Group)) =
    inv-iterated-product-Concrete-Group
  pr1 (pr2 (pr2 (pr2 abstract-group-iterated-product-Concrete-Group))) =
    left-inverse-law-mul-iterated-product-Concrete-Group
  pr2 (pr2 (pr2 (pr2 abstract-group-iterated-product-Concrete-Group))) =
    right-inverse-law-mul-iterated-product-Concrete-Group

  op-abstract-group-iterated-product-Concrete-Group : Group l
  pr1 (pr1 op-abstract-group-iterated-product-Concrete-Group) =
    set-iterated-product-Concrete-Group
  pr1 (pr2 (pr1 op-abstract-group-iterated-product-Concrete-Group)) =
    mul-iterated-product-Concrete-Group'
  pr2 (pr2 (pr1 op-abstract-group-iterated-product-Concrete-Group)) x y z =
    inv (associative-mul-iterated-product-Concrete-Group z y x)
  pr1 (pr1 (pr2 op-abstract-group-iterated-product-Concrete-Group)) =
    unit-iterated-product-Concrete-Group
  pr1 (pr2 (pr1 (pr2 op-abstract-group-iterated-product-Concrete-Group))) =
    right-unit-law-mul-iterated-product-Concrete-Group
  pr2 (pr2 (pr1 (pr2 op-abstract-group-iterated-product-Concrete-Group))) =
    left-unit-law-mul-iterated-product-Concrete-Group
  pr1 (pr2 (pr2 op-abstract-group-iterated-product-Concrete-Group)) =
    inv-iterated-product-Concrete-Group
  pr1 (pr2 (pr2 (pr2 op-abstract-group-iterated-product-Concrete-Group))) =
    right-inverse-law-mul-iterated-product-Concrete-Group
  pr2 (pr2 (pr2 (pr2 op-abstract-group-iterated-product-Concrete-Group))) =
    left-inverse-law-mul-iterated-product-Concrete-Group

Properties

equiv-type-Concrete-group-iterated-product-Concrete-Group :
  {l : Level} (n : ) (G : Fin n  Concrete-Group l) 
  ( type-iterated-product-Concrete-Group n G) 
  ( iterated-product-Fin-recursive n (type-Concrete-Group  G))
equiv-type-Concrete-group-iterated-product-Concrete-Group zero-ℕ G =
  equiv-is-contr
    ( is-proof-irrelevant-is-prop
        ( is-set-is-contr is-contr-raise-unit raise-star raise-star) refl)
    is-contr-raise-unit
equiv-type-Concrete-group-iterated-product-Concrete-Group (succ-ℕ n) G =
  equiv-prod
    ( id-equiv)
    ( equiv-type-Concrete-group-iterated-product-Concrete-Group n (G  inl)) ∘e
  equiv-type-Concrete-Group-product-Concrete-Group
    ( G (inr star))
    ( iterated-product-Concrete-Group n (G  inl))