# Higher groups

```agda
module higher-group-theory.higher-groups where
```

<details><summary>Imports</summary>

```agda
open import foundation.0-connected-types
open import foundation.dependent-pair-types
open import foundation.equivalences
open import foundation.full-subtypes
open import foundation.identity-types
open import foundation.images
open import foundation.mere-equality
open import foundation.propositional-truncations
open import foundation.propositions
open import foundation.unit-type
open import foundation.universe-levels

open import structured-types.h-spaces
open import structured-types.pointed-types

open import synthetic-homotopy-theory.loop-spaces
```

</details>

## Idea

An **∞-group** is just a [pointed](structured-types.pointed-types.md)
[connected](foundation.0-connected-types.md) type. Its underlying type is its
[loop space](synthetic-homotopy-theory.loop-spaces.md), and the classifying type
is the pointed connected type itself.

## Definition

```agda
∞-Group : (l : Level)  UU (lsuc l)
∞-Group l = Σ (Pointed-Type l)  X  is-0-connected (type-Pointed-Type X))

module _
  {l : Level} (G : ∞-Group l)
  where

  classifying-pointed-type-∞-Group : Pointed-Type l
  classifying-pointed-type-∞-Group = pr1 G

  classifying-type-∞-Group : UU l
  classifying-type-∞-Group =
    type-Pointed-Type classifying-pointed-type-∞-Group

  shape-∞-Group : classifying-type-∞-Group
  shape-∞-Group =
    point-Pointed-Type classifying-pointed-type-∞-Group

  point-∞-Group : unit  classifying-type-∞-Group
  point-∞-Group = point shape-∞-Group

  abstract
    is-0-connected-classifying-type-∞-Group :
      is-0-connected classifying-type-∞-Group
    is-0-connected-classifying-type-∞-Group = pr2 G

  abstract
    mere-eq-classifying-type-∞-Group :
      (X Y : classifying-type-∞-Group)  mere-eq X Y
    mere-eq-classifying-type-∞-Group =
      mere-eq-is-0-connected
        is-0-connected-classifying-type-∞-Group

  abstract
    is-full-subtype-im-point-∞-Group :
      is-full-subtype (subtype-im point-∞-Group)
    is-full-subtype-im-point-∞-Group x =
      apply-universal-property-trunc-Prop
        ( mere-eq-classifying-type-∞-Group shape-∞-Group x)
        ( subtype-im point-∞-Group x)
        ( λ where refl  unit-trunc-Prop (star , refl))

  compute-im-point-∞-Group :
    im point-∞-Group  classifying-type-∞-Group
  compute-im-point-∞-Group =
    equiv-inclusion-is-full-subtype
      ( subtype-im point-∞-Group)
      ( is-full-subtype-im-point-∞-Group)

  abstract
    elim-prop-classifying-type-∞-Group :
      {l2 : Level} (P : classifying-type-∞-Group  Prop l2) 
      type-Prop (P shape-∞-Group) 
      ((X : classifying-type-∞-Group)  type-Prop (P X))
    elim-prop-classifying-type-∞-Group =
      apply-dependent-universal-property-is-0-connected
        shape-∞-Group
        is-0-connected-classifying-type-∞-Group

  h-space-∞-Group : H-Space l
  h-space-∞-Group = Ω-H-Space classifying-pointed-type-∞-Group

  pointed-type-∞-Group : Pointed-Type l
  pointed-type-∞-Group = Ω classifying-pointed-type-∞-Group

  type-∞-Group : UU l
  type-∞-Group = type-Pointed-Type pointed-type-∞-Group

  unit-∞-Group : type-∞-Group
  unit-∞-Group = point-Pointed-Type pointed-type-∞-Group

  mul-∞-Group : (x y : type-∞-Group)  type-∞-Group
  mul-∞-Group = mul-Ω classifying-pointed-type-∞-Group

  associative-mul-∞-Group :
    (x y z : type-∞-Group) 
    Id
      ( mul-∞-Group (mul-∞-Group x y) z)
      ( mul-∞-Group x (mul-∞-Group y z))
  associative-mul-∞-Group = associative-mul-Ω classifying-pointed-type-∞-Group

  left-unit-law-mul-∞-Group :
    (x : type-∞-Group)  Id (mul-∞-Group unit-∞-Group x) x
  left-unit-law-mul-∞-Group =
    left-unit-law-mul-Ω classifying-pointed-type-∞-Group

  right-unit-law-mul-∞-Group :
    (y : type-∞-Group)  Id (mul-∞-Group y unit-∞-Group) y
  right-unit-law-mul-∞-Group =
    right-unit-law-mul-Ω classifying-pointed-type-∞-Group

  coherence-unit-laws-mul-∞-Group :
    left-unit-law-mul-∞-Group unit-∞-Group 
    right-unit-law-mul-∞-Group unit-∞-Group
  coherence-unit-laws-mul-∞-Group =
    coherence-unit-laws-mul-Ω classifying-pointed-type-∞-Group

  inv-∞-Group : type-∞-Group  type-∞-Group
  inv-∞-Group = inv-Ω classifying-pointed-type-∞-Group

  left-inverse-law-mul-∞-Group :
    (x : type-∞-Group)  Id (mul-∞-Group (inv-∞-Group x) x) unit-∞-Group
  left-inverse-law-mul-∞-Group =
    left-inverse-law-mul-Ω classifying-pointed-type-∞-Group

  right-inverse-law-mul-∞-Group :
    (x : type-∞-Group)  Id (mul-∞-Group x (inv-∞-Group x)) unit-∞-Group
  right-inverse-law-mul-∞-Group =
    right-inverse-law-mul-Ω classifying-pointed-type-∞-Group
```