「第2歩」と書いたからと言って続くかどうかはわからない、なにしろ僕は気まぐれだからね。
とりあえず第1歩で、手でいじれる圏の例が1つは手に入りました。圏論のような抽象的/一般的な理論を納得するには、具体的な例をたくさん知って、具体例に一般論を適用してみるのがいい方法だと思います。
そこで、関手だの自然変換だのに進む前に、もうひとついじり倒せる具体例を出しておきましょう。しりとりの圏よりは少しだけ高級で、行列(マトリックス)を考えます。僕は、高校で2×2行列の計算を無意味にやらされた記憶があるのだけど、今の教育はどうなっているかしら? ともかく、行列計算の経験は仮定します。
内容:
行列の復習
行列は、数を四角形に並べたモノです。ここで、「数」は実数だとしておきます。横の並びが行で、縦の並びが列です。このことを忘れてしまう人は次の図を見れば二度と忘れないでしょう*1。
行列のサイズ(行の数と列の数)は非常に重要です。よく「2×3行列」とか「2-3行列」とか書きますが、ここではより明白に「2行3列の行列」、あるいは「3列2行の行列」のように表現します(そのほうが、まぎれがないでしょう)。
行列の演算は掛け算だけを考えます。行列Aと行列Bを掛けた積はA・B、またはB;Aで表します。A・BとB;Aはまったく同じ意味ですが、AとBの順序が逆になっています。なんで2つの記法を使うかは最後で説明します。
行列の圏
行列Aの列の数、つまり四角形の横幅をwidth(A)と書くことにします。同様に、行列Aの行の数=四角形の縦の長さはheight(A)です。AとBの積(掛け算)A・Bが定義できる条件は、width(A) = height(B) でした。また、n行n列の単位行列(対角成分だけが1で他は0の行列)Inがありましたよね。… うーん、これって… なんか圏の匂いがプンプンするぞ。
ちゃんと定式化してみましょう。まず、自然数(0も含める)の全体をN={0, 1, 2, 3, ...}とします(Nを太字にするのは、そういう習慣なのです)。そして、すべての行列からなる集合をMatとします(Matrixから)。
既に、次の2つの関数は定義済みです。
- width, height : Mat → N
単位行列Inは、自然数nに対して行列を対応させる関数とみなせるので:
- I : N → Mat
そして掛け算「・」、または、同じ演算ですが書き方を逆順にした「;」があります。
- A・B は height(B) = width(A) のときだけ定義される2項演算
- A;B は height(A) = width(B) のときだけ定義される2項演算
圏論の文脈では、「;」を使ったほうが幾分自然な記述になります。
さてと、以下の等式群は、圏となるための条件ですが、いずれも、行列の掛け算を知っていれば簡単なものです。「・」でなくて「;」を使っているので、その点に気を付けて確認してみてください。
- width(In) = height(In) = n (n∈N)
- width(A;B) = width(A)、height(A;B) = height(B) (A, B∈Mat、AとBは掛け算可能)
- (A;B);C = A;(B;C) -- 結合法則
- n = width(A), m = height(A) なら、In;A = A;Im = A -- 単位法則
しりとりの圏のときと同じように、圏論一般と行列の圏の対応を表にしておきます。しりとりの例も一緒に載せておきましょう。
圏論一般 | 行列の例 | しりとりの例 |
---|---|---|
対象 | 自然数 | ひらがな文字 |
射 | 行列 | ひらがな文字列 |
恒等射 | 単位行列 | 長さ1の文字列 |
結合(合成) | 行列の掛け算 | しりとり結合 |
対象の集合 | 自然数の集合N | ひらがな文字の集合H |
射の集合 | 行列の集合Mat | ひらがな文字列の集合HStr |
dom (域) | width | first |
cod (余域) | height | last |
id (恒等射) | I | unit |
圏の名前付けとか記号とか
圏をちゃんと定義するには、次の構成要素を列挙する必要があります。
- 対象(と呼ばれるモノ)の集合
- 射(と呼ばれるモノ)の集合
- 射に、域(と呼ばれる)対象を対応させる関数(一般的にはdomと書く)
- 射に、余域(と呼ばれる)対象を対応させる関数(一般的にはcodと書く)
- 対象に恒等射(と呼ばれる)射を対応させる関数(一般的にはidと書く)
- cod(f) = dom(g) のときにだけ定義される結合(と呼ばれる)二項演算(一般的にはf;gと書く)
さらに、これらがしかるべき条件を満たすことが確認できたら、「圏だ」と言っていいわけです。しりとりの例と行列の例は、確かに圏になっていたわけですね。
特定の圏をきまじめに書くと、(H, HStr, first, last, unit, ;(しりとり結合)) のように書くことになりますが、あまりにも面倒なので、次の習慣に従って記号を節約します。
- 域、余域、恒等射、結合(合成)は、事例ごとに固有の名称/記号を使うのではなくて、一般的な記号dom, cod, id, ; を使う。
- 射の集合と圏の名前は同じ名前/記号を使う。
- 圏Cの対象の集合は、Obj(C)または|C|と書く。
この習慣に従うと、圏の名前だけを考えれば、残りの記号を考える必要はなくなります。例えば、行列の圏をMatと呼ぶことにすれば、(N, Mat, width, height, I, ;(逆順の掛け算)) は、(|Mat|, Mat, dom, cod, id, ;)と書けることになります。
ホムセットと矢印記法
行列の圏Matで考えることにします。n列m行の行列の全体をMat(n, m)と書きます(列と行をちゃんと区別してね)。この記法を使うと、次の条件はすべて同じです。
- Aはn列m行の行列
- A∈Mat(n, m)
- width(A) = n, height(A) = m (行列固有の記法)
- dom(A) = n, cod(A) = m (圏の一般的な記法)
圏論の一般的な習慣では、dom(A) = n, cod(A) = m のとき、A:n→mという矢印を使った書き方をします。念のためもう一度確認すると:
- A∈Mat(n, m) ⇔ A:n→m
- A:n→m ⇔ dom(A) = n, cod(A) = m
Mat(n, m)のように、域(dom)と余域(cod)を特定した射の集合はホムセット(hom-set)と呼びます。この呼び名は、かつてMat(n, m)の代わりにHomMat(n, m)のような記法を使っていたからです。
図式順記法と反図式順記法
一般論を少しします。圏Cの射fは、どれかのホムセットに入ります。別な言い方をすると、適当な対象a, bに対して、f:a→b と書けます。このことは、「f∈C(a, b) ⇔ dom(f) = a, cod(f) = b ⇔ f:a→b 」の意味を考えればわかるでしょう。
「fとgが結合(合成)可能」であることは、次のようないくつかの表現を持ちます。
- cod(f) = dom(g)
- f∈C(a, b), g∈C(b, c)
- f:a→b, g:b→c
特に最後の矢印記法「f:a→b, g:b→c」に注目すると、「fとgの結合(の結果)」を f;g と書くのが自然でしょう。そこで、fを左、gを右に書く記法を図式順(diagrammatic order)記法と呼びます。
ところが、歴史的には「fとgの結合」を g・f と書く(実際にはシロマルが多い)方式が長い期間使われてきました(今でも使います)。こちらは反図式順記法になります。
不幸なことに(そして、当然なことに)、現在、図式順記法と反図式順記法の両方が使われていて、混乱することも少なくありません。両方を併用して慣れておくのがよいと思います。
*1:この図は、ムカーシ出版して売れなかった僕(共著)の本からスキャンしたものです。