昨日の記事「タプル1変数関数と多変数関数」の続きです。タプル1変数関数と多変数関数の区別なんて意識しないのが普通だと思いますが、単一の値 x と、その値だけを含む長さ1のタプル [x] って区別してますか? あるいはまた、長さ0のタプル [] って、この世にひとつだけでしょうか?
このテの疑問・質問って、「そんな些細なことはどうでもいいだろう」と軽視されがちですが、混乱や勘違いの原因になっていたりするので、一回はシッカリ考えておいたほうがいいですよ。
内容:
準備:状況設定と約束
太字の0は空集合、太字の1は単元集合〈singleton set〉を表すとします。1 の唯一の要素は何でもいいです。よく使われるのは、1 := {0}, 1 := {1}, 1 := {*} とか。でも、事前に決まっていれば何でもいいです。ここでは、1 := {1} にしておきます。単元集合の要素が何であるかに拘ったりするのは、まったく非生産的なのでやめましょう。
f:A → B in Set は、AとBが集合で、fが写像であることを意味します。写像を集合論のなかで定義すると、f ⊆ A×B で、次の条件を満たすものが写像です。
- ∀x∈A.∃y∈B.( (x, y)∈f )
- ∀x∈A.∀y, y'∈B.( (x, y)∈f ∧ (x, y')∈f ⇒ y = y' )
写像に関する非常に基本的な性質が必要になったら、この定義に頼ることにします。例えば、任意の集合Aに対して、f:0 → A という写像が存在することを、上記の定義に基づいて証明できます。fの候補は 0 ⊆ 0×A ですが、実際に0は写像になります。
圏の定義は知っているとして、圏Cのホムセットに関して次の性質があります。
- ∀ A, B, A', B'∈|C|.( (A, B) ≠ (A', B') ⇒ C(A, B)∩C(A', B') = 0 )
これを一言で(雑に)言えば、「圏のホムセットは交わらない」となります。dom, cod, id, comp〈結合〉 を使った圏の定義からすぐに示せます。
ところが、新しい圏をホムセットを使って定義するとき、平気で交わったホムセットを使います。例えば、順序集合 (A, ≦) からやせた圏〈thin category〉*1 A を作るときの定義は、
- a ≦ b ならば、A(a, b) := 1
- そうでないならば、A(a, b) := 0
とかします。実際には、交わらないように射の両端を射の一部に組み入れます。
- a ≦ b ならば、A(a, b) := {a}×1×{b} = {(a, 1, b)} {(a, b)}
- そうでないならば、A(a, b) := {a}×0×{b} = 0
つまり、「必要があれば、圏のホムセットは交わらないように各自細工すべし」が暗黙のお約束になっています(詳しくは、「ホムセットは交わるのか」参照)。
集合圏のホムセット Set(A, B) をひとつの集合(集合圏の対象)だと思ったモノを BA と書きます*2。2 := {1,2} とすると、次の同型が成立します。
- A2 A×A in Set
これはイコールだと思っても大した問題は起きませんが、先程の写像の定義から言うと A2 ⊆ Pow(2×A) (Powはベキ集合)ですが、A×A ⊆ Pow(2×A) ではない(定義にもよりますが)ので、まったく同じモノではありません。ただし、多くの場合同一視しています。
より一般に、n := {1, ..., n} として、次の同型が成立します。
- An An in Set (太字とノーマルの違いに注意、左辺は太字n)
長さが1のタプル
昨日の記事「タプル1変数関数と多変数関数」と同じ記法の約束(下に再掲)を使います。
- タプルは、角括弧で囲む必要がある。
- タプルの並びは縦方向である。
- 多変数の並びは(従来どおり)横方向でよい。
x∈A に対して、角括弧〈ブラケット〉で囲んだ [x] は長さ1のタプルになります。さて、x = [x] でしょうか、それとも x ≠ [x] でしょうか? これは、ケースバイケースで決めればいいことですが、 x ≠ [x] の観点をおさえておきましょう。
x∈A に対して、長さ1のタプル [x] はどこに所属するのでしょうか? [x]∈A1 (右肩の指数1は太字)と考えるのが無難だと思います。前節で述べたことから:
- A1 = A (右肩の指数1はノーマル)
- A1 A だが、A1 ≠ A (右肩の指数1は太字)
要素 x∈A に対して、写像 f:1 → A を次のように定義できます。
- f(1) := x
こうして定義された f:1 → A を [x] と書いているのだ、と理解しましょう。
同様に、2つの要素 x∈A, y∈B に対して、写像 g:2 → A∪B を次のように定義できます。
- g(1) := x
- g(2) := y
こうして定義された g:2 → A∪B を と書いているのだ、と理解しましょう。
タプルをこういうモノだと理解すれば、それはそれで首尾一貫しているのですが、A2 = A×A と A2 が別物なので、f:A×A → B を定義しても、f:A2 → B ではありません。これって不便ですよね。
現実的には、やはり A2 = A×A と A2 の同一視(イコールだと思ってしまえ)を導入しないとやってられないでしょう。
「x と [x] は同じか違うか?」「A×A と A2 は同じか違うか?」のような問〈とい〉に、唯一真実な答を求めたりするのは現実的ではないのです。ですが、唯一真実な答がないのなら曖昧にしよう、不問に付そうも違います。状況は正確に把握した上で適宜同一視の戦略を採用します。
長さが0のタプル
最初の節に挙げた写像の定義から言うと、0 → A という写像がひとつだけあります。したがって、A0 = {0} です。An の要素をタプルと呼び、角括弧〈ブラケット〉で表すという約束に従えば、A0 の唯一の要素は空タプル [] で書くべきでしょう。
角括弧に決めたのはこの記事のローカルルールなので、丸括弧で () でもかまわないし、そのほうが多いでしょう。また、タプルをリストと呼んでもかまいません。タプルとリストの区別は明確ではなく、コミュニティ〈方言〉依存です。気分としては、タプルは長さ固定、リストは長さ可変かな。
集合〈型〉Aに対して、A成分のあらゆる長さの並びを考えるときは、気分的にリストと呼び、リストの全体を List(A) と書きます。Aが何であっても、[]∈List(A) です。
さて、A と B はまったく異なる(共通部分を持たない)非空集合として*3、次の2つは同じでしょうか/違うでしょうか?
- Aを成分〈項目 | 要素〉とする長さ0のタプル〈リスト〉
- Bを成分〈項目 | 要素〉とする長さ0のタプル〈リスト〉
A0 = {0} かつ B0 = {0} なので、A, B が何であろうと空リストの実体は空集合 0 です。だから、空タプル/空リスト はこの世にひとつでしょう。
ところが、「型Aの空タプル」として空タプルにも型を考えることがあります。まー、なんてことでしょう。
最初の節の、圏のホムセットの話を思い出してください。空集合は集合圏の始対象なので、Aがなんであっても、Set(0, A) は単元集合です。よりハッキリと書けば:
- Set(0, A) = {0}
でもね、こうしちゃうと、A ≠ B でもホムセット Set(0, A) と Set(0, B) が交わっちゃうでしょ。そんなときは、そう、「必要があれば、圏のホムセットは交わらないように各自細工すべし」でした。
集合Aごとに、ホムセット Set(0, A) には別々な要素が入ります。Aをラベルして区別すればいいのです。ラベルして区別した要素を θA∈Set(0, A) とすれば、θA は始射(始対象からの唯一の射)です。
- θA:0 → A in Set
- または、[]A:0 → A in Set
- または、()A:0 → A in Set
圏論では、対象や射の実体が何であるかはどうでもよくて、圏全体における立ち位置・役割(この場合は、始対象・始射であること)を見るのです。
「長さ0のタプルって、この世にひとつだけでしょうか?」もまた、唯一真実な答を求めたりするのがナンセンスな問の例です。
当り前・自明なことって、実はとても重要です。当り前・自明なことを曖昧に捉えていたり、偏狭な先入観を持ってませんか? 曖昧さと柔軟さは違うし、偏狭さと正確さは違います。
*1:「はじめての圏論 その第3歩:極端な圏達」参照。
*2:指数記法を使う事情は「なんでソコに、足し算、掛け算、累乗の記号を使うのですか?」参照。