代数構造の「マグマ」と、定義の動機づけ

マグマ

「マグマ」という代数構造がある。

マグマとは、集合とその上の二項演算の組である。

普通の代数構造だと、二項演算について結合法則や単位元の存在など、なんらかの法則を課すことが多いが、マグマは何の法則も課さない。

例えば、整数の集合\(\mathbf{Z}\)と足し算\(+\)の組はマグマをなす。この場合はもっと強く、可換群をなす。

マグマの一般論からすると、この例は「結合法則」や「交換法則」という余計な法則を満たしている。マグマの理論を作っていく上で「足し算」を念頭に置いていたら間違った(一般のマグマでは成り立たない)結論の証明を試みることになりかねない。そういう意味で、足し算の例は「性質が良すぎてあまりマグマらしくない」と言えるかもしれない。

整数の集合\(\mathbf{Z}\)と引き算\(-\)の組は、別のマグマの例である。この例は結合法則も満たさないので、より「マグマらしい」例である。ただ、一定の法則は成り立っており、例えば\((a-b)-(c-b)=a-c\)が成り立つ。

定義の動機づけ

数学者が何かを「定義」するのは、そうするのが「便利」だからである。「嬉しい」というような言い方もされる。

例えば、「配列の全ての要素が真であるかどうかを返す関数」all を定義したい、としよう。空配列に対する all はどう「定義」されるべきか?あるいは未定義とするべきか?

この場合、空配列に対する allTrue と定義すれば all xs && all ys == all (xs ++ ys) という性質が常に成り立つ。これは「嬉しい」ので、普通は空配列の allTrue となるように定義する。もちろん定義するのは勝手なので、空配列に対して False を返す関数も「定義」できるが、それは True の場合と比べて「便利さで劣る」だろう。

例えば、モノイドという代数構造がある。これは単位元を持ち、結合法則も満たす二項演算(および集合)のことである。

モノイドという構造に名前をつけておけば、数学の定理を記述するのに毎回「単位元を持ち、結合法則も満たす二項演算を備えた集合」と書かなくて済む。「単位元を持ち、結合法則も満たす二項演算を備えた集合」が登場する応用はそこそこあるので、この定義は「便利」で「有益」だ。

私が思うのは、何かを「定義」する場合はその「便利さ」がわかるようにするべきではないか、ということだ。motivating exampleを提示せよ、と言っても良い。

マグマはどうか。マグマはただの「二項演算」なので、「記述の省略」という意味は薄い。「可換マグマ」と言わずに「交換法則を満たす二項演算」と言っても大した手間ではないだろう。もちろん文字数の差はあるが、マグマの定義を記述する文字数も含めて考えると「マグマを定義しない方が良い」ことの方が多いだろう。

私が残念なのは、(「代数 マグマ」などのキーワードで)Web検索して出てくる「マグマ」の説明の多くが、(私から見れば)「便利さ」の説得に失敗しているように見えることだ。その説明は解説記事の水増しにしかなっていないのではないか。読者の記憶領域を浪費することにしかなっていないのでは。著者の衒学趣味ではないのか。

こういう「便利さの説明不足」の懸念はマグマに限った話ではないが、マグマの場合は特にそれが顕著だと思う。

実際のところ、「マグマ」は数学をやっていてもなかなか出会わない用語だと思う。数学科を修士まで出た身として言わせてもらうと、数学の文献で「マグマ」という用語が有益な使い方をされている場面に遭遇したのは1回だけだった。

つまり、「マグマ」はほとんど役に立たない概念であるが、極めて限定的な状況では役に立つ概念である、ということだ。

では、私が出会った「マグマという用語を使うにふさわしい場面」とは何だったのか?

その代数構造を「マグマ」と呼ぶ意義

この記事の最初の方で「余計な法則を満たすとマグマらしくなくなっていく」ということを書いた。逆に言うと、「余計な法則を一切満たさないマグマ」があればそれが最もマグマらしいマグマ、ということになる。

代数を学んだ者にはピンとくるだろうが、自由マグマ (free magma) である。

私が「マグマ」の用例に出会ったのはこの「自由マグマ」という形だった。なるほど、「自由」をつけるのであれば「二項演算」ではなく代数構造としての名前を使うのがふさわしい。

その「自由マグマ」にはどこで出会ったのかというと、リー代数に関係する文脈だったと思う。自由リー代数の基底を作る時だったかもしれない。残念ながら詳しいことは忘れてしまった。

ちなみに、プログラミングを嗜む人に向けて注意しておくと、自由マグマは二分木のことである。定義は例えば次のように書けるだろう:

data BinaryTree a = Leaf a
                  | Branch (BinaryTree a) (BinaryTree a)

より良い解説記事のために

繰り返しになるが、解説記事を書く際にはなるべく動機付けをしっかりしたい。

例えば、私が過去に書いた

ではなるべく「便利さ」「意義」みたいなものを説明するようにしている。逆に、その文脈で意義を見出せない「マグマ」などは登場させていない。

私の他の記事でも同様の心がけをしているつもりだが、もし至らない点があれば申し訳ない。その場合は是非「より良い解説記事」をあなたの手で書いてみてほしい。