この会の企画・会場設備の提供をして頂きました
㈱ ワークスアプリケーションズ様
にこの場をお借りして御礼申し上げます。
初回は「圏論とはどのような学問なのか?」がなんとなく解るように,一部の重要な題材をピックアップしてざっと紹介します。
データ型$A$,$B$があるとします。この時,$A$と$B$の対(pair)を表すデータ型Pとはどのようなものでしょうか?
Haskellだと
type P = (A, B)
とか
data P = Pair A B
など。
C言語なら
struct P {
A first;
B second;
};
など。
フィールドの名前や順番はどうでも良いので
struct P {
B bar;
A foo;
};
とかでも良い。
例えばA,Bがdouble型なら,複素数型
double _Complex
も対と見なせる。
例えばA,Bが16bit自然数ならばビット演算を使って
(a << 16) | b
も対と見なせる。
このように対の具体例は"いくらでもある"のだけど結局対とは何?
抽象的な概念の具体例を挙げる事はいくらでも可能ですが,例示による曖昧な理解のままでは先に進めません。 定義を定める事が必要です。
より抽象的な定義はより多くの具体例を包括します。
データの構造に依らない「対」の定義を考えましょう。
まず$P$はそれから$A$,$B$型のデータを得る特定の関数を備えているはずです。 これらを$\mathrm{first}$と$\mathrm{second}$と呼ぶことにします。
この事は,以下のような図式(diagram)で表現できます。
A,B型への関数を持つデータ型は無数に存在しますので,これだけでは定義になりません。
ある型からA,B型への関数も無数に存在し得ますので$\mathrm{first}$,$\mathrm{second}$の特徴付けが必要です。
この事は関数合成の記号$\circ$を用いると
と表す事ができます。
または「以下の図式が可換(commutative)である」と言います。
$P$が対でなくても図式は可換になり得ます。例えば$u$が余分なデータを付け足し$\mathrm{first}$,$\mathrm{second}$がそれを捨てる場合などです。
余分なデータがあれば,その生成方法がいくつかあるので$u$は唯一に定まりません。 従って,$f$,$g$に対して$u$が唯一である事を要請する必要がありそうです。
型$A$,$B$の対とは型$P$,関数$\mathrm{first}: P\rightarrow A$,$\mathrm{second}: P\rightarrow B$からなり, 任意の型$X$と任意の関数$f: X\rightarrow A$, $g: X\rightarrow B$に対して,以下の図式が可換となるような $u: X\rightarrow P$が唯一つ存在するものである。
型$A$,$B$の対とは型$P$,関数$\mathrm{first}: P\rightarrow A$,$\mathrm{second}: P\rightarrow B$からなり, 任意の型$X$と任意の関数$f: X\rightarrow A$, $g: X\rightarrow B$に対して,以下の図式が可換となるような $u: X\rightarrow P$が唯一つ存在するものである。
型$A$,$B$の対とは型$P$,関数$\mathrm{first}: P\rightarrow A$,$\mathrm{second}: P\rightarrow B$からなり, 任意の型$X$と任意の関数$f: X\rightarrow A$, $g: X\rightarrow B$に対して,以下の図式が可換となるような $u: X\rightarrow P$が唯一つ存在するものである。
型$A$,$B$の対とは型$P$,関数$\mathrm{first}: P\rightarrow A$,$\mathrm{second}: P\rightarrow B$からなり, 任意の型$X$と任意の関数$f: X\rightarrow A$, $g: X\rightarrow B$に対して,以下の図式が可換となるような $u: X\rightarrow P$が唯一つ存在するものである。
ここでは,全ての$(f,g)$が$P$を経由して$u$と$(\mathrm{first},\mathrm{second})$に一意的に分解される事を要請しています。
この性質を$P$,$\mathrm{first}$,$\mathrm{second}$の普遍性と言います。
後で説明しますがこのように定義すると$P$が(同型という対応を除いて)一意的に定義されます。
今の例において
は本質的ではありません。
使われている語彙は何らかの「もの」と「矢印」と「矢印の連結」です。
アナロジー的に
とすると「対」の概念は何に対応するか考えてみます。
例として$X=\{1,2,3\}$の時を考えます。
つまり$\{1, 2\}$と$\{1, 3\}$の「対」に相当するものは$\{1\}$です。
実は,「集合と包含関係」の場合の「対」に対応する概念は「$A$,$B$の共通部分」となります。
今度は
に置き換えてみます。
具体例として$4$と$6$の「対」を考えます。
つまり$4$と$6$の「対」に相当するものは$4$です。
実は,「整数と順序」の場合の「対」に対応する概念は「$\min\{A,B\}$」となります。
$A$,$B$の共通部分とは$A$,$B$の両方に含まれる要素全てからなる集合である。
$\min\{A,B\}$とは$A$,$B$のうち小さい方である。
集合$A$,$B$の共通部分$P$とは$P\subseteq A$,$P\subseteq B$であって,$X\subseteq A$,$X\subseteq B$であるような任意の$X$に対して$X \subseteq P$となる集合の事である。
整数$A$,$B$の最小値$M$とは$M\leqq A$,$M\leqq B$であって,$X\leqq A$,$X\leqq B$であるような任意の$X$に対して$X \leqq M$となる整数の事である。
一見すると無関係な3つの概念が,同じ言葉で説明できる事を見ました。
型と関数 | ・・・ | 対 |
集合と包含関係 | ・・・ | 共通部分 |
整数と順序 | ・・・ | 小さい方 |
圏論的な定式化は後でやりますが,これらを圏論では 積(product)と呼びます。
概念を「内部の構造」ではなく「外部との関係」によって特徴付ける事によって
という事が解ります。
良い言葉を使う事は良い思考をする事を助けます。様々な抽象概念を明快に記述する為の体系として圏論は良い選択肢であると思います。 圏論の概念を積極的に利用するHaskellなどを使う場合はもちろん,それ以外の言語を使う場合やプログラミング以外の場面においても役に立つと思います。
圏(category)とは
からなり,以後の条件を全て満たすものである。
任意の射$f$には
という2つの対象が備わる。
$\mathrm{dom}(f) = A$,$\mathrm{cod}(f) = B$である事を $ f: A\rightarrow B$ と表す。
射$f:A\rightarrow B$,$g:B\rightarrow C$が存在するならば,
も存在する。
任意の射$f: A \rightarrow B$, $g: B \rightarrow C$, $h: C \rightarrow D$に対して 結合律(associative law)
が成り立つ。すなわち,下図が可換である。
任意の対象$A$に対して
が存在し,任意の$f: A \rightarrow B$に対して単位元律(identity law)
が成り立つ。すなわち,右下図が可換である。
端的に言うと,圏とは
ものです。
対象$A$についての恒等射を$1_A$と表せるのは, 任意の$A$について恒等射が一意に定まるからです。
【一意性の証明】
$1_A,1'_A: A\rightarrow A$が共に恒等射だとする。
恒等射の性質より右図の上半分,下半分はどちらも可換だから
$$ 1_A = 1'_A $$
となる。つまり恒等射は一意に定まる。□
このような証明スタイルをdiagram chasingといいます。
対象$A$,$B$の積とは対象$P$,射$p_1: P\rightarrow A$,$p_2: P\rightarrow B$からなり, 任意の対象$X$と任意の射$f: X\rightarrow A$, $g: X\rightarrow B$に対して,以下の図式が可換となるような $u: X\rightarrow P$が唯一つ存在するものである。
あるものとあるものの「等しさ」というのは曖昧な概念です。
例えば集合$\{0, 1, 2\}$と$\{1, 3, 5\}$は異なりますが
「要素の数」という観点ではある意味等しいです。
圏論には「~と~がある意味等しい」という事について正確に述べる為の様々な言葉が登場しますが,「同型」もその一つです。
$f: A\rightarrow B$に対して,$g: B\rightarrow A$が存在し,
が成り立つならば$f$を同型射(isomorphism)と呼ぶ。
また,圏$\mathbf{C}$において$A$と$B$の間に同型射が存在するならば,$\mathbf{C}$において$A$は$B$と同型(isomorphic)であると言い,
$$ A \cong B$$
と表す。
からなる圏では$\{0,1,2\}$と$\{1,3,5\}$は非同型です。
注: 同じ色の矢印を全部合わせて1つの関数(射)です。
からなる圏では$\{0,1,2\}$と$\{1,3,5\}$は同型です。
注: この図にあるのは同型射のうちの1つ(全部で6つ)です。
$f: A\rightarrow B$が同型射ならば
となる$g$は一意に定まる。このような$g$を逆射(inverse)と言い$f^{-1}$と表す。
【一意性の証明】
$g, h: B\rightarrow A$が$f$の逆射であるとすると右図が可換となるから,
$$ g = h $$
となる。つまり逆射は一意に定まる。
□
函手(functor)とはある圏からある圏への 構造を保つマッピングの事です。複数の圏にまたがる議論を可能にする非常に便利な道具です。
ところで圏の構造とは
の事でした。
圏$\mathbf{C}$から圏$\mathbf{D}$への函手$F: \mathbf{C}\rightarrow\mathbf{D}$とは
$\mathbf{C}$の全ての対象を$\mathbf{D}$の対象へ移し
ドメイン・コドメインを保って$\mathbf{C}$の全ての射を$\mathbf{D}$の射へ移し,
このとき,射の合成関係と
恒等射を保つものです。
例えば$\mathbf{C}$と$\mathbf{D}$が下図のような圏ならば,
このようなマッピングが函手の例です。
圏$\mathbf{C}$から圏$\mathbf{D}$への函手$F: \mathbf{C}\rightarrow\mathbf{D}$とは $\mathbf{C}$の各対象$A$に$\mathbf{D}$の対象$F(A)$を対応付け, $\mathbf{C}$の各射$f: A\rightarrow B$に$\mathbf{D}$の射$ F(f): F(A) \rightarrow F(B) $を 対応付ける2つの関数の組であり,以下の条件を満たすものである。
函手は合成射と恒等射を保つので,可換図式も保ちます。
例えば,下図の上の図式が可換ならば下の図式も可換です。
つまり,逆射も保たれますし同型性も保たれます。 $$ F(f^{-1}) = F(f)^{-1} \qquad A\cong B \Rightarrow F(A) \cong F(B)$$
双対性(duality)とはある意味で表裏一体になっているような2つの概念の関係です。 例えば
などが分り易い双対の例です。
圏$\mathbf{C}$に対して,対象はそのままにし射を逆向きにした圏を
$\mathbf{C}$の双対圏(opposite category)と言い
$ \mathbf{C}^{\mathrm{op}} $と表す。
下図の圏(整数と$\leqq$)における$4$と$6$の積は$\min\{4, 6\}$でした。
一方,双対圏における$4$と$6$の積は$\max\{4, 6\}$となります。
下図の圏($\{1,2,3\}$の部分集合と包含関係)における$\{1,2\}$と$\{1, 3\}$の積は$\{1\}$,つまり共通部分でした。
一方,双対圏における$\{1, 2\}$と$\{1, 3\}$の積は$\{1,2,3\}$,つまり和集合となります。
双対圏における積(product)を元の圏における余積(coproduct)と言います。
一般に,双対な概念を表す場合に接頭辞"co-"を使います。日本語では「余」を使います。
対象$A$,$B$の余積とは対象$Q$,射$q_1: A\rightarrow Q$,$q_2: B\rightarrow Q$からなり, 任意の対象$X$と任意の射$f: A\rightarrow X$, $g: B\rightarrow X$に対して,以下の図式が可換となるような $u: Q\rightarrow X$が唯一つ存在するものである。
型と関数からなる圏における積は「対」でした。
では余積は何に対応するでしょうか?
$A$,$B$の余積$Q$とは次のようなものです。
これまで「対」とか「貼り合わせ」とか言っていましたが,普通は「直積」「直和」と呼びます。
ところでHaskellやO'Caml等の関数型言語で用いられる「代数的データ型」では直積・直和の概念が基本になっています。
-- String, Intの直積
data Person = Person { name :: String, age :: Int }
-- (いくつかの直積の)直和
data Shape = Circle { radius :: Double }
| Rectangle { height :: Double, width :: Double }
任意の圏$\mathbf{C}$の対象$A$,$B$についてその積が存在するなら,それらは全て同型です。このことを$A$,$B$の積は同型を除いて一意である(unique up to isomorphism)と言います。
$A$,$B$の積は全て同型なので,特定の一つを指定しなくても議論を矛盾なく進める事が出来ます。そこで今後は下の表記を使います。
余積は双対圏での積なので自動的に「余積も同型を除いて一意」であると言えます。従って同様に下の表記を使う事が出来ます。
具体例として以下の2つの関数を考えます。
リストという概念にとって自然と言えるのはどちらでしょうか?
これらの関数には以下のような違いがあります。
リスト型$[A]$はリスト函手$[-]$で型$A$から作られるのでした。 つまり,リストとは要素の型というパラメータを持つ型(多相型)です。
一般化して,函手$F:\mathbf{C}\rightarrow\mathbf{D}$を$\mathbf{C}$の対象をパラメータに持つ概念と思う事ができます。 すると,概念$F$と概念$G$の対応が自然であるというのは対応関係がパラメータの構造に依存しない事だと考える事ができます。
自然変換は函手と函手の対応関係です。
すると,2つの圏$\mathbf{C}$と$\mathbf{D}$から
という圏を作る事ができます。これを函手圏(functor category)と言います。ちゃんとした定義は後の回にやります。
ところで,圏$\mathbf{C}$から同じ圏$\mathbf{C}$への函手を自己函手(endofunctor)と言います。
今後扱う抽象概念の様々な構成法は,最終的に随伴(adjunction)という概念によって統一されます。 随伴を通してしか見えてこないものもありとても重要です。
本日の知識では随伴の定義はできませんが,今後どんな事を学ぶのか感じてもらう為にその雰囲気だけ説明します。
任意の$X$と任意の射$f: X\rightarrow A$,$g: X\rightarrow B$に対して以下の図式が可換になるような射$\langle f, g\rangle: X\rightarrow A\times B$が唯一つ存在する事が$A\times B$の定義でした。これを例として随伴を説明したいと思います。
一般化して,圏$\mathbf{C}$と$\mathbf{D}$を結ぶ函手$F: C\leftrightarrows D: G$について, 下図の$\mathbf{C}$と$\mathbf{D}$の射の間に,$X$,$Y$において自然な同型対応$\phi$が存在するならば, $(F,G,\phi)$を $\mathbf{C}$から$\mathbf{D}$への随伴と言い, $F$を$G$の左随伴(left adjoint),$G$を$F$の右随伴(right adjoint)と言います。
積の例に戻って$X = A\times B$とし,下側に恒等射$1_{A\times B}$を取ってみると, 上側に$p_1$と$p_2$の対が現れます。
この事は$(p_1, p_2)$(からなる自然変換)がこの随伴の 余単位元(counit)であると説明されます。同様に,上側に恒等射を取ると単位元(unit)という自然変換が現れます。
函手$F$が与えられたとき,その右随伴$G$はもし存在するなら同型を除いて一意となります。逆も然りです。従って「~とは~の右(左)随伴である」といった形での定式化が可能になります。
随伴の記述では函手と自然変換が基本的な語彙となります。 これは個別の対象・射に基づく記述よりも抽象的で使い勝手が良いのではないかと思います。
随伴についての定理を知っておくと直ちに様々な具体例に適用出来ます。 また,任意のモナド・コモナドが適当な随伴から構成できるなどの応用もあります。
お疲れ様でした。
圏論とはどんな学問で,これからどのような事を学ぶのか,なんとなく分かってもらえたのではないかと思います。
次回以降は最初に戻って圏の定義から一歩ずつ進めて行きます。