モジュール接合言語
ゴグエン先生が、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を使って定義できる。