集合、図形、命題、コンピュータプログラムは、普通なら別々の教科に置かれます。集合には要素があり、図形には形があり、命題には真偽があり、プログラムは計算を実行します。材料も目的も違うため、一つの理論で扱うと聞けば、細かな違いを捨てて無理に似せるように思えるかもしれません。
圏論が共通化するのは、中身ではなく構成の仕方です。どの世界にも何らかの対象があり、対象から対象へ移る変換があり、変換をつなげる合成と、何も変えない恒等射があります。集合なら関数、位相空間なら連続写像、命題なら推論、プログラムなら型の合う関数が矢印です。対象よりも矢印を見ることで、異なる世界が「変換を組み立てる」という同じ舞台に上がります。
同じ舞台に上がるための共通文法
舞台を用意する条件は多くありません。対象を定め、どの対象からどの対象へ射を引けるかを決めます。向きの合う射は合成でき、その括り方を変えても結果は同じ。すべての対象には恒等射があり、射の前後に合成しても何も変わりません。この条件を満たせば、対象が集合でも空間でも命題でも、一つの圏として扱えます。
ここで「同じ舞台」という表現を、「同じ種類のものになる」と受け取ってはいけません。集合が命題へ変わるわけでも、図形がプログラムへ還元されるわけでもないからです。俳優が違う役を演じながら、登場、受け渡し、退場という舞台上の規則を共有するように、各分野は独自の意味を保ったまま、対象・射・合成・恒等射という文法を共有します。
しかも、射はどのような変換でもよいわけではありません。その世界で重要な構造を壊さない変換が選ばれます。集合では要素の対応、位相空間では連続性、論理では妥当な推論、型付きプログラムでは型の整合性が必要です。矢印の意味が世界ごとに変わるのは、保存したいものが違うためなのです。
集合の要素を別の集合へ送る関数
集合を対象、集合間の関数を射とする圏は、一般に Set と書かれます。関数 f: A → B は、集合Aの各要素に対して、集合Bの要素を一つずつ割り当てます。自然数を偶数へ送る f(n) = 2n も、人の集合から誕生日の日付の集合へ送る対応も、始域と終域を持つ関数です。
関数 f: A → B と g: B → C は、通常の関数合成によって g ∘ f: A → C になります。Aの要素をまずBへ送り、その結果をCへ送るわけです。各要素をそのまま自分自身へ返す恒等関数もあります。関数合成は結合律を満たすため、集合と関数は圏の基本例になります。
Setでは、関数が各要素をどこへ送るかが重要です。同じ始域と終域を持つ二つの関数が、すべての入力に対して同じ出力を返すなら、式やプログラムの書き方が違っても同じ関数とみなされます。集合の世界が矢印に託しているのは、要素から要素への対応です。距離、近さ、演算といった追加の構造は、まだ要求されていません。
位相空間の形を壊さず移す連続写像
位相空間は、集合に「どの部分集合を開集合とみなすか」という情報を加えたものです。開集合の組み合わせによって、点どうしの近さや、切れ目なく動けるという感覚を、距離に頼らず表せます。位相空間の圏 Top では、対象は位相空間、射は連続写像です。
写像 f: X → Y が連続であるとは、Yの任意の開集合をfで逆向きにたどった集合が、Xでも開集合になることです。集合としては立派な関数でも、この条件を満たさなければTopの射にはなれません。Setでは許された矢印の一部だけを残し、空間の連続性を尊重する変換に絞っているのです。
粘土で作った円を切らずに楕円へ変形する様子は、連続写像の直感的な例になります。ただし、圏論で扱う連続写像は、必ずしも変形後から元へ戻せるものではありません。円周全体を一点へつぶす定数写像も連続です。形を壊さないという日常語だけでは狭すぎるため、開集合の逆像という条件が正確な境界を与えます。
同じ台集合でも位相が違えば矢印が変わる
位相空間の例は、対象より矢印を見る意味を鮮明にします。同じ点の集合Xにも、すべての部分集合を開集合とする離散位相と、空集合とXだけを開集合とする密着位相を入れられます。要素の一覧は変わりません。それでも、どの写像が連続になるかは大きく変わります。
離散位相を持つXから任意の位相空間Yへの写像は、すべて連続です。Yの開集合を逆にたどって得られる部分集合が、離散位相では必ず開いているからです。反対に、任意の位相空間から密着位相を持つXへの写像もすべて連続になります。終域Xに調べるべき開集合が、空集合とXしかないためです。
同じ集合を土台にしていても、入ってくる射と出ていく射の様子が変われば、位相空間としての性格は違います。圏論は、点の集合だけを見て二つを同じとはしません。どの写像が構造を保つかを通して、対象に加えられた位相を捉えます。矢印は対象の外側に付いた線ではなく、対象が持つ構造を検査する装置でもあるのです。
命題を結ぶ「ならば」という推論
論理の世界では、命題を対象、ある命題から別の命題を導く推論を射とみなせます。命題Pから命題Qを証明できるとき、矢印 P → Q を引きます。さらにQからRを導けるなら、二つの推論をつないでPからRへ進めます。推論の連鎖が、そのまま射の合成になるわけです。
「すべての正方形は長方形である」から「この正方形は長方形である」を導き、「すべての長方形は四角形である」と組み合わせれば、「この正方形は四角形である」へ進めます。途中の命題を経由した二段階の推論が、一つの推論にまとまります。命題PからP自身を導く自明な推論は恒等射です。
ただし、何を同じ推論とするかによって圏の作り方は変わります。PからQが導けるかどうかだけを記録するなら、二つの命題の間の射は高々一本です。証明方法の違いは消え、「PならばQ」という順序関係だけが残ります。このように対象間の射が高々一本しかない圏は、薄い圏と呼ばれます。
証明の違いを残す論理の圏
一方、証明そのものを射として扱えば、同じPからQへ至る複数の証明を区別できます。直接証明、背理法、補題を経由する証明が、どの条件で同じ証明とみなされるかを考えなければなりません。ここでは「推論が可能か」だけでなく、「どのような証拠によって可能なのか」が圏の情報になります。
この違いは、論理を圏論で扱う際の重要な分岐です。真偽だけを見れば、証明の内容は消えても困らない場合があります。証明を計算として解釈したい場合には、どの証明を選んだかが実行方法の違いにつながるでしょう。命題を対象、推論を射と呼ぶだけでは圏は一つに決まりません。射の同一性まで定めて初めて、どの論理的情報を残すのかが明らかになります。
圏論が論理へ持ち込むのは、単なる矢印の記法ではありません。前提から結論への移行を合成可能なものとして扱い、証明の置き換えや同一性を調べる枠組みです。複雑な証明を部分に分け、局所的な推論をつないで全体を作る。その構成原理が、関数や連続写像の合成と同じ文法で表されます。
型を対象、関数を射とするプログラムの世界
型付きプログラミングでは、型を対象、型の間の関数を射として考えられます。整数型から文字列型へ変換する関数、文字列型から真偽値型へ変換する関数があれば、二つを合成して整数型から真偽値型への処理を作れます。最初の関数が返す型と、次の関数が受け取る型が一致することが、射をつなぐ条件です。
たとえば、整数を文字列に変える toString と、文字列が空かどうかを判定する isEmpty を合成すれば、整数を受け取って真偽値を返す関数になります。順番を逆にしようとしても、isEmptyの出力である真偽値をtoStringの入力として受け取れるとは限りません。型検査が拒む接続は、圏論の言葉では終域と始域が一致しない合成です。
値をそのまま返す恒等関数 identity(x) = x も、プログラムの世界に自然に現れます。処理の前後へ入れても結果が変わらないため、変換の連鎖を組み立てる際の単位になります。小さな関数を合成して大きな処理を作る関数型プログラミングが圏論と親和的なのは、この対象・射・合成・恒等射が、コードの構造として見えやすいためです。
現実のプログラムが単純な関数ではない理由
ただし、実用プログラムをすべて「型の間の関数」と呼べば済むわけではありません。処理が停止しないことがあり、例外を投げ、ファイルを変更し、ネットワークへ接続し、実行のたびに異なる結果を返すこともあります。入力に対して必ず一つの出力を返す純粋な全域関数とは、振る舞いが違います。
こうした効果を無視して普通の関数として合成すると、実行順序や状態変化という重要な情報が消えてしまいます。そこで理論計算機科学では、部分的な計算、状態、例外、入出力などに応じて、対象や射、合成の仕方を設計し直します。モナドやクライスリ圏といった概念は、そのための代表的な道具です。
ここでも、圏論は現実を一つの型へ押し込めてはいません。むしろ、プログラムのどの性質を保存したいのかを問い、その答えに合う矢印を選びます。同じ型シグネチャーを持つ二つのプログラムでも、終了性、例外、外部への作用まで比べるなら、同じ射と判断できない場合があります。プログラムの同一性は、観察する振る舞いの範囲と切り離せないのです。
四つの世界で変わる対象・射・保存される構造
集合
- 対象
- 集合
- 射
- 関数
- 守るもの
- 要素の対応
位相空間
- 対象
- 位相空間
- 射
- 連続写像
- 守るもの
- 連続性
命題
- 対象
- 命題
- 射
- 推論・証明
- 守るもの
- 論理的妥当性
プログラム
- 対象
- 型
- 射
- 型の合う関数
- 守るもの
- 型と計算の意味
共通するのは最下段の骨格です。各分野で射が何を意味し、何を保存するかは上段のように異なります。
図の四つの欄は、同じ単語を別名で言い換えたものではありません。関数が連続写像になるには追加条件が必要で、推論とプログラムにもそれぞれ固有の同一性があります。圏論が取り出すのは、射の具体的な意味ではなく、射に向きがあり、合成と恒等射が一貫して働くという骨格です。
そのため、ある世界で成り立つ事実が、別の世界でも自動的に真になるわけではありません。圏の公理だけから証明された事実は広く移せますが、要素、開集合、証明規則、実行結果に依存する事実は、それぞれの分野で確かめる必要があります。共通文法があることと、内容まで共通であることを分ける慎重さが欠かせません。
合成と恒等射が分野を越えて残る理由
四つの世界に共通するのは、変換を続けて適用できることです。関数を合成し、連続写像を合成し、推論を連鎖させ、型の合うプログラムを接続します。どの場合も、二段階の変換は始点から終点への一つの変換として扱えます。しかも三段階以上になっても、括り方によって結果は変わりません。
恒等射も同じ役割を担います。集合の要素をそのまま返し、位相空間の点を動かさず、命題を自分自身から導き、プログラムの入力を変更せず返します。「何もしない」という操作を正式な射に含めることで、ゼロ段階の変換と多段階の変換が同じ体系に収まります。
この二つの規則が残るのは、圏論が変換の中身より、組み立て可能性へ注目しているからです。部品としての射を合成し、大きな構成を作る。不要な場所には恒等射を置き、全体の型をそろえる。数学の証明、論理の推論、プログラムの設計が同じ図式で表せるのは、いずれも小さな変換から大きな変換を構成する営みだからなのです。
分野の違いを残したまま構造を比較する圏論
圏論の統一は、集合、空間、論理、計算を一種類の実体へ還元する統一ではありません。各分野で何を対象とし、どの変換を正当と認めるかを明示したうえで、変換の組み立て方を比較します。違いを消さないからこそ、連続性や妥当性、型安全性といった固有の構造が矢印に現れます。
この見方を身につけると、新しい圏に出会ったときの問いが定まります。対象の名前だけで判断せず、射は何か、何を保存するのか、どの射を同じとするのか、合成は何を意味するのかを確かめます。その四点が分かれば、見慣れない分野でも圏としての輪郭が見えてきます。
集合の関数、空間の連続写像、命題の推論、プログラムの関数は、具体的には別のものです。それでも、始域と終域を持ち、合成でき、恒等射を備えるという関係の形は共通しています。圏論が提供する舞台は、異なる世界を同じ色に塗る場所ではありません。それぞれの違いを保ったまま、構造の似方を正確に比較できる場所なのです。