Pythonは辞書(dict)ってのを使っているけど、キーが文字列じゃないのに辞書というのはちょびっと違うかも、という気が少しするけど、Hashよりは圧倒的にましだと思う。値群とキー群の格元の対応付けという意味では、数学的には関数と呼ぶのも正しい気がするけどそれはまた混乱を呼ぶ。
https://twitter.com/shibu_jp/status/471445247973527553まぁ、map(射)が一番無難な気がする。
https://twitter.com/shibu_jp/status/471445639964815360
Pythonの辞書は例えば {'a': 10, 'b': 20}
のようなkeyとvalueの組の集合ですが、当然この例ではString全域で定義されてないのでこのdictは写像(函数)ではありません。
しかしこれをどうにか射と呼べないかと思って色々考えてまとめてみました。
勝手に考えたことなので以下には重大な誤りが含まれている可能性があります. 見つけたらコメント等で指摘してください.
Dict圏
以下, 型と呼べばPythonのビルトインなクラスのインスタンスの集合を考え, それ以外の(自作クラスなどの)インスタンスなどはひとまず考えないことにする.
辞書のkeyとvalueの型を固定する. すなわち, keyとvalueの集合はPythonの標準的な型(Bool, Int, Str, [Int], ...)であって, 型1つのみである.
keyが型$A$, valueが型$B$であるような辞書は自然にこれらの直積の部分集合と同一視し, さらに辞書は$A \to B$なる写像の部分グラフとみなすこともある.
このとき、以下を Dict圏 とよぶ.
- 対象: Pythonの型
- 射: $f:X \to Y$がDict圏の射であるとは, $f$は$X$をkey, $Y$をvalueとする辞書である.
- 射の合成: $f:X \to Y$, $g:Y \to Z$が与えられたとき, $g \circ f:X \to Z = [(x,z); \exists y: (x,y) \in f, (y,z) \in g]$と定める. これは値の合成が可能なものは合成しそれを集めた辞書である.
これは自然に圏の構造をもつ. 任意の対象$X$に対し$1_X = [(x,x); x \in X]$(これは写像として恒等写像$X \to X$のグラフである)が恒等射である.
性質
$A,B$を型, $f,g:A \rightrightarrows B$を平行射とする. このとき以下は明らかである.
- terminal object: terminal objectが存在すれば,
N = {}
のような元を持たない型である. このとき任意の型からの一意的な射{}
がのびる. - product: $A \times B$とは, 集合としての直積である. PythonではこれはAとBのタプルとして定義されている. $p_A = [((a,b), a); a \in A, b \in B]:A \times B \to A$は射影であり, 任意の対象と射の組$Z, z_A, z_B$に対しUMPから導かれる射$h$は $h = [(z,(a,b)); \exists z. (z,a) \in z_A, (z,b) \in z_B \wedge \exists z. (z,a) \in z_A, b \in B \wedge \exists z. (z,b) \in z_B, a \in A]$となる. (この$h$は, $z_A$における組と$z_B$における組の和集合をとったものである. ただし共通の$z$に対して組が存在すればそれらの組を対応させ, 存在しなければそれは$A,B$から適当に取ってきて作ることとする. こうして定まる$h$は図式を可換にする射である.)
- equalizer: $f,g$のequalizer $(E,e:E \to A)$ は $E = [ a \in A; \exists v: (a,v) \in f, (a,v) \in g ] $, $e = [(a,a); a \in E] $ である.
productやequalizerはSetと同様に構成が可能である. ただしここでは射の記述に辞書の言葉を用いた. また, pullbackの存在は以下で保証される.
Fact. 圏$\mathscr{C}$がterminal object, binary product, equalizerを持てば有限極限をもつ.
よってDict圏は有限極限を持つことが分かった.
- exponential: $Z^X$は$X$から$Z$への射全体である. このとき, evaluationは次のような辞書である: $e = [((f,x), z); \exists (x,z) \in f]$. すなわち, $f$と$x$に対し, $f(x)$が存在すれば$(f,x) \mapsto f(x)$とする. そういう対応が存在するものをすべて集めたものがevaluation arrowとなる. このとき$f: Y \times X \to Z$に対し, UMPから誘導される射$h$とは, $h = [(y,[(x,z)]); ((y,x),z) \in f]$である.
よってDict圏はCCC(Cartesian Closed Category)である.
コメント
割と$\mathbf{Set}$と同じ感じで構成できるのが面白かったけれど、普遍的に存在して可換になるとかはちゃんと確認しないとすぐには分からないものが多かったイメッジ。あとこの圏(と同型な圏)には名前ついてないんだろうか。
また面倒なんでやってないけどelementary toposであるのも示せる気がします。それはまぁ演習ってことで(適当)。
まとめ: Pythonのdictを射と呼ぶのは余計混乱するからやめよう。あと、少なくともmap(写像)ではない。