なんじゃくにっき

プログラミングの話題中心。

Scalaで集合論・代数 半群(SemiGroup)【2】

まとめはこっち

前回のおさらい

半群とは以下の条件を満たす集合Sと演算*の組のこと。

条件1. 集合Sが演算*に対して閉じている
 すなわち、S上の任意の元a, b に対して、演算結果 a * b は再び S に属する。

 
条件2. 集合S上の演算*は結合法則を満たす。
 すなわち、S上の任意の元a, b, c に対して、
 (a * b) * c = a * (b * c)

 

色々な半群

半群にも色々種類があって、
特徴的なものは名前が付いていたりします。


半群

何も元を持たない集合と、演算としては空写像の組が空半群です。


class SemiGroup[S](f: (S, S) => S) {
def append(a: S, b: => S) = f(a, b)
}

val emptySemigroup = new SemiGroup[Unit]((_, _) => Unit)


単元半群

元を1つだけ持つ半群が単元半群です。
自動的に演算はその元2つを引数にとって、その元を返す演算になります。


class SemiGroup[S](f: (S, S) => S) {
def append(a: S, b: => S) = f(a, b)
}

object Singleton

val semigroupWithOneElement = new SemiGroup[Singleton]((_, _) => Singleton)


可換半群

半群が交換法則を満たすとき、すなわち
二項演算子の被演算数(引数)を入れ替えても計算結果が同じ
ならば可換半群と言います。

整数は加法についても乗法についても可換半群を成します。
行列は加法については可換ですが、乗法については可換ではありません。


ここから先は

半群単位元が存在するとモノイドです。
次回扱う予定です。