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

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

指標の圏

具体的な指標=コンピュータッドの圏は面白い。単純そうだが実際は色々と複雑で、ジャングルを探検する気分。

指標の射は基本射〈basic morphism〉と拡張射〈extended morphism〉に分けて考えたほうがいいようだ。基本射は、コンピュータッドとしての射。拡張射は項モナド(構文モナド)のクライスリ射。

で、射の方向が実に紛らわしい。どっちを順方向にするかを決めておいたほうがいいな。基準となるのは、部分指標の包含射 Δ⊆Γ をΔ→Γとみるか、Γ→Δとみるかだろう。仮に、Δ→Γを順方向とみると、包含に対応する制限子はΓ→Δだから反対になる。制限子は特殊な変換子〈トランスフォーマー〉とみなせるから、変換子も逆方向の射となる。

変換子はリダクト関手と同じ方向になるから、これはやはり指標射の反対射とみるのがよさそうだ。つまり、順方向の指標射は変換子の反対射。

改名子は同型射(可逆射)だから、方向はどうでもいいが、変換子の方向と揃えておいたほうがいいだろう。

 rename{ top to peek} signature {type S, V; top : S -> V; push : S*V -> S; pop : S -> S|eror}
=
 signature {type S, V; peek : S -> V; push : S*V -> S; pop : S -> S|eror}

次と同じ、

transformer (instance St of Stack) to (instance of ?)
{
  S := St.S;
  V := St.V;
  ppk := St.top
  push := St.push;
  pop := St.push;
}

方向は、リネーム前の指標 → リネーム後の指標、旧名 =: 新名 または、新名 := 旧名。

インスタンスは特殊な変換子になる。

instance of ToggleSwitch {
  S := bool;
  isOn := (s:S):bool => s == true;
  isOff := (s:S):bool => s == false;
  toggle := (s:S): S => s? false : true;
}

transformer (instance _ of Empty) to (instance of ToggleSwitch)
{
  S := bool;
  isOn := (s:S):bool => s == true;
  isOff := (s:S):bool => s == false;
  toggle := (s:S): S => s? false : true;
}

次に部分インスタンス

partial instance of Counter {
  C := int;
}

transformer (instance X of singnature {init: -> int; up : int -> int})
          to  (instance of Counter)
{
 C := int;
 init := X.init;
 up := X.up;
}

インスタンス化(具体性が増す)の方向と変換子の方向は逆。

あとはパラメータ化。パラメータ化は指標に対する操作で、おそらく指数対象を作ることになる。もし、指数対象がパラメータ化指標なら、射=変換子の逆に対して、射の指数は Sig×Sigop→Sig という反変共変の二項関手になるので、取り扱い注意。

指標をワイヤー、変換子をノードにした絵を描くといいと思う。