場合分けと排他的論理和
ある関数 f : X \rightarrow Y が場合分けによって次のように定義されたとします。
f (x) =
\begin{cases}
f_1(x) & \cdots& P_1(x) \\
f_2(x) & \cdots& P_2(x)
\end{cases}
f(x) は x \in X が P_1 という条件を満たすときは f_1(x)、P_2 という条件を満たすときは f_2(x) として定義されています。
ここにはある前提があります。それは、P_1 と P_2 の間には排他的論理和が成り立つ、ということです。
つまり、任意の x \in X について、
が成り立つ。
排他的とはつまり論理積が成り立たないということです。つまり、任意の x \in X について、
が成り立たない。これを排他性と呼びましょう。排他性がなければ値を一意に定められません。
そして、論理和が成り立つ。つまり、任意の x \in X について、
が成り立ちます。これを存在性と呼びましょう。存在性がなければ部分的にしか定義できません。
-
排他性 … P_1 と P_2 がどちらも成り立つことはない
-
存在性 … P_1 と P_2 のどちらかは成り立つ
排他的論理和と直和
ここで P_1 が成り立つ x \in X の集合を X_1 \subseteq X、P_2 が成り立つ x \in X の集合を X_2 \subseteq X とすると、排他的論理和が成り立つことは X が X_1 と X_2 の直和(direct sum)になるということです。つまり、
が成り立ちます。
排他的論理和を含めた集合と論理
論理和 \lor と論理積 \land は集合の和集合 \cup と積集合 \cap に対応していました。つまり、
x \in X_1 \cup X_2 \iff x \in X_1 \lor x \in X_2 \\
x \in X_1 \cap X_2 \iff x \in X_1 \land x \in X_2
です。ここに排他的論理和と直和の関係が加わります。
x \in X_1 \amalg X_2 \iff x \in X_1 \oplus x \in X_2 \\
直和による場合分け
直和によって場合分けを書き換えられます。つまり、f_1 : X_1 \rightarrow Y と f_2 : X_2 \rightarrow Y が与えられれば、場合分けにより次のように f : X_1 \amalg X_2 \rightarrow Y が一意に定まります。
f (x) =
\begin{cases}
f_1(x) & \cdots& x \in X_1 \\
f_2(x) & \cdots& x \in X_2
\end{cases}
この関数 f を \lbrack f_1, f_2 \rbrack : X_1 \amalg X_2 \rightarrow Y と表しましょう。つまり、
\lbrack f_1, f_2 \rbrack (x) =
\begin{cases}
f_1(x) & \cdots& x \in X_1 \\
f_2(x) & \cdots& x \in X_2
\end{cases}
です。
ひとつの略記の方法と考えてもいいかもしれません。つまり、\lbrack f_1, f_2 \rbrack: X_1 + X_2 \rightarrow Y は f_1 : X_1 \rightarrow Y、 f_2 : X_2 \rightarrow Y を略記したものである、と。
圏論における余積
集合の直和は圏論における余積(coproduct)になります。
X_1 と X_2 の余積 X_1 \xrightarrow{\iota_1} X_1 + X_2 \xleftarrow{\iota_2} X_2とは、任意の f_1 : X_1 \rightarrow Y と f_2 : X_2 \rightarrow Y が与えられたとき、次を満たす f : X_1 + X_2 \rightarrow Y が一意に定まる。
f_1 = f \circ \iota_1 \\
f_2 = f \circ \iota_2
ただし、\iota_1 : X_1 \rightarrow X と \iota_2 : X_2 \rightarrow X は挿入関数(inclusion)です。
f は f_1 と f_2 により一意に定まる普遍射です。この普遍射が \lbrack f_1, f_2 \rbrack であり、この普遍性が \text{well-defined} であることを与えています。
圏論の記法に合わせて集合の直和も \amalg ではなく + で表しましょう。たとえば、次のような記法で書くことができます。
例(自然数)
自然数の集合 \mathbb{N} 上にはゼロ 0 : 1 \rightarrow \mathbb{N} と 後者関数 \sigma : \mathbb{N} \rightarrow \mathbb{N} が定められています。これを直和によって次のように表すことができます。
1 + \mathbb{N} \xrightarrow{\lbrack 0, \sigma \rbrack} \mathbb{N}
ただし、1 は単元集合 1 = \{0\} です。\mathbb{N}^1 = \{n | n: 1 \rightarrow \mathbb{N} \} とすれば \mathbb{N} \simeq \mathbb{N}^1 という関係から、
\begin{align*}
0 \in \mathbb{N} &\iff 0 \in \mathbb{N}^1 \\
&\iff 0 : 1 \rightarrow \mathbb{N}
\end{align*}
となります。
例(モノイド)
集合 M 上の単位元 e : 1 \rightarrow M と乗法 (\_) \cdot (\_) : M \times M \rightarrow M から成り立つモノイド \langle M , e, (\_) \cdot (\_) \rangle とする。これを直和によって次のように表すことができます。
1 + M \times M \xrightarrow{\lbrack e, (\_) \cdot (\_) \rbrack} M
例(群)
集合 G 上の単位元 e : 1 \rightarrow G と乗法 (\_) \cdot (\_) : G \times G \rightarrow G と逆 (\_)^{-1} : G \rightarrow G から成り立つ群 \langle G , e, (\_) \cdot (\_), (\_)^{-1} \rangle とする。これを直和によって次のように表すことができます。
1 + G \times G + G \xrightarrow{\lbrack e, (\_) \cdot (\_), (\_)^{-1} \rbrack} G
例(閉包としての自然数)
厳密ではありませんが、自然数の集合 \mathbb{N} は、
\mathbb{N} = 1^{*} = 1 + 1^2 + 1^3 + \cdots = 1 + 1 + 1 + \cdots
と考えられます。つまり、
\mathbb{N} \xrightarrow{\lbrack 0, 1, 2, \cdots \rbrack} \mathbb{N}
です。
補足(直和の構成)
しばしば、直和は直積で次のように構成されます。
\begin{align*}
X_1 \amalg X_2 &= X_1 \times 1 \cup 1 \times X_2 \\
&= \{(x_1, 0) | x \in X_1 \} \cup \{(0, x_2) | x_2 \in X_2\}
\end{align*}
この定義に従えば次のような場合分けになります。
\lbrack f_1, f_2 \rbrack (x_1, x_2) =
\begin{cases}
f_1(x_1) & \cdots & x_2 = 0 \\
f_2(x_2) & \cdots & x_1 = 0
\end{cases}
直積による定義はあくまで定義のひとつです。場合分けが可能であれば普遍性を満たすため直和になります。
補足(Either型)
直和はデータ型で考えると理解しやすいです。
data Either a b ::= Left a | Right b
either :: (a -> c) -> (b -> c) -> Either a b -> c
either f g (Left x) = f x
either f g (Right y) = g y
コンストラクタ Left
, Right
が場合分けを可能にしています。
参考文献
リチャード・バード『プログラミングの代数(Algebra of Programming)』第2章「関手と圏」第5節「積と余積(Products and coproducts)」
Discussion