昨日5月21日、モニャドセミナー2を開催しました。欠席が2名で、最終的な参加者は26名でした。新規の参加者も2名いらしゃった(懇親会にも両名参加)のがうれしかったです。懇親会には10名(檜山を含めて11名)参加。ありがとうございました。
スライド資料は次のURLからアクセスできます。
スライド「復習:圏の構成要素」の「f;gの結合可能性」が間違っていますから注意(後で修正するかもしれませんが、現状間違ってます。)
まんなかへんの「穴あき木/穴あき生け垣の圏」の話はゴッソリ省略。その他の話題はだいたい触れました。単純化した平面タングル(SPT)をいじるのは作業的に楽しいので、もう少し時間を取りたかったですが、まーしょうがない。
次の2つの圏に関しては、またJavaScript実装を書いてみました。
N(自然数全体)の上の、離散圏(discrete category)
Nの上の、掛け算による遷移(multiplicative transition)の圏
- 名前 : MTNCat (MTN = Multiplicative Transition over N)
- 対象: N
- 射:{[n, x] | x≧1 } (n, xは自然数)
- dom : dom([n, x]) = n
- cod : cod([n, x]) = n*x (*は掛け算)
- id : id(n) = [n, 1]
- ; : [n, x];[m, y] = [n, x*y]
僕の手元にソースコードの雛形があるので、それを埋めただけですが、以前と比べて微妙に修正している点もあるのでちょっと解説します。
N上の離散圏に関して; 対象の集合はN、射の集合もNなので、あえてコンストラクタなんていらないのですが:
// 対象のコンストラクタ DiscCat.obj = function(n) { if (!isNaturalNumber(n)) throw "invalid argument"; return n; }; // 射のコンストラクタ DiscCat.mor = function(n) { if (!isNaturalNumber(n)) throw "invalid argument"; return n; };
これは、対象も射も区別しないで 3 とか書くのが心理的に抵抗がある人向けの気休めです(一応、パラメータチェックは入れてありますが)。var x = DiscCat.obj(3);
と書けば、xに、「対象としての3」が代入された気分がします。var f = DiscCat.mor(3);
と書けば、fは「射としての3」です。単に気分だけの問題ですがね。それと、インターフェースを一様に揃えるため、という理由もあります。
この離散圏の例では、対象のイコールも射のイコールも、JavaScriptのイコールをそのまま使えますが、いつでもそうとは限らないので次の定義をしています。これも、インターフェースを揃えている例です。
// 対象が等しいかどうかを判定 DiscCat.eqObj = function(n, m) { if (!DiscCat.isObject(n) || !DiscCat.isObject(m)) throw "not an object"; return n === m; }; // 射が等しいかどうかを判定 DiscCat.eqMor = function(f, g) { if (!DiscCat.isMorphism(f) || !DiscCat.isMorphism(g)) throw "not a morphism"; return f === g; };
[追記]eqObjが定義されていると仮定できるなら、SomeCat.composable(f, g)(fとgのこの順での結合可能性)は次のように書けますね。
return SomeCat.eqObj(SomeCat.cod(f), SomeCat.dom(g));
今度からこう書こう。以前のは直さないけど。[/追記]
次に、掛け算による遷移の圏ですが、射は自然数のペア [n, x] (ただし、xは正)なので、このままJavaScriptの配列と考えるのが簡単です。しかし実際にはオブジェクトで射を表現しています。たいした理由はなくて、表示のカスタマイズをしたかっただけのことです。
js> MTNCat.mor(2, 3) *3 : 2 --> 6
と、こんな感じになるので、目で見てすぐに、mor(2,3) が対象2から対象6への「3を掛け算する」射だとわかります。
こっちの例だと、対象や射の等しさを単純なイコールでは判定できないので、eqObjやeqMorを書く意味があります。
単純平面タングルの圏のホムセット SPT(0, 0) は、結合(合成)に関してモノイドになってますが、僕はプログラムにする気力がありません。どなたかチャレンジしてみます? グラフィカルなユーザーインターフェースがあったらスンバラシイよね(そこまでやんなくてもいいけど)。