モニャドセミナー4 資料
前置きとか予定とか省略
だけど、ちょっとは言っておくと(<省略してねー):
- クライスリ圏はもちろんやるぞー
- でも自然変換をほとんど使わないよ
- なぜなら、スタンピング・モナド(or コモナド)に限定するから
- 気が向いたら一般論を少し入れるが、一般論のアドリブ計算に自信がない。失敗しても責めないでね。
- 右と左でどうせハマる
- 現実のプログラミングやシステムとの関係を強調する予定
- ラップ/アンラップが基本的な道具だよ
- 目標は、トランザクション計算(エコ計算)の、作用付き両クライスリ圏の構成
圏と関手の復習:ステップbyステップの定義
- ステップ1 dom, cod -- 有向グラフ
- ステップ2 dom, cod, id -- 反射的有向グラフ
- ステップ3 dom, cod, id, comp -- 反射的マグマ
- ステップ4 結合法則と単位法則 -- 圏
- ステップ1 dom, cod を保存 -- 有向グラフの準同型
- ステップ2 dom, cod, id を保存 -- 反射的有向グラフの準同型
- ステップ3 dom, cod, id, comp を保存 -- 反射的マグマの準同型=関手
- サイドステップ2' dom, cod, comp を保存 -- マグマの準同型=半関手
自然変換
モニャドセミナー3で取り上げられませんでした。無念だ。今日も無理だ。ごめんなさい。
お詫びに、いいことを教えましょう。自然変換αは次のように書くと具合がいいぞ。
F
α:: ‖ : C→D
∨
Gまたは
C
α:: F⇒G : ↓
D
箴言集
箴言<しんげん>つうより、ぼやきの言葉:
- とにかく、先入観、こだわり、偏見から抜け出そう。
- 定義や計算に意味を求めすぎない。
- 特に、唯一の意味を求めるのはたいていは不毛。
- 実体を過剰に気にしない。「なんでもいいや」と割り切る。
- 構文の意味は、その構文自体だという解釈だってある。
- 集合/写像にこだわらない。数や図形は、そのまま素直に捉える。
- 集合/写像による表現は重要だが、それがベストでも便利でもないことがある。
- 対象に要素(元)があると思うな。あっても使うな。(「初等的」って言うのだ)
- 「変だ」「違う」は、根拠を出して言う。気分だけで言わない。(次男のホワイトリスト方式好き嫌いには困った)
- 認識や分類は観察者の主観であって、対象物側にあるのではない。
- 態度を変えれば、同じ対象物に違う構造が見えてくる。違う構造は違うモノ。
- 極めてツマンナイものに注目する。空、単元集合、pointing map、自明モノイド(いくつかの意味がある)、包含写像、射影、忘却関手など。
- 用語・記法の歴史的な経緯や事情はあきらめろ。いまさらどうにもならない。(が、檜山はあきらめが悪い。)
- 記号はいつだって足りない、ホントに足りない。A, B, C∈|C| -- アリッ!?
- ズボラな記法や用法に慣れる。idA = A とかは、計算上も重要なズボラ・テク。
圏への先入観を砕く目的で「単純平面タングル」を出した。模様が射、模様は模様、それだけ(田辺デモ参照)。
力学的運動の圏なんてのはどう? 射は写像だけど、パラメータは時間。その時間が対象なわけじゃない。
モノイドとコモノイド
- モノイドの例を思い出そう
- 特に今日は、整数の足し算(カウンタ)、文字列の連接(テキストファイル)、2次元アフィン変換(タートル・グラフィックス)を考える。
- モノイドの法則を図示しよう。
(空白)
- 矢印をひっくり返せ
べば、コモノイドの定義と法則 - 今日使うコモノイドは一種類、演算の名前は色々:対角、余積(余乗法)、余加法、複製、分岐などなど。
(空白)
今日取り扱う圏と関手
Mはモノイド、Vはコモノイドと約束する。
記号 | 短い説明 |
---|---|
C | 基本とする圏、モノイド積を持つ |
C×M | Mによる右スタンピング構成(で得られた圏) |
M×C | Mによる左スタンピング構成 |
M×S | M-加群Sによる右スタンピング構成、左も使うかも |
RM | Mによる右スタンピング(右掛け算)関手 C→C |
LM | Mによる左スタンピング(左掛け算)関手 C→C |
Kl(RM) | 右スタンピング・モナドRMのクライスリ圏 |
Kl(LM) | 左スタンピング・モナドLMのクライスリ圏 |
CoKl(LV) | コモノイドVによる左スタンピング・コモナドLVの余クライスリ圏 |
DiKl(LV, RM) | 両(双)クライスリ圏 |
AcDiKl(LV, RM) | 作用付き両クライスリ圏 |
その他、重要な関手
- J : A×C→C -- スタンピング構成した圏から、もとの圏へ
- W : Kl(RM)→C×M ラッピング
- W' : Kl(RM)→C×S ラッピングもどき、一番わかりやすいが、アンラップ(中身の取り出し、再現)ができない
- W : Kl(LV)→V×C ラッピング
- W : DiKl(LV, RM)→V×C×M ラッピング
- W : AcDiKl(LV, RM)→V×C×M ラッピング
スタンピング構成
今日ずっと基礎にする圏C
- なんらかのデータ型、データ領域が対象
- なんらかの計算処理/計算主体が射
- 計算処理/計算主体を計算エージェントと呼ぶことがある
- 計算エージェントは内部と外部をわかつ境界を持っている
- 入出力は、n-in m-out または、タプリングを許して 1-in 1-out
A∈|C|を固定して、次の圏を作れる。
- 対象は A×X の型のCの対象
- 射は、A×X→A×Y の形のCの射
- dom(f:A×X→A×Y) = X
- cod(f:A×X→A×Y) = Y
- compはfのcomp
この圏を A×C、面倒だから A×C と書く(これはイイカゲン過ぎてヤバイ)。
ホムセットによる定義がいいかも。
関手J
J: A×C→C
- J(X) = A×X
- J(f:X→C in A×C) = (f in C)
このJは現実的にどんな意味があるか?
- X→Y が、Cでは A×X→A×Y ってことは、、、
- クラス定義を固定しての、、、
- ×××を素朴な純関数計算で表してみると
数式と現象
- 二次関数を学び、ちゃんと使える人はたくさんいる。
- その二次関数で、「投げたボール」を記述できて、到達点を計算できることを知らない人はたくさんいる。
- 小中学校の素材のなかにも、あれだけ圏が発見できる。
- プログラミングやシステムの「現象」に、圏やモナドが含まれてないハズはないでしょ。どう考えても。
- ヒープ(共有領域)もスタック(プライベート領域)も、参照引数も値引数も、
胃イミュータビリティもディープコピーも、クラスとオブジェクトも、単一代入も、DIも、総称関数も依存型も、当然に圏論で現象記述(定式化)できるよ。当たり前だ。
今日のモノイドさん、モナドさん
- 有限カウンタ 0から9 有界
- 有限カウンタ 0から9 サイクリック(ラップアラウンド)
- 出力モードのテキストファイル
- タートルグラフィックス ペンなし
- タートルグラフィックス ペンあり
- 状態値と作用値と遷移
- あるいは、位置と力と運動
- タートルグラフィックスのコマンドはアフィン変換として考える
- タートルグラフィックスの軌跡の扱いが少し面倒かな
それっ、クライスリ圏
状態値は無視して、作用値=モノイドの元、作用の結合(合成)=モノイド演算 として
クライスリ射とクライスリ結合を作ってしまえ。
結合法則と単位律も直接に証明しよう。
実例で考えると、状態空間への更新リクエストAPIを使う関数だよね。
ラッピングを使ってみよう
- オブジェクト指向風の実行環境の上で実装するってことだね
- アンラップできるところがミソ
- アンラップがあるので、ラッピングは単射(埋め込み)
- 既にクライスリ圏を作っているので、ラッピングは関手だと言っていい
ラッピングを先に考えると
Dがマグマ、Cが圏、F:D→C という対応があり:
- Fは単射
- Fはマグマの結合演算を保つ
このとき、Dは半圏であり、Fは半関手。
さらに、Dが反射的マグマ、Cが圏、F:D→C という対応があり:
- Fは単射
- Fはマグマの結合演算を保つ
- Fはマグマの恒等を保つ
このとき、Dは圏であり、Fは関手。
以上の事実を使って、クライスリ圏を構成してみよう。
余クライスリ圏
対角コモノイドのコモノイダル・スタンピング・モナドコモナドから、反射的マグマを作り、余クライスリ圏も作ってしまえ。
状態スタンピングはイマイチ
ラッピングに近いことができるが、作用がどうなっているか外部からは予測できないので、アンラップできない。アンラップがないので単射性が示せず、埋め込み関手が構成できない。
もう少し工夫しないと。
ここらで愚痴を言っておきたい
「… だーから右と左のハナシはいやなんだよなー」
- (a・b)*x = a*(b*x) 気持ちいい左作用
- (a・b)*x = b*(a*x) 気持ち悪い左作用
- x*(a・b) = (x*a)*b 気持ちいい右作用
- x*(a・b) = (x*b)*a 気持ち悪い右作用
前回(モニャドセミナー3)でも間違えたしよ。
「理解をさまたげるモノ/誤解をまねくモノ、それと対処」のの「右と左、上と下、前と後」参照
加群(作用)の公理
カウンタ、テキストファイル、タートルグラフィックスが例。
結合律を絵で表そう。
後はなりゆき
クライスリ圏の一般論はたぶんやらないと思うが、一応書いておく:
- F(μX) ; μX = μF(X) ; μX
- F(ηX) ; μX = idF(X)
- ηF(X)) ; μX = idF(X)
X -- (f) ---> F(X)
| |
|η_X |η_F(X)
| |
v v
F(X) -(F(f))-> FF(X)
後はなりゆき 2
次の計算はアドリブでは不安だ。写真を載せておこう。
あと、双モノイド法則(3種)が必要だが、それはアドリブ。