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

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

モニャドセミナー4 資料

前置きとか予定とか省略

だけど、ちょっとは言っておくと(<省略してねー):

  1. クライスリ圏はもちろんやるぞー
  2. でも自然変換をほとんど使わないよ
  3. なぜなら、スタンピング・モナド(or コモナド)に限定するから
  4. 気が向いたら一般論を少し入れるが、一般論のアドリブ計算に自信がない。失敗しても責めないでね。
  5. 右と左でどうせハマる
  6. 現実のプログラミングやシステムとの関係を強調する予定
  7. ラップ/アンラップが基本的な道具だよ
  8. 目標は、トランザクション計算(エコ計算)の、作用付き両クライスリ圏の構成

圏と関手の復習:ステップbyステップの定義

  • ステップ1 dom, cod -- 有向グラフ
  • ステップ2 dom, cod, id -- 反射的有向グラフ
  • ステップ3 dom, cod, id, comp -- 反射的マグマ
  • ステップ4 結合法則と単位法則 -- 圏
  • サイドステップ2' dom, cod, comp -- マグマ
  • サイドステップ3' 結合法則 -- 半圏
  • ステップ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

箴言

箴言<しんげん>つうより、ぼやきの言葉:

  1. とにかく、先入観、こだわり、偏見から抜け出そう。
  2. 定義や計算に意味を求めすぎない。
  3. 特に、唯一の意味を求めるのはたいていは不毛。
  4. 実体を過剰に気にしない。「なんでもいいや」と割り切る。
  5. 構文の意味は、その構文自体だという解釈だってある。
  6. 集合/写像にこだわらない。数や図形は、そのまま素直に捉える。
  7. 集合/写像による表現は重要だが、それがベストでも便利でもないことがある。
  8. 対象に要素(元)があると思うな。あっても使うな。(「初等的」って言うのだ)
  9. 「変だ」「違う」は、根拠を出して言う。気分だけで言わない。(次男のホワイトリスト方式好き嫌いには困った)
  10. 認識や分類は観察者の主観であって、対象物側にあるのではない。
  11. 態度を変えれば、同じ対象物に違う構造が見えてくる。違う構造は違うモノ。
  12. 極めてツマンナイものに注目する。空、単元集合、pointing map、自明モノイド(いくつかの意味がある)、包含写像、射影、忘却関手など。
  13. 用語・記法の歴史的な経緯や事情はあきらめろ。いまさらどうにもならない。(が、檜山はあきらめが悪い。)
  14. 記号はいつだって足りない、ホントに足りない。A, B, C∈|C| -- アリッ!?
  15. ズボラな記法や用法に慣れる。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) 作用付き両クライスリ圏
  • モノイド積の典型例は直積
  • M-加群線形代数の用語を拝借。M-作用を持つ対象。
  • RA, AL と書くと具合がいい。

その他、重要な関手

  • 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

  1. なんらかのデータ型、データ領域が対象
  2. なんらかの計算処理/計算主体が射
  3. 計算処理/計算主体を計算エージェントと呼ぶことがある
  4. 計算エージェントは内部と外部をわかつ境界を持っている
  5. 入出力は、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

この圏を 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も、総称関数も依存型も、当然に圏論で現象記述(定式化)できるよ。当たり前だ。

今日のモノイドさん、モナドさん

  1. 有限カウンタ 0から9 有界
  2. 有限カウンタ 0から9 サイクリック(ラップアラウンド)
  3. 出力モードのテキストファイル
  4. タートルグラフィックス ペンなし
  5. タートルグラフィックス ペンあり
  • 状態値と作用値と遷移
  • あるいは、位置と力と運動
  • タートルグラフィックスのコマンドはアフィン変換として考える
  • タートルグラフィックスの軌跡の扱いが少し面倒かな

それっ、クライスリ圏

状態値は無視して、作用値=モノイドの元、作用の結合(合成)=モノイド演算 として
クライスリ射とクライスリ結合を作ってしまえ。

結合法則と単位律も直接に証明しよう。

実例で考えると、状態空間への更新リクエスAPIを使う関数だよね。

ラッピングを使ってみよう

  • オブジェクト指向風の実行環境の上で実装するってことだね
  • アンラップできるところがミソ
  • アンラップがあるので、ラッピングは単射(埋め込み)
  • 既にクライスリ圏を作っているので、ラッピングは関手だと言っていい

ラッピングを先に考えると

Dがマグマ、Cが圏、F:D→C という対応があり:

  1. Fは単射
  2. Fはマグマの結合演算を保つ

このとき、Dは半圏であり、Fは半関手。

さらに、Dが反射的マグマ、Cが圏、F:D→C という対応があり:

  1. Fは単射
  2. Fはマグマの結合演算を保つ
  3. 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種)が必要だが、それはアドリブ。