bonotakeの日記

元・ソフトウェア工学系研究者、今・AI系エンジニア

モニャドセミナーには参加しなかったんだけど 続き

いきなりの続き。朝ごはん食べながら、ちょっと書き足し。
cf. http://d.hatena.ne.jp/bonotake/20090424/1240526962


自分がざっと読んで勝手に解釈した限り、ですけど。しりとりの圏をプログラムに例えるなら… 例えばJavaで、対象はこんな風なクラスで定義されているんですよ。

abstract class ひらがな {
  void moveTo(ひらがな);
}

classextends ひらがな {...}

classextends ひらがな {...}

...

で、射はこのひらがなクラスのオブジェクトを1つ受け取って、やはりひらがなクラスのオブジェクトを返す関数。
更にいうと、関数の中で許されている操作は、受け取ったオブジェクトのmoveTo()メソッドの呼び出し(呼び出しは何回やってもよい)と、returnでそのオブジェクトを返すだけ。

たとえば「たぬき」という射は、こんな関数。(ややこしいので、関数名のプレフィックスとして morph とつけることにします)

き morphたぬき (た obj) {
  obj.moveTo(ぬ);
  obj.moveTo(き);
  return obj;
}

記法が怪しいとか型チェックは大丈夫なのかとか、そういう心配はおいといて。

でさっき問題になった、「あ」という射と「ああ」という射の違いは、多分こんな感じ。

/** 恒等射 */
あ morphあ (あ obj) {
  return obj;
}

/** 恒等射じゃないよ */
あ morphああ (あ obj) {
  obj.moveTo(あ); // ← ココが違う!
  return obj;
}

こうすれば合成したものと、直に定義したものが同じになるはず。(たとえば あ;あじあ=あじあ、ああ;あじあ=ああじあ)
どうでしょう?まぁ、元のセミナーに出たわけでもないし、なので自分勝手に圏を再定義しています。その意味で外してたらすいません。

1つ強調したいのは、上の あ と ああ の違いでわかるように、a -> a 型の射だからといって恒等射とは限らない、ってことですね。単に「域と余域が同じ」という射は endomorphism といいます(日本語は知らない)。恒等射ってのは endomorphism の中でも非常に特殊なもので、合成しても合成してないのと同じ効果が得られるもの、です。型では決まりません。

しりとりの圏で気になることの1つは、恒等射の扱いが見た目以上にややこしいことですかねぇ…


というところで、ここで本当のタイムアップ。(※ 後でちょびっと追記)

注:bonotakeは、amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイト宣伝プログラムである、 Amazonアソシエイト・プログラムの参加者です。