プログラミング/圏論入門 の履歴(No.6)
更新概要†
圏論はプログラミングにおける様々な概念の数学的なバックグラウンドを与えるということで、 前から気にはなっていたのだけれど、こちらにフリーの日本語テキストがあると聞いて読み始めました。
https://ktgw0316.github.io/milewski-ctfp-markdown/
で、全然理解できなかったので、いろいろと調べながら分かった範囲をまとめようとしています
(上のリンク先、それだけで独学するにはあまり向いていないかも???)
目次†
準備: 「クラス」 について†
圏論では『「要素の集まり」ではあるけれど「集合」とは呼べないもの』を扱うことがある。これは、ラッセルの逆説として有名な話で「自分自身を含まない集合をすべて集めたもの $R$」を集合であるとすると矛盾が生じる、というようなのが関係している。
- $R$ が自分自身を含まないなら、$R$ は $R$ に含まれるはず???
- $R$ が自分自身を含むなら $R$ は $R$ に含まれないはず???
どちらも矛盾する。
これは何でもかんでも「要素の集まり」を「集合」と言ってしまうとまずいことが起きうる、ということを示している。
そこで「集合」よりも広い意味で「要素の集まり」と言いたいときの用語として、数学的な専門用語である「クラス(class)」が使われる。これ、数学的に定義をしっかりしようとすると結構ややこしいのだが、基本事項として「クラス」は「集合」と「要素の集まりだが集合とはみなせないもの(真のクラス)」の両方を含む概念。集合はクラスである一方、クラスではあるが集合ではないもの(真のクラスと呼ばれる)が存在する。
以下に出てくる「クラス」という用語は多くの場合「集合のようなもの」という程度の理解でしばらくは読み進められるはず。
圏(category)の定義†
圏 $\mathcal C(O, \mathrm{hom}(\cdot,\cdot))$ と書くとそれは以下を意味する。
- $O$ は対象(object)と呼ばれる要素のクラス(集まり)
- 任意の2つの対象 $A, B\in O$ を順序付きで取り出すと、そこに「射(morphism)」のクラス(集まり) $\mathrm{hom}(A,B)$ が付随する
- さらにこの「射」に対して 下で述べる公理 が成り立つ
と言ってもなんだかわからないのだが、、、
有向グラフ†
圏をイメージするには「対象」同士を結ぶ「矢印」を描くと分かりやすい。
この図では黒丸が「対象」、矢印が「射」を表す。
いわゆる「有向グラフ」になっている。
ここには $O=\set{A,B,C}$ で3つの「対象」が存在する。
また、例えば $\mathrm{hom}(A,B)=\set{d, e}$ が $A$ から $B$ へ向かう矢印の集合であるとする。
- $\mathrm{hom}(A,A)=\set{a}$
- $\mathrm{hom}(B,B)=\set{b}$
- $\mathrm{hom}(C,C)=\set{c}$
- $\mathrm{hom}(A,B)=\set{d, e}$
- $\mathrm{hom}(B,A)=\set{}$
- $\mathrm{hom}(B,C)=\set{f}$
- $\mathrm{hom}(C,B)=\set{}$
- $\mathrm{hom}(A,C)=\set{g,h}$
- $\mathrm{hom}(C,A)=\set{}$
である。
射が向きを持つこと、ある対象から同じ対象へ戻る射 (例:$a,b,c$) が許されること、に注意せよ。
射の実態と $\mathrm{hom}$ の向き†
同じ図を $\mathrm{hom}(\cdot,\cdot)$ の中身を入れ替えて、$\mathrm{hom}'(B, A)=\set{d, e}$ のように、$B,A$ の順で $A$ から $B$ への矢印の集合を表すと定義しなおして新たな圏を構成しても構わない。$\mathrm{hom}(\cdot,\cdot)$ に与える対象の順番が、射の何の方向を決めるか(矢印の方向か、その逆方向か、など)は $\mathrm{hom}(\cdot,\cdot)$ の定義次第である。
Set 圏 = すべての集合とすべての写像が作る圏†
で、始めて圏論を学ぶ際には、「射」の実態として「写像」を思い浮かべると理解しやすい。
写像 $f:A\to B$ は任意の $x\in A$ に対して $f(x)\in B$ となる値を計算する規則(関数)であった。このとき$A$は始域、$B$は終域と呼ばれる。上で射とされた $a,b,c,\dots,h$ がそれぞれ個別の写像であり、$A,B,C$ はそれらの始域や終域となるクラス(集合)であると考える。これは実際、かなりメジャーな圏の構成である。
特に、$O$ をすべての集合を集めたクラスとし(これは真のクラスになる)、$\mathrm{hom}$ を2つの集合の間に考え得るすべての可能な写像の集合(こちらは集合になる)とする圏には Set 圏という名前がついている。
射の満たすべき公理†
圏論は個々の写像が始域の個々の要素を終域のどの要素へ移すか、という個別事情に立ち入らないまま、写像同士の合成について論じる手法を与える。
そのために圏論で射に要求される公理を、写像の言葉で理解すると次のようになる:
- 射(写像)は常に合成可能である
→ $f:A\to B,\ g:B\to C$ があるならそれを合成した $g\circ f: A\to C$ も必ず圏に含まれる
- 合成に結合則が成り立つ
→ 任意の $f:A\to B,\ g:B\to C,\ h:C\to D$ に対して
$(h\circ g)\circ f=h\circ (g\circ f)$ が常に成り立つ
- 任意の対象が恒等射(恒等写像)$1$ を持つ
→ 各対象ごとに、任意の $f:A\to B$ に対して、$f=f\circ 1_A=1_B\circ f$
を満たす写像 $1_A:A\to A,\ 1_B:B\to B$ が必ず存在する(恒等射の定義も兼ねている)
したがって、上の図の系が圏であるためには、
- $a=1_A$
- $b=1_B$
- $c=1_C$
- $g=f\circ d$
- $h=f\circ e$
であることが要求される($g,h$ は逆でもいい)。
このように一般の有向グラフは「合成に対して閉じていること」や「恒等写像が存在すること」を満たさないため、そのままでは圏にはならない。この2つの要請は圏の性質を強く縛るものになっている。
対象の内部構造に踏み込まず、射の性質のみで公理化する†
恒等射が「要素を変更しない」のような要素レベルの言葉ではなく、
「別の射と合成したときに変化させない」のように射レベルの言葉で定義されていることに注意せよ。
このように圏論では対象の内部構造に踏み込まず、射の性質のみで公理化する手法が用いられ、
これをしばしば「普遍的な議論の方法」と呼ぶ。
これは、対象を外から見て射のレベルで同じなら、対象の内部構造に寄らず普遍的に適用可能な議論の方法、というような意味だ。
圏論における恒等射は要素を変え得る†
そして、要素レベルの定義と、射レベルの定義とが
決定的に異なる結果を生む場合があることにも注意が必要だ。
最も顕著な例として、ある対象 $A$ へ出入りする射が恒等射 $e$ しかない場合を考える。
このとき上の3つの公理は実質的に「恒等射が冪等であること $e\circ e=e$」しか求めない。
- $e\circ e=e$ であれば閉じている
- $(e\circ e)\circ e=e\circ (e\circ e)=e$ は結合則を満たす
- 任意の $f:A\to B$ や $g:B\to A$ というのが $e$ しかないので恒等性も $e\circ e=e$ しか要求しない
恒等射に「要素を変えない」という要請が与えられないのだ。
例えば 「ゼロを掛ける」 や 「何らかの射影」 のような写像は冪等だ。
つまり実際にはそのような「要素を変化させる射」が「恒等射」とみなされうるのである。
他の射との合成で「本当は恒等でない」という事実が「ばれない」限り、それは恒等と見なされる。
射の合成のみで議論を進める圏論ではこう言うケースがそこここに出てくることに注意せよ。
恒等写像は対象あたり高々1つしか存在しない†
それでも上記の射レベルの公理のみで様々な有用な定理や概念を導けることを以下に見る。
1つ簡単な例をここで挙げれば、
ある対象 $A$ の上の恒等写像は高々1つだけであることを次のように示せる。
$1_A:A\to A,1'_A:A\to A$ がどちらも $A$ の恒等写像であるとすると、
$1_A=1_A\circ 1'_A=1'_A$ となって両者は等しい。
特殊な対象、空写像†
Set圏において空集合 $\set{}$ や、1つの要素だけ(その要素を $()$ と書く) を含む集合 $\set{()}$ は圏論の「対象」として顕著な性質を持つ。
$A$ を任意の対象(Set圏なので集合)とすると、
$f:\set{}\to A$ は写像に与えるべき値が存在しないため「呼び出し不可能な写像」となる
圏論ではこれを「空写像」と呼び、そのような写像がただ1つだけ存在する、とする。
(そんな写像は存在しない、とするのではなく、存在するが呼び出せない、つまり像が空集合である、
と考えるのだそうだ)
$f:A\to\set{}$ は $A=\set{}$ であれば空写像であるが、$A\ne\set{}$ では呼び出せるのに返せる値が存在しない、となってしまうため、そのような写像は存在しない。つまり $\mathrm{hom}(A,\set{})$ は必ず空集合になる。
$f:A\to\set{()}$ は返せる値が1つしかないので、「任意の $a\in A$ に対して $()$ を返す」 という1つの写像だけが存在する。
$f:\set{()}\to A$ は与えられる要素が $()$ に固定されているので、$A$ のどの要素を返すか、だけで写像が定義されるから、$\#A$ 個の独立な写像が存在する。
圏論ではこういった特殊な対象を普遍的に扱うために、**始対象**、**終対象**という言葉を使う。
始対象、終対象、零対象†
始対象$I$とは、任意の対象 $A$ に対して、$f:I\to A$ となる射がただ1つだけ存在する対象のこと。
Set圏では $\set{}$ が始対象になる。
終対象$T$とは、任意の対象 $A$ に対して、$f:A\to T$ となる射がただ1つだけ存在する対象のこと。
Set圏では $\set{()}$ は終対象になる。
零対象$0$とは、始対象かつ終対象であるような対象のこと。
Set圏には零対象は存在しない。
Q: ある圏に始対象$I$があったとして、そこからある対象 $A$ に対する一意な射 $f:I\to A$ を取り除いてしまったら $I$ は始対象ではなくなるのか?
A: 定義上はそのとおりだが、取り除けない場合があるのでそこには注意が必要。
$g: B\to A$ のような射が存在する場合には、$I\to B\to A$ の合成経路が存在するため、$f$ のみを取り除くことができない。$I$ 以外の対象から$A$への射が一切存在しないときに限って$f$を取り除くことができる。始対象の定義は任意の対象に対して一意な射を持つことなので、そのような射が欠落してしまえば始対象の資格を失う。
上の図の例では始対象も終対象も存在しない。
上の図から $e,h$ を取り除くと、$A$が始対象、$C$ が終対象となる。
この時、$A$ や $C$ は必ずしも空集合や1要素集合でなくともよく、それぞれのペアに定義される一意な射も空写像や定数写像である必要もない。
零対象を持つ圏では、ゼロ元あるいは単位元のみからなる集合が零対象になることが多い。
例えばベクトル空間を対象として線形変換を射とする圏において、
- ゼロ次元空間 $\set{0}$ から任意の線形空間への線形変換は $0\mapsto 0$ の1種類しかない
- 任意の線形空間からゼロ次元空間 $\set{0}$ への線形変換は $v\mapsto 0$ (すべてを $0$ に移す) の1種類しかない
任意の $A\to 0\to B$ のような写像は元の $A$ にあった情報を捨てて $B$ のゼロ元に移るという顕著な性質を持つ。
始対象・終対象は存在するなら同型を除いて一意である。
なぜなら、例えば $I,I'$がどちらも始対象であれば$a:I\to I'$、$b:I'\to I$、$c:I\to I$、$d:I'\to I'$ にはそれぞれに一意な射であるから $b\circ a:I\to I, a\circ b:I'\to I'$ はそれぞれ $c,d$ に等しく、さらに恒等射に等しい。すなわち $a,b$ は互いに逆射である。
逆射と同型の関係を次に述べる。
逆射の存在と対象の同型性†
対象 $A,B$ が $a:A\to B,b: B\to A$ を持ち、$a\circ b=1_B$ かつ $b\circ a=1_A$ を満たすとき $a,b$ は互いに逆射であると言い($a^{-1}=b, b^{-1}=a$)、逆射を持つ射を同型射と言い、同型射で結ばれる $A,B$ は同型であると言う。
同型射は一対一写像(全単射)のようなものと思えばいいが、一般の圏では対象は必ずしも集合ではなく射は必ずしも写像ではないし、対象が集合であり、$a$ が一対一写像であったとしても、その逆写像 $a^{-1}$ が必ずしも圏に含まれないため素朴には同一視はできないことに注意が必要である。
定理:同型な対象は、周囲の対象と必ず同じ本数の射で結ばれている†
$A,B$ が同型であるとすると、$f:A\to B$ と $f^{-1}:B\to A$ が存在する。
ある $C$ に対して、
- $g:C\to A$ が存在するなら、それに対応して $f\circ g:C\to B$ が必ず存在する
- $h:A\to C$ が存在するなら、それに対応して $h\circ f^{-1}:B\to C$ が必ず存在する
このように、同型であることと、射の合成が常に可能であること、の組み合わせにより、 同型な対象は圏の中にとてもよく似た構造を持つことになる。
単射、全射、全単射†
圏論ではこれらの概念も、「個別要素がどこに写像されるか」に踏み込まずに定義される。
$f:A\to B$ として、
$f$ が単射とは: 任意の対象 $C$ と $g, h: C\to A$ に対して、$g\ne h⇒f\circ g\ne f\circ h$
- 通常、写像の用語で単射とは、「入力が異なれば出力が異なる」という性質のことである
- 圏論ではそれを、前置する写像が異なれば、合成写像が異なる、と言い換えている
- 両者は一見すると似ているものの、実はこの違いは大きくい
- 写像として単射ではなく、複数の要素が同じ出力を生じる場合であっても、ちょうどそこを踏み分けるような $g\ne h$ が圏内に存在しなければ、圏論的には単射と呼ばれることになるのである。
$f$ が全射とは: 任意の対象 $C$ と $g, h: B\to C$ に対して、$g\ne h⇒g\circ f\ne h\circ f$
- 写像用語で全射とは、出力が終域すべてをカバーする、というようなことである
- それを、後置する写像が異なれば、合成写像が異なる、と言い換えている
- 終域の中で出力がカバーしない範囲があれば、そこでだけ異なる値を取るような異なる $g,h$ に対して、合成射が等しくなってしまうことを思い浮かべれば意味を理解しやすい
- とはいえこちらも、もし終域にカバーしない範囲があったとしても、それを見分けられる射 $g,h$ が存在しなければ全射と見なされるため、写像としての全射とは同一視できない
$f$ が全単射とは: 全射かつ単射であること。
写像としての全射・単射と、圏論における全射・単射が大きく異なることを示す極端な例として、任意の対象間に高々1つしか射が定義されていない「細い圏(thin category)」では、すべての射がその内容に寄らず自動的に全単射となることを確認せよ。$g\ne h$ となる射が存在せず、公理が実質何のチェックも行わないためだ。
当然、こういう「実際には何のチェックもされていない全単射」は「逆射の存在」を保証しない。
圏論では「全単射」と「逆射の存在」とがまったく別の概念となることに注意を払おう。
双対性†
| 用語 | 定義 |
| 始対象$I$ | 任意の対象 $A$ に対して、$f:I\to A$ となる射がただ1つ |
| 終対象$T$ | 任意の対象 $A$ に対して、$f:A\to T$ となる射がただ1つ |
のように並べてみると、これらの定義は矢印の方向が逆なだけでそっくりな形をしている。
この類似性は双対性(duality)と言い表される。
圏 $\mathcal C(O,\mathrm{hom})$ の射の向きだけをすべてひっくり返した反対圏 (opposite category) $\mathcal C^{\mathrm{op}}(O,\mathrm{hom}')$ を作ることを考える(双対圏 dual category とも呼ばれる)。これは例えば$A\to B$ の写像の向きを反転させて$B\to A$ の写像を考えよう、というようなことを言っているのではなく、$\mathrm{hom}(A,B)$ が $A\to B$ の写像の集合だったのに対して、$\mathcal C^{\mathrm{op}}$ では $\mathrm{hom}'(B,A)$ が $A\to B$ の写像の集合であるとしよう、と言っている。対象であったり、写像であったりといった実体は同じまま、射の向きを写像の向きと反対方向に取ると定義するだけ。
すると、元の圏における始対象・終対象は反対圏では逆に終対象と始対象になる。このように矢印の向きだけを入れ替えたときに対応するペアを一般に双対(dual)と呼ぶ。$\mathcal C$ と $\mathcal C^{\mathrm{op}}$ は双対(双対圏)であり、始対象の定義と終対象の定義も双対の関係にある。
圏論で1つ定理を証明すると、その双対も自動的に証明されるのは便利な性質である。
積 (product)†
対象$A,B$の**積**とは、下記の公理を満たす3点セット $(A\times B,p,q)$ のこと。
- 対象 $A\times B$ = $A,B$ の直積$(A,B)$の集合をイメージ
- 射 $p:A\times B \to A$ (第1射影) = $(A,B)$ から $A$ を取り出す射影をイメージ
- 射 $q: A\times B \to B$ (第2射影) = $(A,B)$ から $B$ を取り出す射影をイメージ
公理:
任意の対象$C$と、任意の射の組 $f: C\to A$、$g: C\to B$ に対して、
ただ1本の射 $h: C \to A\times B$ が存在して、
$p\circ h = f$ かつ $q\circ h = g$ を満たす。
考えているストーリーは以下のようなもの:
- 要素 $\gamma\in C$ を入力として $f,g$ により $\alpha=f(\gamma)\in A,g(\gamma)\in B$ を得る
- それらをまとめて一旦 $\big(f(\gamma),g(\gamma)\big)\in A\times B$ に入れておく
- $f,g$ した後まとめる演算が $h:\gamma\mapsto\big(f(\gamma),g(\gamma)\big)$
- $\big(f(\gamma),g(\gamma)\big)\in A\times B$ から $p:(\alpha,\beta)\mapsto\alpha,$ $q:(\alpha,\beta)\mapsto\beta$ により $A,B$ の元を取り出すと $f,g$ を再現できる
そこからどうして上の公理が出てくるのか?
$C,f,g$ を仮定すると唯一の$h$が決まる、というのはどういうことか?
公理が言っているのは $A\times B$ からの取り出し方法 $p,q$ が与えられているとき、
正しく取り出せるような入れ方 $h$ が1つだけ存在する、ということ
これにより「取り出したもの $p(\cdot),q(\cdot)$」から
「入れたもの $\big(f(\gamma),g(\gamma)\big)$」を再現できる ことを保証するのである。
そして、それだけ見ている見落としそうなもう1つの強い制約として、
任意の $(C,f,g)$ に対して $h$ が必ず1つ存在しなければならないということがある。
これは $(A\times B,p,q)$ だけでなく圏自体に対する強い制約になっている。
$h$ が欠損するような$(C,f,g)$があってはならない。
ここまでの議論は $A,B,A\times B$ の元について直接考える代わりに、
$C$ からそれぞれの対象に元を生成する射$f,g,h$に基づいたものになっていた。
プローブ対象、一般化された元、錐†
この $C$ のように興味範囲の対象に元を供給する源となる対象は「プローブ対象(probing object)」と呼ばれ、元を生成する射 $f,g,h$ 自体のことを「一般化された元(generalized element)」と呼ぶ。
個々の元そのものを考える代わりに、プローブ対象から各対象へ一般化された元が伸びる構造(「錐(cone)」と呼ばれる)で代用するのは圏論の標準的な手法である。
プローブ対象$C$を一般化された元$f$で移した像$f(C)$が、飛び先の対象の中で有効な元の範囲となることからも分かる通り、「圏全体に含まれるいずれの射からも生成されない元」は、圏論では「存在しないもの」とみなされる。これは全射・単射の議論でも出てきた話だった。
また、ここまでの話は対象が集合で、射がその間を結ぶ写像であるという前提での議論になっていたが、上記の積やプローブ対象、一般化された元、錐などの概念は、より一般的な圏では異なる意味を持つことになる。
余積 (coproduct)†
余積は積と双対関係にある構造である。互いに双対関係にあるペア、と言う意味で co- の接頭辞がつく。この定義は積の定義の矢印方向および合成順序をひっくり返して得られる。
対象$A,B$の**余積**とは、下記の公理を満たす3点セット $(D,p,q)$ のこと。
- 対象 $D$
- 射 $p:A\to D$ (第1射影)
- 射 $q: B\to D$ (第2射影)
公理:
任意の対象$C$と、任意の射の組 $f: A\to C$、$g: B\to C$ に対して、
ただ1本の射 $h: D\to C$ が存在して、~
$h\circ p = f$ かつ $h\circ q = g$ を満たす。
| 積 $D$ | 余積 $D$ |
| $p:D\to A$ $q:D\to B$ $f:C\to A$ $g:C\to B$ $h:C\to D$ $p\circ h=f$ $q\circ h=g$ | $p:A\to D$ $q:B\to D$ $f: A\to C$ $g: B\to C$ $h:D\to C$ $h\circ p=f$ $h\circ q=g$ |
余積構造を持つ写像 = 直和†
$\mathcal C$ での積が $\mathcal C^{\mathrm{op}}$ で余積に見える、というのはその通りであるが、それとは別に
$\mathcal C$ 内に余積構造を持つ写像を構成することも可能である。
$\alpha\in A,\beta\in B$ のとき、特殊な元 $\mathrm{null}$ を使って、
$D=A+B$ を $\set{(\alpha,\mathrm{null})}\cup\set{(\mathrm{null},\beta)}$ と定義し、
$p:\alpha\mapsto (\alpha,\mathrm{null})$
$q:\beta\mapsto (\mathrm{null},\beta)$
とする。
$h$ を、
- $A+B$ の元が $\alpha$ のみ含んでいるか、$\beta$ のみ含んでいるかを判別
- その結果をもとに適切に $f$ または $g$ を適用
- $f(\alpha)$ または $g(\beta)$ を返す
とすれば、$h\circ p=f,\ h\circ q=g$ が成り立つ。
$A,B$ の元をごちゃまぜに $A+B$ に突っ込んだところから、
それらを適切に分離して $A$ または $B$ の元を取り出す方法が一意に定まる、
というのが余積の構造であると読み取ることができる。
圏における積が対象の直積に相当するのに対して、
圏における余積は対象の直和に相当する。
積と余積とデータ構造†
- タプルやレコードは複数のデータ型の直積であり、圏論の積の構造を持つ
- タグ付きユニオン型(discriminated union、例えば`{tag:"A",value:A}|{tag:"B",value:B}`)は複数のデータ型の直和であり、圏論の余積の構造を持つ
- TypeScriptの素朴なユニオン型`A|B`は、AとBの構造が重なっていると由来の判別ができなくなる場合があり、その場合は余積にならない点に注意が必要
- python なら値自体が型情報を持っているからそれ単体で直和が表現される
このあたりまでは比較的単純だが、リストやツリーでは再帰的に型が定義され、単純な積や余積には見られない構造を持つ。これらを議論する準備として、以下では関手や不動点について学ぶ。
関手 (functor)†
関手はある圏 $\mathcal C(O, \mathrm{hom})$ から別の圏 $\mathcal C'(O', \mathrm{hom}')$ への間の写像 $\mathcal F=(\mathcal F_o,\mathcal F_m)$ で、
$\mathcal F_o:O\to O'$ → 対象を対象に移す
$\mathcal F_m:\mathrm{hom}(A,B)\to \mathrm{hom}'(\mathcal F_m(A),\mathcal F_m(B))$ ただし $A,B\in O$ → 射を射に移す
次の性質を持つもののことである。
$\mathcal C$ 全体を $\mathcal F$ で変換した構造がそのまま $\mathcal C'$ 上で部分圏 $\mathcal F(\mathcal C)$ を作り、さらに合成と恒等射を保つ。
$$ \mathcal F_m(g\circ f)=\mathcal F_m(g)\circ \mathcal F_m(f),\ \mathcal F_m(1_A)=\mathcal 1_{F_m(A)} $$
関手は $\mathcal C$ と $\mathcal C'$ とをつなぐ写像になるが、これは必ずしも $\mathcal C$ と $\mathcal C'$ とが、あるいは $\mathcal C$ と $\mathcal F(\mathcal C)$ とが同型 (後で定義する) であることを意味しない。
$\mathcal F$ が全射でなければ $\mathcal F(\mathcal C) \subsetneqq \mathcal C'$ であるし、
$\mathcal F$ が単射でなければ $\mathcal C$ の構造の一部は $\mathcal F(\mathcal C)$ の中で「つぶれて」しまう。
例えば $\mathcal F_o$ がすべての $A_i\in O$ を特定の $X\in O'$ に移す定数写像であり、
$\mathcal F_m$ がすべての $f\in\mathcal C$ を $X$ 上の恒等射 $1_X$ に移す定数写像であったとすれば、
$\mathcal C$ の対象と射の関係は(大幅につぶれてしまうものの)部分圏 $\mathcal F(\mathcal C)$ の中に対応関係を保ったまま埋め込まれる。
この例は「定数関手」と呼ばれる最も小さな部分圏を生む関手であり、 $\mathcal F(\mathcal C)$ には $\mathcal C$ の情報は何も残らないが、このようなものも関手の一つであるとされる。
特に射に関手を適用して、新しい件の上での射を得ることをしばしば「持ち上げる(lift)」と表現するようだ。
同型関手†
関手 $\mathcal F:\mathcal C\to \mathcal C'$ が逆関手 $\mathcal F^{-1}:\mathcal C'\to \mathcal C$ を持つ、
すなわち $\mathcal F\circ \mathcal F^{-1}$ や $\mathcal F^{-1}\circ \mathcal F$ が恒等写像になるように $\mathcal F^{-1}$ を構成できるとき、
関手 $\mathcal F$ は同型関手であり、$\mathcal C$ と $\mathcal C'$ は同型である、と言う。
逆関手が存在する条件は、通常の写像と同様に関手$\mathcal F$が全単射であることと同値である。
関手$\mathcal F$の性質は対象の写像$\mathcal F_o$と射の写像$\mathcal F_m$とに分けて考えられるが、
このうち射の写像$\mathcal F_m$については特別に、
写像 $\mathcal F_m$ が $\mathrm{hom}(A,B)\to \mathrm{hom}'(\mathcal F_o(A),\mathcal F_o (B))$ の写像として
- 単射であることを 忠実
- 全射であることを 充満
というように 忠実 および 充満 の語が定義されている。
「充満忠実な関手」と言うのは $\mathcal F_m$ が全単射であることと同値である。
関手$\mathcal F$が全体として全単射であるためには充満忠実に加えて対象の写像 $\mathcal F_o$ が全単射である必要がある。
(関手$\mathcal F$が同型関手) = (関手$\mathcal F$が逆写像を持つ) =
(関手$\mathcal F$が全単射) = (充満忠実 = $\mathcal F_m$ が全単射) + ($\mathcal F_o$ が全単射)
同値関手†
注目する部分圏に同型な対象が複数存在するとき、圏の「同型」を少し緩めた「同値」という概念が役に立つことがある。
「同型な対象」とは両者の間に射と逆射のペアが定義された2つの対象のことであった。対象が集合であるなら、両者の要素の間に全単射による一対一対応がある状況を思い浮かべると良い。
部分圏が同型な対象を複数含むとき、関手がそのどれを、相手のどれに対応付けるか、には任意性がある。
例題として、$\mathcal C$ が含む $A,B,C$ が互いに同型な対象であるとしよう。
これらをそれぞれ $\mathcal C'$ が含む $A',B',C'$ に対応させて同型関手になるならそれらも同型であるから、
$A\mapsto A', B\mapsto B', C\mapsto C'$ と対応付ける代わりに、
$A\mapsto B', B\mapsto C', C\mapsto A'$ と対応付けても同型な関手を作ることが可能ということ。
それをさらに進めて、
$A\mapsto A', B\mapsto A', C\mapsto A'$ のようにつぶしてしまっても本質的な構造は保たれるから、
こういう「同型よりも少し緩い対応付けの取れる圏同士」を「同値」と呼ぼう、という話。
逆に、
$\mathcal C$ には $A$ しかないが、
$\mathcal C'$ は $A$ に対応する $A'$ と同型な $B',C'$ も含むとする。
このとき、
$\mathcal C$ から $\mathcal C'$ へ延びる関手は $A\mapsto A'$ だけで、$B',C'$ に対応付けるための対象が不足するが、このときも同型を代表して $A'$ に対応付けられていれば $\mathcal C$ と $\mathcal C'$ 全体 ($B',C'$ を含む) とが同値である、と呼ぶ。
(こう定義することで「同値」が対称律を持つようになる)
自己関手†
圏を自分自身の上へ移す関手のこと。
具体例:リスト関手†
例えば、プログラム上の型を対象として、関数を射とする圏において、型 $A,B$ と射 $f:A\to B$ があるとしよう。
リスト関手$\mathcal F$ は任意の型をその型を要素とするリストに変換し、任意の射をリストを受け取り、個々の要素に射を適用して結果のリストを返す射に変換する。
- $\mathcal F_o(A)=\mathrm{List}\langle A\rangle$
- $\mathcal F_o(B)=\mathrm{List}\langle B\rangle$
- $\mathcal F_m(f)=(\mathrm{list}: \mathrm{List}\langle A\rangle)=>\mathrm{list.map}(f)$
- $\mathcal F_m(1_A)=1_{\mathrm{List}\langle A\rangle}$
- $\mathcal F_m(1_B)=1_{\mathrm{List}\langle B\rangle}$
みたいな。
このリスト関手 $\mathcal F$ は確かに任意の $A,B,f$ からなる小さな部分圏を $\mathrm{List}\langle A\rangle, \mathrm{List}\langle B\rangle, \mathcal F_m(f)$ からなる別の圏構造へその構造を保ったまま移す写像になっている。
圏が十分に広い範囲の射を含むケースにおいて、
この関手は忠実である: $f\ne g$ に対して $\mathcal F_m(f)\ne \mathcal F_m(g)$ が成り立つ
この関手は充満ではない: 各要素に同一の関数を当てはめる以外のずっと多くの射、例えば要素の入れ替えなどが考えられ、$\mathcal F_m(f)$ はそれらを覆いつくさない。
忠実性や充満性は圏がどういう射を含んでいるか次第であることには注意が必要だ。そもそも $f\ne g$ となるような射が存在しないなら $\mathcal F_m$ をどう定義したところで忠実。リスト間に適用可能な関数が map しか与えられていないなら充満になりうる。
双関手†
上で見た関手は $\mathcal C$ から $\mathcal C'$ への写像、つまり1つの圏から1つの圏への写像。
双関手は2つの圏から1つの圏への関手であるのだが、説明のまえに準備をしよう。
準備:積圏†
2つの圏$\mathcal{C}$と$\mathcal{D}$から、新しい圏$\mathcal{C}\times\mathcal{D}$(積圏)を以下のように作る。
- 対象:$\mathcal{C}$の対象$c$と$\mathcal{D}$の対象$d$のペア $(c,d)$
- 射:$(c,d)\to(c',d')$は、$\mathcal{C}$の射$f\colon c\to c'$と$\mathcal{D}$の射$g\colon d\to d'$のペア$(f,g)$
- 合成:成分ごとに合成する。$(f',g')\circ(f,g)=(f'\circ f,\ g'\circ g)$
- 恒等射:$(c,d)$の恒等射は$(1_{\mathcal C},1_{\mathcal D})$
2つの圏を「横に並べて、対象も射もペアにしただけ」のもの。
双関手†
双関手は2つの圏から1つの圏への写像であるが、
つまり積圏を始域とする通常の関手とみなすこともできる。
$\mathcal C\times \mathcal D\to \mathcal E$
積の双関手†
分かりやすい例は積の双関手。
この場合には $\mathcal C=\mathcal D=\mathcal E$ として、
任意の対象 $A,C$ とその間の射 $f:A\to C$
任意の対象 $B,D$ とその間の射 $g:B\to D$^
を考える。
さらにこの圏が $A\times B$ および $C\times D$ の積構造を含んでいるとして次のような絵を描くと、ここから下記の形の「積の双関手」を抽出できる。
$\mathcal F_o(A,B)=A\times B$
$\mathcal F_o(C,D)=C\times D$
$\mathcal F_m(f,g)=(a, b)\mapsto(f(a), g(b))$ これは $(A\times B)\to(C\times D)$ の写像
積構造 $A\times B$ および $C\times D$ には $A,B,C,D$ との間の射の存在が含まれているため、始めに $\mathcal C=\mathcal D=\mathcal E$ を仮定したのであった。このように、積の双関手は圏が積構造を含む際に初めから存在した構造を浮き彫りにしたものとみなせる。
余積の双関手†
同様に余積の双関手も作れる。
$\mathcal F_o(A,B)=A+B$
$\mathcal F_o(C,D)=C+D$
$\mathcal F_m(f,g)=A\text{の元なら} f \text{を、} B\text{の元なら} g \text{を適用}$ これは $(A+B)\to(C+D)$
これも余積の構造に付随して初めから存在する構造に名前を付けたものとみなせる。
これら積の双関手や余積の双関手の後ろに通常の(単項の)関手をつなぐことで、バラエティ豊かな一般の双関手を構成可能である。
反変関手・共変関手†
関手の $\mathcal F_m$ が射の向きをすべて逆転させるとき、反変関手という
今まで考えていた射の向きを保つ普通の関手は 共変関手という
$\mathcal C$ の反変関手による変換は $\mathcal C^{\mathrm{op}}$ の共変関手による変換と見做せる
プロ関手†
第1引数 $\mathcal C$ に反変、第2引数 $\mathcal D$ に共変な、Set圏を終域とする双関手をプロ関手という $$\mathcal C^{\mathrm{op}}\times\mathcal D\to\mathrm{Set}$$ なぜこんなものを考えるのか?
元々やりたいのは、
- $\mathcal C$ の射 $f_{ab}:A\to B$
- $\mathcal D$ の射 $f_{cd}:C\to D$
を元にして、
$f_{bc}:B\to C$ の前後に $f_{ab},f_{cd}$ を継ぎ足して $f_{ad}:A\to D$ に変換する射を生成するようなこと $$f_{bc}\mapsto f_{cd}\circ f_{bc}\circ f_{ab}=f_{ad}$$ $f_{cd}\circ f_{bc}\circ f_{ab}$ の接続により $A\to B\to C\to D$ として正しく計算可能になる。
この接続の演算は対象「$B\to C$ の任意の関数」から「対象 $A\to D$ の任意の関数」への射である。
これを 対象のペア $(B,C)$ から対象のペア $(A,D)$ への射 $(f_{ab}^{\mathrm{op}}, f_{cd})$ から生成する関手を考えているのだ。
| 関手の変換元 | 関手の変換先 | |
| 対象「ペア $(B,C)$」 | → | 対象「$B\to C$ の任意の関数」 |
| 対象「ペア $(A,D)$」 | → | 対象「$A\to D$ の任意の関数」 |
| 射 $(f_{ab}^{\mathrm{op}}, f_{cd})$ | → | 「$B\to C$ の任意の関数」から「$A\to D$ の任意の関数」への射 $g\mapsto f_{cd}\circ g\circ f_{ab}$ (関数の変換) |
変換先で必要となる情報が、正しく変換元から与えられていることを確認できる。
プロ関手で片側のみ双対をとる必要が生まれたのは、$(B,C),(A,D)$ のペアを作るためであったことが分かるはずだ。
プロ関手はこれを一般化した、
$\mathcal C^{\mathrm{op}}\times\mathcal D\to\mathrm{Set}$ の形を満たす変換のことなので、
以下の形をテンプレートとすると理解しやすい。
| 関手の変換元 | 関手の変換先 | |
| 対象「ペア $(B,C)$」 | → | 目的に応じて変換したもの |
| 対象「ペア $(A,D)$」 | → | 目的に応じて変換したもの |
| 射 $(f_{ab}^{\mathrm{op}}, f_{cd})$ | → | 目的に応じて変換したもの |
Hom関手†
圏 $\mathcal C(O, \mathrm{hom})$ から射の集合 hom を取り出す関手で、これは $\mathcal C$ 同士の間のプロ関手になる。 $$\mathcal C^{\mathrm{op}}\times\mathcal C\to \mathrm{Set}$$ 上の表を使うと関手の変換は以下のように理解できる。
| 関手の変換元 | 関手の変換先 | |
| 対象「ペア $(B,C)$」 | → | $B\to C$ の射の集合 $\mathrm{hom}(B,C)$ |
| 対象「ペア $(A,D)$」 | → | $A\to D$ の射の集合 $\mathrm{hom}(A,D)$ |
| 射 $(f_{ab}^{\mathrm{op}}, f_{cd})$ | → | 射 $g\mapsto f_{cd}\circ g\circ f_{ab}$ $B\to C$ から $A\to D$ への射の変換 |
プロ関手の説明で「こういうことがしたい」とかいていたものそのままが Hom 関手と思ってOK。
関数対象†
その意味するところ†
関数対象$A\Rightarrow B$とは、対象 $A,B$ を含む圏に存在する1つの対象であって、対象$A$から$B$への射の集合そのものであるか、あるいは対象$A$から$B$への射と一対一に対応する要素(個々の射に付けたラベルのようなもの)を集めた集合、であることを想定して作られた存在だ。 特定の圏が実際にそういうものを含むかどうか、あるいはそれがどのように射と対応するか、あたりも含めて以下で説明する。
まず、Set圏はすべての集合を対象として含む圏だった。
任意の集合間の写像を集めた hom は集合になるから、
Set圏の任意の hom はそれ自身Set圏に対象として存在する。
だからこれをそのまま関数対象見做せる。
一方、その他の圏では hom 集合自体が対象として存在する保証がないため、関数対象は射自身を集めたものではなく、射と一対一に対応するラベルを集めた集合であっても構わない。
公理化の方針†
以下ではこの「関数対象」に普遍的な公理(要素に言及せず射の性質のみで記述された公理)を与える。実のところ、そのような圏論的な定義は関数対象$A\Rightarrow B$ の内部構造に踏み込まないので、その要素が何であるかという上記のような話は本質的ではなくなる。
またこの公理は「圏の中に関数対象を作り出そう」とするものではない。すでに圏の全体像は決まっているものとして、その圏の個々の対象に対して、その対象が「関数対象$A\Rightarrow B$ と見做せるものであるかどうか」を判別する手段を与えるものである。
この公理、かなり複雑なので順を追って説明する。
公理の実体†
考える関数(射)の始域を $A$、終域を $B$ として、これらは圏に含まれるとする。
関数対象の候補を $Z$ とすると、関数に始域$A$の値を与えて評価し、終域$B$の値を得る手順は、具体的な関数(のラベル) $z\in Z$ と、そこに与える引数 $a\in A$ を受け取って、そこから返り値 $b\in B$ を計算して返すことに相当する。
関数対象の公理ではこの手順を $Z\times A$ から $B$ への射(評価射と呼ばれる) $g:Z\times A\to B$ と同一視するため、そもそも圏に積 $Z\times A$ が含まれないような $Z$ は始めから関数対象の候補から外してしまう。
一般には関数対象は単なるラベルなので、その評価射 $g$ とセットで初めて演算の内容が定義される。そこで以下では候補探しは $Z,g$ をセットで考える。
$Z\times A$ が存在し、評価射の候補 $g:Z\times A\to B$ が存在すれば、$Z,g$ は関数対象とその評価射の候補になる。そして、ある特定の候補が圏に含まれる任意の候補を下記の意味で「過不足なく生成可能」であるとき、それこそが関数対象$A\Rightarrow B$ および評価射 $\mathrm{eval}$ であるとするのがこの公理である。そのような候補は複数あっても構わないが、それらはすべて同型となるため、関数対象$A\Rightarrow B$は同型を除いて一意に決定される。逆にそのような候補がないとき、その圏には関数対象$A\Rightarrow B$は存在しない。
関数対象とその評価射の候補 $Z',g'$ が別の候補 $Z,g$ から「過不足なく生成可能」とは、
$$g'=g\circ(h\times 1_A)$$
を成り立たせる
$$h:Z'\to Z$$
が 「ただ一つだけ」 存在すること、として定義される。
これだけだと難しいので、以下では集合の言葉を使って解釈しよう。
$g'=g\circ(h\times 1_A)$ の意味†
等号で結ばれた2つの射に $(z',a)\in Z'\times A$ を与えると、$$g'(z',a)=g\circ(h\times 1_A)\,(z',a)$$ となる。
- 左辺は $g'$ がそのまま $z'\in Z'$ を使って $a\in A$ を評価する射
- 右辺は $(h(z'),a)$ に変換してから $g$ に渡すという合成射
つまり $g$ が $z=h(z')$ で $a$ を評価する射
これら2つが等しいという主張。
言い換えれば、$z$ と $h(z')$ が同じ関数を表すということ。
なぜこの条件を $Z,g$ が $Z',g'$ を過不足なく生成可能と言うのか?
過不足なく生成可能†
上の条件を成り立たせる $h$ の存在は、
任意の $z'\in Z'$ に対してそれと一致する関数 $h(z')$ が $Z$ に含まれていることを意味する
そして、そのような $h$ が複数存在するとしたら、
ある $z'\in Z'$ に一致する関数 $h_1(z'), h_2(z'), \dots$ が2つ以上 $Z$ に含まれており、そのうちどれ対応させてもよい、ということになる。すなわち $Z$ 内に同じ関数が複数含まれていることに対応する。
だから、そのような $h$ が「ただ1つ存在する」という主張は任意の $z'\in Z'$ に対して、それと一致する関数が $Z$ にただ一つ含まれている、と読み替えられて、これが候補 $Z',g'$ が別の候補 $Z,g$ から「過不足なく生成可能」の意味である。
すべての候補を過不足なく生成可能†
すべての候補を「過不足なく生成可能」な $Z,g$ が見つかったならそれらを $A\Rightarrow B,\mathrm{eval}$ と書き、関数対象とその評価射と呼ぶ。
上記の公理により、$A\Rightarrow B$ には圏が持つ任意の $Z\times A$ と、$\mathrm{hom}(Z\times A,B)$ に含まれる任意の評価射の組み合わせで表現しうるすべての$A\to B$関数から、重複を取り除いたうえですべて1つずつ含まれていることが保証される。
追加で必要な条件†
ここまで来て何なのだが、実はここまでの議論には致命的な欠陥がある。
すぐ上で次のように書いた。
上記の公理により、$A\Rightarrow B$ には圏が持つ任意の $Z\times A$ と、$\mathrm{hom}(Z\times A,B)$ に含まれる任意の評価射の組み合わせで表現しうるすべての$A\to B$関数から、重複を取り除いたうえですべて1つずつ含まれていることが保証される。
上記公理が $A\Rightarrow B,\mathrm{eval}$ に保証するのは本当にこれだけなのだ。
何が欠けているかと言うと、「候補たちが表現していた関数」 が 「実際の$\mathrm{hom}(A,B)$と対応しているかどうか」 について一切言及されていないのだ!
これは本当に致命的なのであるが、上記の公理に
「圏が終対象 $1$ およびその積 $1\times A$ を含むこと」という新たな仮定を加えると、
関数対象 $A\Rightarrow B$ が(圏論の意味で)正しく $\mathrm{hom}(A,B)$ と一対一に対応し、
その射を評価射 $\mathrm{eval}$ により再現できることが保証される。
(圏論の意味で)の注釈については下記証明を参照。
デカルト閉圏†
そこで、この仮定に、さらに、「関数対象の存在」まで追加で保証した圏、つまり(終対象+任意の対象の積+任意の対象間の関数対象)を全部備えた圏には **デカルト閉圏 (Cartesian closed category)** という名前がついており、関数対象に関する議論ではほぼ常にデカルト閉圏が暗黙のうちに仮定される。




