# Semigroups ```agda module group-theory.semigroups where ``` <details><summary>Imports</summary> ```agda open import foundation.action-on-identifications-binary-functions open import foundation.action-on-identifications-functions open import foundation.dependent-pair-types open import foundation.identity-types open import foundation.sets open import foundation.universe-levels ``` </details> ## Idea **Semigroups** are [sets](foundation-core.sets.md) equipped with an associative binary operation. ## Definitions ```agda has-associative-mul : {l : Level} (X : UU l) → UU l has-associative-mul X = Σ (X → X → X) (λ μ → (x y z : X) → Id (μ (μ x y) z) (μ x (μ y z))) has-associative-mul-Set : {l : Level} (X : Set l) → UU l has-associative-mul-Set X = has-associative-mul (type-Set X) Semigroup : (l : Level) → UU (lsuc l) Semigroup l = Σ (Set l) has-associative-mul-Set module _ {l : Level} (G : Semigroup l) where set-Semigroup : Set l set-Semigroup = pr1 G type-Semigroup : UU l type-Semigroup = type-Set set-Semigroup is-set-type-Semigroup : is-set type-Semigroup is-set-type-Semigroup = is-set-type-Set set-Semigroup has-associative-mul-Semigroup : has-associative-mul type-Semigroup has-associative-mul-Semigroup = pr2 G mul-Semigroup : type-Semigroup → type-Semigroup → type-Semigroup mul-Semigroup = pr1 has-associative-mul-Semigroup mul-Semigroup' : type-Semigroup → type-Semigroup → type-Semigroup mul-Semigroup' x y = mul-Semigroup y x ap-mul-Semigroup : {x x' y y' : type-Semigroup} → x = x' → y = y' → mul-Semigroup x y = mul-Semigroup x' y' ap-mul-Semigroup p q = ap-binary mul-Semigroup p q associative-mul-Semigroup : (x y z : type-Semigroup) → Id ( mul-Semigroup (mul-Semigroup x y) z) ( mul-Semigroup x (mul-Semigroup y z)) associative-mul-Semigroup = pr2 has-associative-mul-Semigroup left-swap-mul-Semigroup : {x y z : type-Semigroup} → mul-Semigroup x y = mul-Semigroup y x → mul-Semigroup x (mul-Semigroup y z) = mul-Semigroup y (mul-Semigroup x z) left-swap-mul-Semigroup H = ( inv (associative-mul-Semigroup _ _ _)) ∙ ( ap (mul-Semigroup' _) H) ∙ ( associative-mul-Semigroup _ _ _) right-swap-mul-Semigroup : {x y z : type-Semigroup} → mul-Semigroup y z = mul-Semigroup z y → mul-Semigroup (mul-Semigroup x y) z = mul-Semigroup (mul-Semigroup x z) y right-swap-mul-Semigroup H = ( associative-mul-Semigroup _ _ _) ∙ ( ap (mul-Semigroup _) H) ∙ ( inv (associative-mul-Semigroup _ _ _)) interchange-mul-mul-Semigroup : {x y z w : type-Semigroup} → mul-Semigroup y z = mul-Semigroup z y → mul-Semigroup (mul-Semigroup x y) (mul-Semigroup z w) = mul-Semigroup (mul-Semigroup x z) (mul-Semigroup y w) interchange-mul-mul-Semigroup H = ( associative-mul-Semigroup _ _ _) ∙ ( ap (mul-Semigroup _) (left-swap-mul-Semigroup H)) ∙ ( inv (associative-mul-Semigroup _ _ _)) ``` ### The structure of a semigroup ```agda structure-semigroup : {l1 : Level} → UU l1 → UU l1 structure-semigroup X = Σ (is-set X) (λ p → has-associative-mul-Set (X , p)) semigroup-structure-semigroup : {l1 : Level} → (X : UU l1) → structure-semigroup X → Semigroup l1 pr1 (semigroup-structure-semigroup X (s , g)) = X , s pr2 (semigroup-structure-semigroup X (s , g)) = g ```