読者です 読者をやめる 読者になる 読者になる

北海道苫小牧市出身の初老PGが書くブログ

永遠のプログラマを夢見る、苫小牧市出身のおじさんのちらしの裏

私のHom関手暗記法

圏論勉強会 第4回のHom関手で悲鳴が上がってたので補足してみる。

Hom関手がなんであるかは@9_tiesさんもおっしゃっていたようにひたすら手を動かすしかなくて、圏論を覚えたいのであればしっかりと復習する必要がある部分なのは間違いない。とは言え、効率のよい暗記法を編み出すことは大いに理解の助けにはなるだろう。

Hom関手は個人的には以下のように双関手として覚えている。まず、どこからどこの関手かをしっかり覚える。ドメイン側が反変になるのがポイントだ。

  • Hom(-, -) : C^op × C → Sets *1

これがどういう関手かだが、ざっくりとC^op×Cの対象(A, B)をHom(A, B)へ、C^op×Cの射(f, g)をHom(f, g)へ移す、と覚えてしまってよい。後は、Hom(A, B)とHom(f, g)がなんなのかわかっていれば、Hom関手の定義をすぐ思い出すことができる。

Hom(A, B)については今日の勉強会で集中して説明があったので言及は必要ないだろう。AからBへ向かう射の集合である。

問題となるのはf:A1←A2, g:B1→B2の移り先であるHom(f, g)の方。まず、これはSetsの射なのでHom(A1, B1)→Hom(A2, B2)なる関数だ。そして、定義は以下のようになる。

  • Hom(f, g) (h) = f;h;g

つまり、渡された関数を2つの射で単純に挟み込む、と覚えられる。;は合成.の反対を表す記号で、f;g = g.fで定義する。C言語を触ったことがあるプログラマであれば、 f(); h(); g(); のように順番に射をつなげることを表す表記と思えばよい。この定義で型があうことは、fが双対圏の射であることに気をつければ、hがHom(A1, B1)の要素であることから簡単に確かめられるだろう。


さて、今日の勉強会ではHom(X, -)のような関手が出てきたので、ここまで述べた暗記法で射f:A→Bの行き先を調べると Hom(X, f)となってしまって、暗記法のパターンにうまくあてはまらず使えないように思える。しかし、ちょっと自明な読み替えさえすれば、そんなことはない。

圏論ではよく、射id_AのことをAと対象と同じ記号で表記する。1つの対象について必ず一つの恒等射が存在するので、この記法で矛盾は生じない。Hom(X, f)のXがこの記法によって書かれていると思えば、先の暗記法が使える。XはC^opの射なので、X = id_X:X←Xと思える。

  • Hom(X, f) (h) = Hom(id_X, f) (h) = id_X;h;f = f . h . id_X = f . h

つまり、Hom(X, f) = (f .) となり、勉強会と同じ結果となった。

反変関手 Hom(-, X)も同じように上述の暗記法で表現できる。まとめると、「Hom(f, g)というモノはfとgで引数の射hを挟み込む関数」ということさえ覚えていれば、Hom関手の定義について復元が十分可能であり、これを以てHom関手をマスターしたといっても過言ではない。

*1:Hom_Cと書いたほうがいいけど冗長なので省略