身体がばらばらになりました、と熱を帯びた人形が囁いた。私がばらばらになんかなっていないよと言うと、まるでばらばらになったような感じがするのです、と、ふうふう息をして答えるのだった。

 マリア、硝子の瞳、シルクの髪、陶器の肌、緋色の口唇。その中枢機関は盛んに燃えて、自らを焼き尽くさんとしていた。寝台の中のそれは、呼吸の都度に苦悶の表情を浮かべた。魔法の茨に絡め取られるように、逃れようともがくほど締まる不可視の電子鎖が、哀れな人形を緊縛しているのか。暑さを訴えてブランケットを剥ぎ衣類を脱ぎ捨てようとするので、急激な温度変化こそが危険なのだと教えるが、私はマリアのしたいようにさせるだけで、決してブランケットを掛けてやろうとはしなかった。

 ゆめを、ゆめをみるのです。ふだんは夢なんて見ないのに。胸元を開けて、紅潮した頬は汗一つかかない。すごく、こわい、夢ってこんなにこわいのですね、こんなもの、よく皆みていられますね――星の散るような瞬きにミンクの睫毛を揺らす。もはや自動人形の身に落ちた、言い換えればそこまでして存在していたいとそのときは思ったということなのだが、そのマリアに、もう夢を見るような機能は備わっていないはずなのだが。

 もうすぐメディサンが来るからねと声をかけても、首を横に振った。そんなのいりません、あなたが追い返してください、と。彼らはわたしにゆめみさせるのをやめるでしょう、ひさしぶりに生きてるかんじがするのです。もうすこし、この生のくるしみを、わたしに味わわせてください。

 ヒューズの飛びそうな高熱を発しながら、なおもマリアは言葉を紡ごうとする。どうしてこの機関は、いうことをきかないのでしょうか。まるで、わたしみたいですね。あのときも、あなたはわたしをとめてくれたのに、わたしったら、それで、こんなふうになっちゃったって、ききましたけど。

 私は苦笑する。いつだってそうだ。マリアは自分がまるで知らない物語をずっと気にしている。脳データのバックアップと、残った彼女のかけらを寄せ集め、新たな容れ物に入れてできたのがマリアだから、どうしたってその経緯は伝聞になってしまう。

 夢のことを、きかないのですね。

 だってマリア、きみは怖い夢を見たろう。思い出させては可哀想だから。

 お心遣いありがたく頂戴します。それでは、やめておきます。

 今日のマリアはおしゃべりだね。

 口元だけ、ふふと笑う。おこられてしまいました、と熱い溜息をつく。実際のところ、私は微塵も心配をしていない。代替可能なボディはテセウスの船、ストア可能な記憶データ。だからいつだって本気になって心配できない。それでも思いやるというのが、生きている人間の美徳であり特性なのかもしれないが。

 あと30分もすればメディサンが到着する。内燃機関で焼き爛れた臓腑を、灰となった躯体を、私は再び見るのであろう。ぐしゃぐしゃに泣きぬれながら、彼女の親指を、耳の軟骨を、拾ったのを思い出す。私にとってはいつまでも鮮明なあの光景を、この人形は知らない。こうして煉獄に私を残していくのだろう。君のささやかな復讐は成功した。この憎悪をひとりで抱えたまま、私は人生の終わりまでマリアとともに在ろう。*1

 

*1:https://twitter.com/murashit/status/925249075733184512 から2割くらい借りてきてガラクタを混ぜたアイディア

(これは 2015/12/10 23:42 に書かれたものです)

想定される読者:プログラミングの記憶はないが、経験したことがあるはずのひと

末尾呼び出しって知ってる? 英語だとテイル・コール(tail call)なんだけど。
例えば「0からxまでの総和を返してくれる関数sum」を考えてみるじゃん。
C言語だと、

int sum(int x){
  int ret = 0;
  while(x>0){
    ret += x;
    x--;
  }
  return ret;
}
int main(){
  return sum(10);
}

こんな感じかな。Cとかは手続き型っていうんだけど、再帰っていう、自分自身が呼び出せる関数型の言語だと、

let rec sum1 x = if x < 0 then 0 else sum1 (x-1) + x

丁度こんな感じで書ける。これはOCaml
ただこれは再帰呼び出しになってなくて、次が再帰呼び出しになってる例。 sum1 x sum2 x 0 は同じ値が返ってくる。

let rec sum2 x i = if x < 0 else sum2 (x-1) (i+x)

何が違っているかっていうと、 else の後を見てほしいのだけど。 sum1 は、 sum1 (x-1) を実行したあとに、その値を使って x を足し込んで値を返さなきゃいけない。 sum2 は、呼び出した sum2 (x-1) (i+x) がそのまま sum2 の返す値になっている。自分自身を呼び出したあとに残っている仕事がなくて、再帰したあとの値がそのまま自分の返すべき値になっているというのが、末尾呼び出し。
これを最適化するのは結構簡単なんだけど、関数型言語においてはそれなりに強力なのです。演算が劇的に高速になる。
例えるなら、
家から大学に来て授業を受けたあと、塾でバイトをして、お店にごはんを食べに行き、家に帰って寝る
ということをしなきゃいけないとき、これを末尾呼び出し最適化しないままでは、
家から大学に来て授業を受けたあと、塾でバイトをして、お店にごはんを食べに行き、塾へ戻ってごはんを食べて来たと言って、大学に戻ってバイトをしてきたと言って、家に帰って寝る
ということをしている。仕事があるならもちろん戻らなきゃいけないんだけど(まだ塾で予習をしなきゃいけないとか、大学に荷物を置いて来たので取ってこなきゃいけないとか)、用もないのに戻るのはしんどいよね。
末尾呼び出し最適化をすると戻らなくて良くなる。つまり直帰ができるということ。
家から大学に来て授業を受けたあと、塾でバイトをして、お店にごはんを食べに行き、すぐさま家に帰って寝る
ということができる。それはなぜかというと、大学と塾を去るときに仕事を残してきていないことが分かっているから。
仕事を残して来てないかどうか判断して、ないなら直帰できることを覚えて行動するのが末尾呼び出し最適化なんだよねー、って先生が説明してて、超分かりやすくて面白かったのでした。えっ、それだけ? うん、それだけ。

想定される読者:末尾呼び出し最適化を知っている人

先生が末尾呼び出し最適化を家から大学に行って帰るのに例えてて面白かったんだけど。
「みなさん大学が終わったらアルバイトがあるのでと塾に行って仕事をし、腹が減ったなあとお店へ行ってごはんを食べたら、もう直帰したいですよね? そこからまた塾へ戻ってごはんを食べて来ましたと報告をして大学へ戻り、バイトしてきましたと言ってやっと家に帰ってベッドに入るなんてことはしませんよね。流石に仕事がまだ残っているときはレストランでごはんを食べた後に塾へ一度戻って仕事をしなきゃなりませんが、基本的には直帰したいという想いをみなさん持っているわけです。末尾呼び出し最適化をすると、みなさんはこの授業が終わったら塾でバイトをして、レストランで夜ごはんを食べ、そして家にすぐ帰って眠れるというわけです」
と、先生が末尾呼び出し最適化を説明するとこうなったのですが。ユニークだよね。

▲▽▲▽

シヲリは会話にぎこちなさを感じていた。テーブルの向こう側に座っているひとの顔がぐにゃぐにゃして見えるのだった。たあいのない話にへらへら笑い、自分もまた日常の話をするという、つまらないやり取りがたまらなく楽しかったのに、今は自分が何も話せないのを知っていた。シヲリは、飢えていた。自分が何かを理解していることを認識したかった。何かを説明できることは、その何かを理解していることをentailする。シヲリは何も語ることができなかった。何も自分は知らないのではないかと思った。マクドのサイズフリー百円で買える炭酸は砂糖水のくせに苦く感じた。歯車が噛み合わない、と思った。シヲリは狂っているのは会話の歯車ではなく自分自身の認知の歯車だということを知った。眼はうつろで、目薬を差してもさっぱり何も変わらなかった。それは目薬が200円もしないからではないと思う。シヲリの血液の循環がおかしいからだと思った。もっともっと、血液がごうごうナイル川のように流れてくれれば、私の思考もずっとずっとクリアになって、バイカル湖のように透き通るはずだと思った。ずっとずっと先を見通したいと思った。なのに身の回りをとりまく些細な一場面すら説明することができなかった。ストローは弾力が弱く噛み潰せば戻らなかった。いにゃいにゃと口にくわえている間に目の前に座っているひとは変顔をするのでシヲリはむかむかした。さっぱりおもしろいと思えない自分にむかむかしたのだった。
なんで最近変顔するの。
手持ち無沙汰だから。シヲリは何も話してくれないし。
全く以てその通りだ。シヲリは何も話してくれない。シヲリは自らに問いかける。シヲリは何を話すのか。何も話せないのは何故か。日常が空虚だからか。いいえ、日常は空虚どころかすべきことが目白押しでほとほと困り果てているほどだ。それでは考える余裕がないのかと自問した。いいえ、私は何も考えてすらいない。思考のリソースは有り余るべきだ。それなのに空きメモリは不足していて、ああ、それでは断片化しているのだろう、今日はゆっくりお風呂に入って眠りに就いてデフラグしよう、それがいいと提案された。そうだね。シヲリは瞬きを繰り返した。家に帰ったらアレルギー用の目薬を差そう。あれは1500円くらいしてとても高いのだ。きっとそれなら今の私にもよく効くだろう。そんな胡乱な思考をする自分を笑ってシヲリは眼を伏せるのだった。