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

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

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

参照用 記事

吸収モノイドを作る:計算科学にもエフイチの影?

謎の代数系エフイチ(一元体)は、伝統的な集合論のなかで定義するなら、台集合が“二元”集合 {0, 1} であるモノイドです。そのモノイド演算(掛け算とします)は次の表で与えられます。

× 0 1
0 0 0
1 0 1

こんなバカみたいないに簡単な代数系が21世紀の英知を結集してアタックすべき対象だとは信じがたいのですが、どうも「不思議だが本当だ」ということらしいです。

エフイチ(「エフイチ」と呼ぶことにした事情は「僕がエフイチにハマる理由」参照)については、何度か話題にしています。

最初の頃の記事は、「エフイチ」も「一元体」も含んでいません。きっかけの記事はパズルだったんです。

エフイチは一元体と呼ばれてはいますが、足し算がないのがミソのようです。足し算なしの幾何学を構築するときの究極の基礎体(体じゃないけど)がエフイチということでしょう。

ソフトウェアの実務的な場面でも、どことなくエフイチを連想させる代数系に出会うことがあるんですよね。なんか深遠な結び付きがあるのか、それとも、単に見かけ上の偶然の一致なのかは分かりません。まーともかく、最近、エフイチに類似の「吸収元(absorbing element)を持つ可換モノイド」を構成する必要があったのでその話をします。

内容:

  1. 吸収モノイド
  2. 平坦束
  3. 平坦束をベキ集合内で表現する
  4. 等号が不完全な集合に対する平坦束
  5. 不完全な平坦ミート半束を吸収モノイドにする

吸収モノイド

M = (M, e, ・) をモノイドとします。z∈M が吸収元(absorbing element)だとは、

  • 任意の x∈M に対して、z・x = x・z = z

モノイド演算を掛け算にみたてるときは、吸収元をゼロとも呼び、0と書くこともあります。しかし、モノイド演算を掛け算の形で書くときは吸収元をゼロと書くのは混乱のもとです。なので、ここではzを使いました。

エフイチ {0, 1} は吸収元0を持つ(掛け算の)モノイドです。{0, 1, 2, ..., ∞} に足し算を考えた場合、∞が吸収元になります。n + ∞ = ∞ + n = ∞ ですから。

Mが任意のモノイド(吸収元はあってもなくてもいいです)として、Mに含まれない要素Zを取ってきて、M + {Z} を作ります。Mのモノイド演算・を、次のようにして M + {Z} に拡げます。拡げた演算を*とします。

  1. x, y∈M のとき x*y := x・y
  2. x∈M に対して x*Z := Z*x = Z
  3. Z*Z := Z

M + {Z} はZを吸収元とするモノイドとなります。Mにもともと吸収元zがあるときも、zは吸収元ではなくなり、新参のZに吸収元の立場を奪われます。

エフイチは、単位元だけの自明なモノイド {1} に吸収元として0を加えたものです。{0, 1, 2, ..., ∞} も、非負整数の足し算モノイドに、吸収元として∞を加えたものになっています。

吸収元を持つモノイドを、吸収的、いや「吸収」を形容詞に使って吸収モノイドと呼ぶことにします。吸収モノイドは、足し算がない世界の(可換とは限らない)環の役割りを演じるようです。

平坦束

Aを集合とします。Aに新しい要素⊥(ボトム)とT(トップ)を加えた A + {⊥, T} を考えます。A + {⊥, T} の上に順序関係≦を次のように定義します。

  1. x∈A に対して ⊥≦ x
  2. x∈A に対して x≦T
  3. x, y∈A に対しては、x≦y ⇔ x = y

A = {a} のとき、A + {⊥, T} = {a ⊥, T} は ⊥≦ a ≦T という線形順序(全順序)、Aがより大きいと、もはや線形順序にはなりません。A = {a, b} のときの A + {⊥, T} = {a, b ⊥, T} はダイヤモンド形のハッセ図をもつ順序構造です。

上記のようにして作られた A + {⊥, T} は平坦束flat lattice)と呼ばれることがあります。実際、追加した{⊥, T}を除けば、上下関係がない平坦な構造となっています。地上に住む人々はすべて平等で、天上に神様、地下に悪魔がいるような構図です。

集合Aから作った平坦束をA'と書くことにして、x, y∈A' に対して、xとyのミート x∧y とジョイン x∨y が決まります。具体的に書けば:

  1. x∈A' に対して、x∧⊥ = ⊥∧x = ⊥
  2. x∈A' に対して、x∧T = T∧x = x
  3. x, y∈A、x ≠ y ならば、x∧y = ⊥
  4. x, y∈A、x = y ならば、x∧y = x
  5. x∈A' に対して、x∨⊥ = ⊥∨x = x
  6. x∈A' に対して、x∨T = T∨x = T
  7. x, y∈A、x ≠ y ならば、x∨y = T
  8. x, y∈A、x = y ならば、x∨y = x

ミートだけを考えた構造 (A', T, ∧) は可換モノイドになります。この可換モノイドにおいて、ボトム⊥は吸収元となります。よって、(A', T, ∧, ⊥) は吸収可換モノイドです。束から誘導された構造なので、x∧x = x というベキ等性を持っているのが特徴的です。(A', T, ∧) のようにベキ等性を持つ可換モノイドはミート半束とも呼ばれます。

平坦束をベキ集合内で表現する

A' = A + {⊥, T} として平坦束を構成しましたが、A'は、Aのベキ集合Pow(A)内で作ることもできます。

Pow(A)は「Aの部分集合を要素とする集合」です。a∈A に対する単元集合 {a} はもちろんPow(A)の要素です。そこで、単元集合(singleton set)の全体を Sing(A) と書きます。{a}∈Sing(A) で、Sing(A)⊆Pow(A) です。a←→{a} という対応で、AとSing(A)は1:1対応します(集合として同型)。

A自身と空集合もPow(A)の要素なので、Sing(A)にAと{}を加えた集合 Sing(A)∪{A, {}} を作ると、これはPow(A)の部分集合です。Pow(A)は集合演算∩と∪により束ですが、Sing(A)∪{A, {}} はPow(A)の部分束になります。

Pow(A)の部分束である Sing(A)∪{A, {}} は、A' と同型です。次のように対応します。

  1. A ←→ Sing(A)
  2. a∈A ←→ {a}∈Sing(A)
  3. ⊥ ←→ {}
  4. T ←→ A
  5. ∧ ←→ ∩
  6. ∨ ←→ ∪

これは、抽象的に与えられた束を集合束に埋め込む(表現する)一例ですが、個体を集合とみなす対応 a∈A ←→ {a}∈Sing(A) は、データインスタンスを型とみなすときに実際に使われています。

この例では、ボトムを空集合として扱ってますが、ボトムの意味論は多様なので、いつでも空集合がふさわしいわけではないことは注意しておきます。

等号が不完全な集合に対する平坦束

数学における集合Aは、x∈A かどうかが判定できて、x, y∈A に対して x = y かどうかも判定できることが暗黙に仮定されています。しかし、計算で出会うデータ領域では、x = y かどうかが分からないことがしばしばあります。

典型的な例は、無限集合Aに対する指数集合 AA です。AA は、f:A→A という関数の全体です。f = g を判断するには、∀x∈A.(f(x) = g(x)) という命題の真偽を決定する必要があります。しかし、Aが無限集合なら f = g の確認は無理です。もちろん、たまたま f = g かどうかが確実に分かるときもあります。しかし一般的には f = g が判定できない、ということです。

さて、Xは、完全な等号が備わってない集合とします。つまり、x, y∈X (これは判断できるとする)に対して、x = y が決定できる保証がないことです。このような状況で、Xの平坦束 X' = X + {⊥, T} を作るにはどうしたらいいでしょう。問題になるのは次の定義です。

  • x≦y ⇔ x = y

x = y が分からないとき、x≦y も分かりません。

PER(Partial Equivalence Relation)とか三値論理をベースにして順序の理論を組み立てるとかになりそうです。どうもそれほど簡単ではないようです。

しかし、ミート演算∧だけを考えたミート半束でいいなら、吸収(可換)モノイドの枠内で比較的簡単な解決法があります。

不完全な平坦ミート半束を吸収モノイドにする

Xは、等式 x = y が完全には判定できないという意味で不完全な集合とします。X' = X + {⊥, T} の上に、ミート演算∧を次のように定義します。

  1. x∈X' に対して、x∧⊥ = ⊥∧x = ⊥
  2. x∈X' に対して、x∧T = T∧x = x
  3. x, y∈X、x ≠ y ならば、x∧y = ⊥
  4. x, y∈X、x = y ならば、x∧y = x

これは先に挙げた定義と同じです。ただし、x = y (同じ事だがその否定 x ≠ y)が決定できないときは、x∧y は未定義としておきます。x∧y が未定義なら (x∧y)↑、定義されているなら (x∧y)↓ と書くことにします。 (x∧y)↑ と (x∧y)↓ は値ではなくてメタな命題である点に注意してください。

未定義部分があるかもしれない演算∧は次の性質を持ちます。

  1. 任意の x∈X' に対して、(x∧T)↓、(T∧x)↓ であり、x∧T = T∧x = x 。
  2. 任意の x, y, z∈X' に対して、(x∧y)↓、((x∧y)∧z)↓ ならば、(y∧z)↓、(x∧(y∧z))↓ であり、そのとき (x∧y)∧z = x∧(y∧z) 。

これは、定義されている範囲内においては、演算∧はモノイド演算とみなしてよいことです。(X', T, ∧) は部分的なモノイドとなります。⊥はこのモノイドの吸収元となってますが、そのことは次のように書けます。

  • 任意の x∈X' に対して、(x∧⊥)↓、(⊥∧x)↓ であり、x∧⊥ = ⊥∧x = ⊥ 。

部分的な可換律は次のように書けます。

  • 任意の x, y∈X' に対して、(x∧y)↓ ならば、(y∧x)↓ であり、そのとき x∧y = y∧x 。

つまり、未定義部分はありますが、X'はほとんど吸収可換モノイドとみなしてよいことになります。

ここで、(x∧y)↑ のところを、すべて x∧y = ⊥ に置き換えてしまいます。そうすれば、演算∧の未定義部分はなくなり、∧は全域的二項演算になります。この置き換えはちょっと強引そうですが、これによって結合律が壊れることはなくて、全域的(つまり普通の)吸収可換モノイドが出来上がります。

今の例では、x = y が判定できないときは x ≠ y とみなしておこう、という処置です。このような考えがいつでも通用するわけではありませんが、うまくハマる状況もあります。

一般に、未定義部分に適切な値を割り当てて全体としてツジツマを合わせることはよく使われる処方箋です。「等しいかどうか分からないなら、異なるとみなしたほうが安全だ」という発想はその一例です。そして、結果として得られたモノイドは、なぜか(偶然かも知れないが)エフイチと同類の吸収可換モノイドなのです。