このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

圏論番外:集合ベースの直積と直和

入門シリーズは途絶えて久しい、「番外」記事ばっか。… ^^;

集合圏はよくSetと書き表しますが、これは、単に「対象が集合である圏」というだけでなくて、射が写像(関数)であることも一緒に表しているのです。対象として集合を採用しても、射が異なればまったく別な圏になります。

対象が集合であって、射が部分写像(partial map)である圏をPSet(Pはpartialから)、対象が集合であって、射が関係(relation)である圏をRelとしましょう*1。対象だけを考えれば、|Set| = |PSet| = |Rel| となります。しかしもちろん、これらはまったく違った圏です。

これら3つの圏Set, PSet, Relで、集合の直積と直和が圏論的な直積と直和になるかどうかを調べてみましょう。この3つのうちのどの圏でも、対象が集合ですから、普通に集合の直積と直和は作れます。それが、圏の直積/直和になっているかどうかを確認します。

集合の直積と直和

A, Bなどは集合とします。AとBの直積 A×B とは、a∈A と b∈B の対(2成分のタプル)全体からなる集合です。つまり、A×B = {(a, b) | a∈A, b∈B} と書けます。平面座標と考え方は同じ*2だし、ペアやタプルはたいていのプログラミング言語にありますから、この定義は特に問題ないでしょう。

次に直和 A + B ですが、これはほぼ集合の合併 A∪B です。「ほぼ」と言ったのは、例えば、A + A = A は成立しないのです。A + A は、A∪A(これは単にAです)とは違って、Aのコピーを2つ並べたような集合です。A + B と書いたときには、AとBに共通部分がないと考えて寄せ集めるのです。A + B を具体的に作りたいときは、{1, 2}×(A∪B) の部分集合として定義する方法がよく使われます。

  • A + B = ({1}×A)∪({2}×B) = {(1, a) | a∈A} ∪ {(2, b) | b∈B}

特に:

  • A + A = ({1}×A)∪({2}×A) = {(1, a) | a∈A} ∪ {(2, a') | a'∈A}

となります。A = N = {0, 1, 2, ...} という具体例なら:

  • N + N = {(1, 0), (1, 1), (1, 2), ...} ∪ {(2, 0), (2, 1), (2, 2), ...}

集合圏で考えると

いま説明した直積と直和は、集合圏Setにおける直積と直和になっています。-- と言ってみても何も主張してないようですが、「圏論における直積と直和」の定義は、上のように具体的に作ってみせるものではなくて、対象と射の概念だけで記述された性質として定義されます。定義方法が全然違うのです。

ここでは、「圏論における直積と直和」をちゃんと述べるのはやめて、ホムセットを使った少し甘ったるい定義を述べます。集合Aから集合Bへの写像の全体(これも集合)を Map(A, B) と書きます。圏論の記法では Set(A, B) とか HomSet(A, B) ですが、Map(A, B) のほうが分かりやすいでしょう。

さて、p:A×B→A, q:A×B→B という写像 p, q を、p(<a, b>) = a, q(<a, b>) = b と定義すると、次のことが成り立ちます。あっ、諸般の都合でペアを以下 <a, b> と書きます。ご注意ください。

  • Xは任意の(なんでもいい)集合として、Map(X, A×B) と Map(X, A)×Map(X, B) のあいだに1:1の対応がある。その対応は、(h:X→A×B) |→ <(h;p:X→A), (h;q:X→B)> で与えられる。「;」は写像の図式順結合(左から右に読む合成)。

この性質をもって、圏論的な直積の定義とします。集合の直積が、実際にこうなっていることを事例で確認してみてくださいな。

同様に、i:A→A+B, j:B→A+B、i(a) = <1, a>, j(b) = <2, b> という写像 i, j を使うと、次のことが成り立ちます。

  • Yは任意の(なんでもいい)集合として、Map(A+B, Y) と Map(A, Y)×Map(B, Y) のあいだに1:1の対応がある。その対応は、(h:A+B→Y) |→ <(i;h:A→Y), (j;h:B→Y)> で与えられる。

これも事例で確認。

デカルト・ペアリングと余デカルト・ペアリング

aとbの対は <a, b> と書くことにしました。f:X→A, g:X→B に対しても <f, g> という対を定義します。

  • <f, g>:X→A×B <f, g>(x) = <f(x), g(x)>

素直な定義でしょう。fとgから<f, g>を作る操作をデカルト・ペアリングと呼びます。できた結果<f, g>もデカルト・ペアリングということもあります。

Map(X, A×B) と Map(X, A)×Map(X, B) のあいだには1:1の対応があるのでしたが、Map(X, A)×Map(X, B) → Map(X, A×B) という方向の対応は、デカルト・ペアリングで与えられます。ただ、記法に注意しないと混乱します。デカルト・ペアリングを、Map(X, A)×Map(X, B) → Map(X, A×B) とう写像として書き下してみると:

  • <f, g> |→ <f, g>

ハァー? なにもしてない(恒等写像)なの? 左の<f, g>はMap(X, A)×Map(X, B)の要素で、2つの写像 f, g を単に組にしただけのもの。右の<f, g>は新しく作られた X→A×B の写像なんです。概念的には別物なんだけど、記号的には区別できなくなってるわけ。でも、同じものとしてもいいくらいに自然な同型対応があるのですね。

デカルト・ペアリングの双対として、余デカルト・ペアリング*3があります。f:A→Y, g:B→Y の余デカルト・ペアを [f, g] と書くことにすると:

  • [f, g]:A+B→Y [f, g](<1, a>) = f(a), [f, g](<2, b>) = g(b)

となります。ここで、A+B = ({1}×A)∪({2}×B) という定義を使っています。Map(A, Y)×Map(B, Y) →Map(A+B, Y) という対応は、次です。

  • <f, g> |→ [f, g]

今度は違う記号なので混乱が少ないでしょう。2つの写像 f, g の組から新しい写像 [f, g]:A+B→Y を作り出すことが、この余デカルト・ペアリングです。

集合と部分写像の圏で考えると

集合と部分写像の圏でも、同じようにして <f, g>, [f, g] を定義できます。しかし、次の2つの性質が成立するかどうかはわかりません。

  • PMap(X, A×B) と PMap(X, A)×PMap(X, B) のあいだには1:1の対応がある。
  • PMap(A+B, Y) と PMap(A, Y)×PMap(B, Y) のあいだには1:1の対応がある。

ここで、PMap(A, B)は、AからBへの部分写像の全体です。部分写像とは、値の未定義を許した写像のことです。

結論を言ってしまうと、集合の直和は、部分写像の圏でも圏論的直和を与えます。PMap(A+B, Y) と PMap(A, Y)×PMap(B, Y) はキチンと対応します。対応の作り方は集合圏と同じです。

直積のほうは実はダメです。f:{1, 2}→{1, 2} と g:{1, 2}→{1, 2} を次のように定義してみましょう。

  • f(1) = 1, f(2) = 未定義
  • g(1) = 未定義, g(2) = 2

すると、

  • <f, g>(1) = <f(1), g(1)> = <1, 未定義> = 未定義
  • <f, g>(2) = <f(2), g(2)> = <未定義, 2> = 未定義

となり、<f, g> はまったく未定義な関数です。まったく未定義な関数から、もとのfとgを再現するのは無理です。したがって、PMap(X, A×B) → PMap(X, A)×PMap(X, B) という方向の「デカルト・ペアリングの逆」がうまく定義できません。

PSetで直積がうまく定義できない別な状況証拠が、A, Bが有限集合のときに PMap(A, B) の個数を勘定して得られます。Aがn個、Bがm個、Xがk個の要素を持つとき:

  1. PMap(X, A×B) は (n + m + 1)k 個の要素を持つ
  2. PMap(X, A)×PMap(X, B) は (n + 1)k×(m + 1)k 個の要素を持つ

となり、文字通り勘定が合わないのです。

集合と関係の圏で考えると

集合と関係の圏ではまた違った様相が現れます。結論だけ手短に言ってしまうと、集合と関係の圏における圏論的直積は、なんと集合の直和なんです。AからBへの関係Rは、A×B の部分集合で表現できます。よって、関係の圏における R:A→B とは、R⊆(A×B) のことに他なりません。

「+」は今までどおり(圏論的直和じゃなくて)集合の直和を表すとすると、

  • Rel(X, A+B) と Rel(X, A)×Rel(X, B) のあいだに1:1の対応がある

とは、

  • 「X×(A+B) の部分集合」と 「X×A の部分集合」×「X×B の部分集合」 のあいだに1:1の対応がある

ということです。この事実の確認は、集合の直積と直和(あくまで「集合の」)と部分集合の定義を復習するのにちょうどいいと思います。

でまー結局、集合と関係の圏では、圏論的な直積と直和が一致してしまうのですよ。どっちも集合の直和で与えられます。「直積と直和が一致する」ことはそれほど珍しいことではなくて、ベクトル空間と線形写像の圏でも「直積と直和が一致」しています。さらに言うと、「集合と関係の圏」と「ベクトル空間と線形写像の圏」はなんだかとてもよく似ています。このことは、ボブ・クックも指摘していました。

*1:SetRelはほぼ慣用化した記法ですが、部分写像の圏のよく知られた固有名詞はないようです。

*2:直積をデカルト積と呼びますが、それはデカルト座標と同じ発想だからでしょう。

*3:「余(co-)」を付ける位置は色々 -- 余デカルト・ペアリング、デカルト・余ペアリング、余デカルト・余ペアリング。