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

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

モジュール接合言語

ゴグエン先生が、MCL(Module Connecting Language)と言っていた。なーんか、今さらではあるが、いきなり分かってしまったよ! 大局的プログラミング(programming in the large)のMCLのなんたるかを。

記法を色々使うが、圏論記法、中間記法、実用記法としよう。対象が名前の有限集合(指標のもっとも簡単な例)、射がモジュールである圏を考える。

圏論記法 中間記法 実用記法
結合 M;N N[M] N[M]
制限 M;πA A.M {a, b}M
弱モノイド積 M∨N M, N M, N
改名 ρab (b<-a).M {a'<-a, b'<-b}M

中間記法と実用記法がほとんど同じだな。(a, b とかが、実用記法では名前、その他では名前の有限列の意味で使われている。こりゃ混乱するだろうが、直さないからカンベン。)

制限は(インターフェースの)ナローイング。M;πA は、正確にはMの余域をYとして、πYA:Y→A を射影としての結合 M;πYA。このとき、AはYの部分集合でなくてはならない。「…の部分集合」という概念をフォーマルに定義するには inclusive categoryが必要になるが、今は不要。

改名(リネーミング)は、a, bを重複がない列として、aとbが同じサイズのとき定義される。列aの順序を忘れた集合を |a| とすると、ρab:|a|→|b| という射になる。

弱モノイド積は、dom(M)∩dom(N) = 空、cod(M)∩cod(N) = 空 のときだけ定義できるモノイド積。単に有限集合を対象とするならば、完全なモノイド積が定義できるが、実用上の制約から弱モノイド積を定義する。弱モノイド積も完全なモノイド積とほとんど変わらない。弱モノイド積で十分。

実用記法の例をだせば:


module M = N[{a, b, x<-c}K, {y<-c, d}L, Q];

実用記法では、射影によるナローイングとリネーミングは同じ記法を使う。上の例は次のようにしても実現できる。


from K import a, b, x<-c;
from L import y<-c, d;
from Q import *;

逆に、importの意味はMCLを使って定義できる。