この記事では, 5つの圏の定義とCoqによる圏の実装を解説します.
記事内のCoqのソースコードにライブラリは必要ありません.
なお, 記事内のソースコードではポーランド記法(演算子を一番前に書く書き方)を使うので注意してください.
定義を区別するために以降「~バージョン」という表現を使いますが, 本文内のみの用語であることに注意してください.
一番わかりやすいと思われる定義からします.
論理式$-:O,\ -\colon -\to -$と項$- \circ -$が次を満たすとき$(O,\to,\circ)$を圏とよぶ.
$X:O$を「$X$は対象」と読み, $f\colon X\to Y$を「$f$は$X$から$Y$への射」と読む.
$\circ$を合成とよぶ.
以下, Coqによる実装です.
Definition category
(O : Set -> Prop) (M : Set -> Set -> Set -> Prop) (o : Set -> Set -> Set) :=
(forall f g X Y Z : Set, O X -> O Y -> O Z ->
M f X Y -> M g Y Z -> M (o g f) X Z) /\
(forall f g h W X Y Z : Set, O W -> O X -> O Y -> O Z ->
M f W X -> M g X Y -> M h Y Z -> o (o h g) f = o h (o g f)) /\
(forall X : Set, O X -> exists i : Set, M i X X /\
(forall f Y : Set, O Y -> M f X Y -> o f i = f) /\
(forall f Y : Set, O Y -> M f Y X -> o i f = f)) /\
(forall f X Y X' Y' : Set, O X -> O Y -> O X' -> O Y' ->
M f X Y -> M f X' Y' -> X = X' /\ Y = Y').
合成$\circ$以外を1変数で圏を定義する方法です.
これは$f\colon X\to Y$を矢印$f$と, 矢印の根本$X$, 矢印の先$Y$の3つに分けて定義しているようなイメージです.
論理式$-:O,\ -:M$と項$- \circ -,\ D(-),\ C(-)$が次を満たすとき$(O,M,\circ,C,D)$を圏とよぶ.
$X:O$を「$X$は対象」, $f:M$を「$f$は射」と読む.
$\circ$を「合成」, $D(f)$は「$f$の始域」, $C(f)$は「$f$の終域」とよぶ.
以下, Coqによる実装です.
Definition category_1
(O M : Set -> Prop) (o : Set -> Set -> Set) (D C : Set -> Set) :=
(forall f : Set, M f -> O (D f) /\ O (C f)) /\
(forall f g : Set, M f -> M g -> C f = D g ->
M (o g f) /\ D (o g f) = D f /\ C (o g f) = C g) /\
(forall f g h : Set, M f -> M g -> M h ->
C f = D g -> C g = D h -> o (o h g) f = o h (o g f)) /\
(forall x : Set, O x -> exists i : Set, M i /\ D i = x /\ C i = x /\
(forall f : Set, M f -> D f = x -> o f i = f) /\
(forall f : Set, M f -> C f = x -> o i f = f)).
矢印バージョンから対象を消したバージョンです.
論理式$-\colon -\to -$と項$- \circ -$が次を満たすとき$(\to,\circ)$を圏とよぶ.
以下, Coqによる実装です.
Definition category_morphism
(M : Set -> Set -> Set -> Prop) (o : Set -> Set -> Set) :=
(forall f g x y z : Set,
M f x y -> M g y z -> M (o g f) x z) /\
(forall f g h w x y z : Set, M f w x ->
M g x y -> M h y z -> o (o h g) f = o h (o g f)) /\
(forall f x y : Set, M f x y ->
M x x x /\ M y y y /\ o f x = f /\ o y f = f) /\
(forall f x y x' y' : Set, M f x y -> M f x' y' -> x = x' /\ y = y').
1変数バージョンから対象を消したバージョンです.
論理式$\ -:M$と項$- \circ -,\ D(-),\ C(-)$が次を満たすとき$(M,\circ,C,D)$を圏とよぶ.
以下, Coqによる実装です.
Definition category_1_morphism
(M : Set -> Prop) (o : Set -> Set -> Set) (D C : Set -> Set) :=
(forall f g : Set, M f -> M g -> C f = D g ->
M (o g f) /\ D (o g f) = D f /\ C (o g f) = C g) /\
(forall f g h : Set, M f -> M g -> M h ->
C f = D g -> C g = D h -> o (o h g) f = o h (o g f)) /\
(forall f : Set, M f -> M (D f) /\ M (C f) /\
D (D f) = D f /\ C (D f) = D f /\
D (C f) = C f /\ C (C f) = C f /\
o f (D f) = f /\ o (C f) f = f).
最後に, 合成可能対による対象なしの圏を定義します.
直感的には, 矢印の繋がりに注目した定義です.
論理式$C(-,-)$, 項$- \circ -$が次を満たすとき$(C,\circ)$を圏とよぶ.
$C(g,f)$を「$g$と$f$は合成可能対」と読む.
$\circ$を「合成」とよぶ.
以下, Coqによる実装です.
Definition category_composable
(C : Set -> Set -> Prop) (o : Set -> Set -> Set) :=
(forall g f : Set, C g f -> exists h : Set, C (o g f) h) /\
(forall h g f : Set, C h g -> C g f ->
C h (o g f) /\ C (o h g) f /\ o (o h g) f = o h (o g f)) /\
(forall h g f : Set, C h g -> C (o h g) f -> C g f) /\
(forall h g f : Set, C g f -> C h (o g f) -> C h g) /\
(forall f : Set, (exists h : Set, C f h) ->
exists i j : Set, C f i /\ C j f /\
(forall g : Set, C g i -> o g i = g) /\ (forall g : Set, C i g -> o i g = g) /\
(forall g : Set, C g j -> o g j = g) /\ (forall g : Set, C j g -> o j g = g)).
矢印バージョンの圏の定義には次の式が含まれていました.
$\forall X,\ Y,\ X',\ Y':O\ \forall f\colon X \to Y\ (f\colon X' \to Y' \Rightarrow(X = X' \wedge Y = Y'))$ …… ①
①は始域, 終域の well defined, つまり矢印の根本と先が一つに決まること意味しています.
①がないと始域, 終域が複数ある可能性があり, 他の定義との等価性を示すときに構造が戻らない, hom関手が定義できないなどの影響があります.
①が成り立つかわからない状況から, 順序対を使って①が成り立つように修正する方法もありますが, その場合, 矢印と合成の構造が変わり, 射が増えます.
矢印バージョンの圏の定義には次の式が含まれていました.
$\forall X:O\ \exists i\colon X\to X\ \\ ((\forall Y:O\ \forall f\colon X\to Y\ f \circ i = f) \wedge (\forall Y:O\ \forall f\colon Y\to X\ i \circ f = f))$ ......②
対象$X$について, ②に現れる$i$はただ一つ存在します.
この$i$を$X$の恒等射とよび, $1_X$と書きます.
対象がある圏では, 対象と恒等射の間に一対一対応があることを示せます.
たとえば, 単射性は次を示すことになります.
$\forall X,\ Y:O\ (1_X = 1_Y \Rightarrow X = Y)$
証明には始域, 終域の一意性①を使う必要があります.
これにより「恒等射を対象と思ってよい」というわけです.
矢印バージョンの圏の定義のCoqのソースコードを見ると次のように書かれているところがあります.
(O : Set -> Prop) (M : Set -> Set -> Set -> Prop) (o : Set -> Set -> Set)
forall f g X Y Z : Set, O X -> O Y -> O Z ->
M f X Y -> M g Y Z -> ...
実装は普通の一階述語論理+ZF(C)を想定していますから, (集合)$ : O$や(集合)$ \colon $(集合)$ \to $(集合)の形でなければ文法エラーです.
少し誤解を招く言い方をしなければいけなかったので, 対象が群のときを例にあげます.
整数全体$\mathbb{Z}$と整数のたし算$+_\mathbb{Z}$について, $\mathbb{Z}$と$+_\mathbb{Z}$は集合より順序対$(\mathbb{Z},+_\mathbb{Z})$は集合です.
よって$(\mathbb{Z},+_\mathbb{Z}):$群と書くことができます.
一方, 集合全体$\bf V$は集合ではないので$\bf V:$群は文法エラーとなり, 正しい間違い以前に, 意味のない文字列です.
圏の圏や関手圏などを考えるときに, 上記のような文法が効いて, 圏が「小さい」という概念を考えないといけない局面があります.
普段は圏が小さいなどを気にしなくても問題ないように感じるかもしれませんが, Coqのようなプログラミング言語で圏論をすると文法エラーで詰まるところが多いかもしれません.
個人的には矢印バージョンか, 射のみ矢印バージョンをオススメしています.
直感的ですし, パラメーターも少ないので圏かどうかの確認も簡単です.
もちろん, どの定義を選ぶかは自由ですし, それぞれの定義が等価であることも示せます.
好みに合った定義を使ってください.