このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

部分写像の圏、単元例外処理とか

集合圏、部分写像の圏、関係圏は一緒に考えて互いに比較するといいようだ。今の焦点は部分写像の圏。

まずは、モナド、つうか随伴関手対と共に考える。Set上のモナドAugを考える。Augはaugmentation(増加、増強、増大、添加物、拡大)のことで、付点モナドとする。これは次のようにも呼ばれる。

Aug:SetSetのクライスリ圏は、

  1. 部分写像(partial function/mapping)の圏
  2. 例外(エラー)付き写像の圏
  3. 無限走行(非停止 non-terminating)するかもしれない手続きの圏
  4. 特定特殊な値を出すかもしれない関数の圏

などの解釈を持つ。ここでは、部分写像または例外付きの手続きの圏とみなす。

J:SetPartialを自然な埋め込みとして、J(Set) = TotPartial とする。部分圏Totの射は、

  • 厳密射 strict morphism
  • 全域射 total morphism
  • 純射 pure morphism
  • 無例外射 noexcept morphism

などと呼ばれる。

Totz(totalize)を PartialSet という写像とすると、

  • Set(A, Totz(Y)) \stackrel{\sim}{=} Partial(J(A), Y)

なので、J -| Totz 。この随伴対によるSet上のモナドが Aug := J;Totz、そのクライスリ圏がPartial。Totz;J :PartialPartialPartial上のモナドの台関手となる。これをLiftとする。Lift:PartialPartialの対象部分は、Augの対象部分と同じで、集合への付点操作となる。AugとLiftは極めて類似しているので、混同や同一視がされるが、ここではちゃんと区別する!

J:SetPartial はクライスリ圏のクライスリ埋め込みとなるが、Setデカルト圏なのでフレイド圏となる。通常のフレイド圏よりは強くて、外側の圏Partialが直積(圏的直積に非ず)に対してモノイド圏になっており、さらに共通の直和(圏的直和)を持つ。

  1. Jは、フレイド圏の構造関手である。
  2. 基礎圏Setは、直積に関してデカルト圏で、直和と共に半環圏である。
  3. 外の圏Partialは、直積に関してモノイド圏で、直和と共に半環圏である。
  4. Jは、半環圏の準同型関手になっている。
  5. Jは、随伴の相方Augを持つ。

η::Id⇒Aug:SetSet を付点モナドの単位とする。埋め込みJでηを成分ごとに移した族をη'とする。Jは対象上で恒等なので、n'::Id⇒Lift となる。

f:A→B in Partial に対して、Try(f) := η'A;Lift(f) とする。

  • Try(f):A→Lift(B) in Partial

となる。これは、Partialを単元例外付き手続きの圏とみてのtryブロックとなる。Try(f)はfがなんであってもTotに入るので、Try(f)∈Tot

h:Lift(B)→B を例外ハンドラと呼ぶ。Try(f);h がtry-catch構造に対応する。h∈Totなら、Try(f);h もTotに入る。Lift(B) = B + {⊥} であることから、h = [hnormal, hexcept];∇B と書ける。ここで、hnormal:B→B、hexcept:{⊥}→B、∇Bは余対角。

h:Lift(B)→C in Partialを一般化例外ハンドラと呼ぶ。tryブロックと一般化例外ハンドラを組み合わせると、(f:A→B)|→(g:A→C) という圏的操作を定義できる。これを(一般化)例外ハンドリングと呼ぶ。

2 = 1 + 1 として、直和の標準入射を使って、false:12, true:12 を定義して、(2, false, true) を二値真偽構造だとする。述語 p:A→1 in Partial に対して、+p := try(f);[true, false] ; A→2、-p := try(f);[false, true] ; A→2 として、一値の述語を二値の正論理項と負論理項に対応付けることが出来る。論理演算は、22 として定義できる。

等式的論理は、対角の双対であるコンパレーター γA:A×A→A in Partial を使って展開できる。コンパレーターは例外を出す(部分性を持つ、値がないかも)が、例外ハンドリングを使って二値真偽値2への射に調整可能。


注意すべき点:

  • フレイド圏の枠組みで考える。
  • 直和を考えて、半環圏を使う。
  • モナドだけではなくて、随伴対に戻って考える。
  • 随伴対のコモナドであるリフトを考える。地味だが重要。
  • モナドテンソル強度を考える。
  • 集合圏、部分写像の圏、関係圏を比較する。