back numbers

6.03.2008

愛・おぼえてますか

愛というのはIのことであり、つまりI(nput)の事だというのは周知の通りだが、かつてSFアニメの副題ともなったこの台詞は果たして、コンピュータと対峙する者への教訓でもあるわけだ。
「Input・おぼえてますか」

コンピュータとは入力と出力の間で情報を加工する装置であると言われるほど、I/Oは計算に欠く事が出来ない要素である。では如何にしてI/Oは実現されるのか。簡単に言ってしまうと、何か物理量の変化を介して之を適当な電気信号へと変換し、この信号が所与の装置から装置へと伝達する工程で適切な抽象度を持った情報となり、そしていつかは物理的な変化量として霧散するのである。例えば赤外線が遮断された回数であったり、受光素子に突入する電磁波だったり、あるいは感圧素子が齎す抵抗値の変化であったり、高密度に配置された磁場だったりが、まずはその装置に最も低レベルの信号として入力される。

装置はその責任の範囲で信号を補足して、またその装置が接続される別の装置に対し、別の装置が責任を持つ範囲で入力を伝達する義務(protocol)を有し、という連環が続く。このような入力あるいは出力の相互的な連鎖をI/Oと呼ぶわけだが、コンピュータ同様に抽象的な立場からこれを観察することになれば、すなわちMonadとComonadの分配則がこれを表現している。

Distributivity for a Monad and a Comonad
詳細は省くとして、ざっくりとI/Oについて言えばこういうことである。入力や出力は先の通り変化を伴なった装置間の一連の状況を言っている。そこでこれをシステマティックに観察するために、ある時点での変化量xと装置TのセットをMonad Txとしよう。Aに接続された装置Dとその装置における抽象度に対応した変化量yのセットをComonad Dyとする。上に述べたように入出力の相互的な連鎖をI/Oと呼ぶのであれば、その状況で補足されている変化の対応f:x -> yについて、以下の写像~の成立が期待される。

~:(x -> y) -> (Tx -> Dy)

そこでMonadとComonadの自然変換λ:TD -> DTを用意しよう。この時、先の写像~でもって変化量の対応がf~となるには次の事を満たせば善いのである。

δ:T -> T T
μ:D D -> D
μ(Dg~)λ(Tf~)δ = Tx
= Tx Tx ; (1)
= Tx Dy
= Dx Ty
= Dx Dz ; (2)
= Dz


更に一歩進んでこのI/Oの実装に踏み込もう。それは畢竟、上述の条件の表示(1)と(2)に対する意味論を考えることに他ならない。何を隠そう(1)こそが「Input・おぼえてますか」なのである。さしあたって(2)は「Output・おしえましょうか」だろう。蛇足ではあるが、次のPrologコードが理解の一助になれば幸いである。

% read_in/1はファイル入力をパースしてシンボル列を切り出す
% パースの際にはバックトラックが生じる(ここでは省かれている)
% しかし副作用を伴なうget0/1でバックトラックは起せない
% そのため補足した変化量は複製され別の述語に託される
read_in([W|Ws]) :- get0(C), read_word(C, W, Cs), read_rest(Cs, Ws).

あるいは、UNIXパイプが如何にして独立したプロセスのI/Oを取り持っているかに思いを馳せて欲しい。

0 件のコメント:

tags

Profile

Taito, Tokyo, Japan
明けども明けども次の埒
hiro.kosh@gmail.com