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

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

反アクセッサと反ミューテータ

僕は激しく健忘症だ。トシのせいもあろうが、どうも、若い頃から物覚え悪く、すぐさま忘れるほうだったし。でまー、なるべく思い付きは外在化しないとね。

メイヤー先生の影響で、インターフェースをアクセッサ(クエリー)とミューテータ(コマンド)にわけるべきと言っているが、もう少し追加・細分すると:

  • 基本アクセッサ:戻り値が基本データ型
  • 基本じゃないアクセッサ:戻り値が基本データ型ではない(通常は参照、状態型)
  • コンストラクタ:普通の意味、ただし引数は基本型
  • ミューテータ:状態遷移

状態項と反アクセッサ/反ミューテータ

コンストラクタもミューテータも関数形式で書いて(隠れたthisを陽に書く)、次の記号表現を状態項と呼ぶ。

  • 変数、定数
  • コンストラクタ(引数は埋める)は状態項である。
  • sが状態項、mがミューテータ(基本型引数は埋める)なら、m(s)も状態項である。

cをコンストラクタ、mをミューテータとして、特別な状態項 c(x1, ..., xn), m(s, y1, ..., ym)を考えて、

  • f(c(x1, ..., xn)) = xi
  • k(m(s, y1, .., ym), y1, ..., ym) = s

のような等式がKleene等号で(if-definedで)成り立つとき、fをcの反アクセッサ、kをmの反ミューテータととりあえず呼ぶ(ネーミングが激しく良くないから変更するだろう)。

言語理論からの例

$()をコンストラクタ, a(-), b(-)をミューテータとする。状態項は、$(), a($())、b(a($()))など。これらを、ε, a, ba などの文字列と同一視する。反ミューテータa', b'を:

  • a'(ax) = x
  • b'(bx) = x

として導入する。a'とb'は、すべての文字列の集合の上の部分関数として解釈できる。さらに、a', b'を列言語の集合上の全関数と解釈できる。列言語を状態点とする状態空間の上で、a', b'はミューテータとして定義できる。これが、いわゆる「言語の微分」の議論だろう。

ツリー言語の場合には:

  • a#(a) = x
  • a'(ax) = x

のようにして、ミューテータ(アルファベットに対応)aに対して、縦・横二方向の反ミューテータが定義される。ツリー言語を状態点とする状態空間を考えれば、列言語と同様な議論ができる。

ただし、この定式化では並列パージングやボトムアップパージングをうまく説明できない。いずれ、項、時間、状態の概念を変えなくてはならない。

部分関数の完備join半束への持ち上げ

もう少し詳しくいうと、f:X→Yが部分関数のとき、f_0:X→Y+1を普通に定義できる。Y+1はPow(Y)に普通に埋め込んでf_1とする。f_1(a) = {f(a)} or {} となる。∪を使って、f*:Pow(X)→Pow(Y)に拡張できるが、定義からjoin半束の準同型。

部分関数の圏Partialを、完備join半束の圏CJSLattに埋め込んでいる。Partialの力学系はCJSLattの力学系として考えることができる。

almost invertible

インターフェース(指標)Iの部分集合Jがあって、Jはコンストラクタとミューテータからなるとする。(I, J)が仕様Sにおいてalmost invertibleだとは、Jのコンストラクタに反アクセッサが存在し、Jのミューテータに反ミューテータが存在すること。もちろん、反*を定義する等式はSに入っている。

almost invertibleな(I, J, S)のモデルの圏をベースに、パーザー(受理器)概念を定式化したい。(I, J, S) から(I, J*, S*)のような双対を作れる気がする。(I, J*, S*)は全然別な圏の生き物かもしれない。構成可能性(可達性)と観測可能性が双対らしい(http://citeseer.ist.psu.edu/bidoit01duality.html)から、それをミューテータまで広げればいいのだろうか? このへん、わかってない。ダメだー。