{-# OPTIONS --safe --cubical-compatible #-}
open import Algebra.Bundles
using (Semigroup; CommutativeSemigroup; RawMagma)
module Algebra.Construct.Centre.Semigroup
{c ℓ} (semigroup : Semigroup c ℓ)
where
open import Algebra.Core using (Op₂)
open import Algebra.Morphism.MagmaMonomorphism using (isSemigroup)
open import Algebra.Morphism.Structures using (IsMagmaMonomorphism)
open import Function.Base using (id)
private
module X = Semigroup semigroup
open import Algebra.Properties.Semigroup semigroup
open import Relation.Binary.Reasoning.Setoid X.setoid as ≈-Reasoning
open import Algebra.Construct.Centre.Centre X._≈_ X._∙_ as Z public
using (Centre; ι; ∙-comm)
domain : RawMagma _ _
domain = record {_≈_ = Z._≈_; _∙_ = _∙_ }
where
_∙_ : Op₂ Centre
g ∙ h = record
{ ι = ι g X.∙ ι h
; central = λ k → begin
(ι g X.∙ ι h) X.∙ k ≈⟨ uv≈w⇒xu∙v≈xw (Centre.central h k) (ι g) ⟩
ι g X.∙ (k X.∙ ι h) ≈⟨ uv≈w⇒u∙vx≈wx (Centre.central g k) (ι h) ⟩
k X.∙ ι g X.∙ ι h ≈⟨ X.assoc _ _ _ ⟩
k X.∙ (ι g X.∙ ι h) ∎
} where open ≈-Reasoning
isMagmaMonomorphism : IsMagmaMonomorphism domain X.rawMagma ι
isMagmaMonomorphism = record
{ isMagmaHomomorphism = record
{ isRelHomomorphism = Z.isRelHomomorphism
; homo = λ _ _ → X.refl
}
; injective = id
}
open IsMagmaMonomorphism isMagmaMonomorphism public
using (isMagmaHomomorphism)
commutativeSemigroup : CommutativeSemigroup _ _
commutativeSemigroup = record
{ isCommutativeSemigroup = record
{ isSemigroup = isSemigroup isMagmaMonomorphism X.isSemigroup
; comm = ∙-comm
}
}
open CommutativeSemigroup commutativeSemigroup public
using (isCommutativeSemigroup; isSemigroup
; isCommutativeMagma; isMagma
; semigroup; commutativeMagma; magma
)
Z[_] = commutativeSemigroup