🗣️

場合分けと排他的論理和~余積(圏論)と直和(集合論)~

2023/05/15に公開

場合分けと排他的論理和

ある関数 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 XP_1 という条件を満たすときは f_1(x)P_2 という条件を満たすときは f_2(x) として定義されています。

ここにはある前提があります。それは、P_1P_2 の間には排他的論理和が成り立つ、ということです。

つまり、任意の x \in X について、

P_1(x) \oplus P_2(x)

が成り立つ。

排他的とはつまり論理積が成り立たないということです。つまり、任意の x \in X について、

P_1(x) \land P_2(x)

成り立たない。これを排他性と呼びましょう。排他性がなければ値を一意に定められません。

そして、論理和が成り立つ。つまり、任意の x \in X について、

P_1(x) \lor P_2(x)

が成り立ちます。これを存在性と呼びましょう。存在性がなければ部分的にしか定義できません。

  • 排他性P_1P_2 がどちらも成り立つことはない
  • 存在性P_1P_2 のどちらかは成り立つ

排他的論理和と直和

ここで P_1 が成り立つ x \in X の集合を X_1 \subseteq XP_2 が成り立つ x \in X の集合を X_2 \subseteq X とすると、排他的論理和が成り立つことは XX_1X_2直和(direct sum)になるということです。つまり、

X = X_1 \amalg X_2

が成り立ちます。

排他的論理和を含めた集合と論理

論理和 \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 Yf_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 Yf_1 : X_1 \rightarrow Yf_2 : X_2 \rightarrow Y を略記したものである、と。

圏論における余積

集合の直和は圏論における余積(coproduct)になります。

X_1X_2 の余積 X_1 \xrightarrow{\iota_1} X_1 + X_2 \xleftarrow{\iota_2} X_2とは、任意の f_1 : X_1 \rightarrow Yf_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)です。

ff_1f_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)」

GitHubで編集を提案

Discussion