このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

論理、計算、資源 -- 無神論者がなぜ神を語るのか

たいそうな見出しの割に、たいしたことは書いてないっす。*1

先日のエントリー「未定義についてもう少し -- 部分関数、三値論理、超越者」で、神様=超越者の話題を出したのですが、だいぶ以前の「論理を身に付けるには」でも「神様を信じなさい」みたいな話をしてます。

もちろん僕は牧師さん*2ではなく、それどころか無信心の無神論者です。でもね、例えば古典論理の論法(reasoning )を理解しようとすると、神様を仮定せざるをえない、神様なしでは成立しえない論法だと思うのです。とはいえ、信仰・信心とは無関係に、人間にはできないことをやり遂げる能力を有する存在を受け入れれば、それで済むハナシです。「神様」より「超越者」といったほうが少しは宗教臭さがぬけるかな?

デスパレートな関数たち


[追記 date="2008-05-10"] これを書いた当時、「デスパレートな妻たち」という海外ドラマをNHKで放映していました。desperateを辞書で引くと、「自暴自棄の、やけくそになった」とかです。

さてと、次の2つの関数を見てください。記述構文はJavaScript、ただし、コメント内の x : Integer は型宣言のつもりで、「引数xの型は整数に限る」と読んでください。


/* x : Integer */
function sqrt1(x) {
if (x < 0) throw "error";
return Math.sqrt(x);
}


/* x : Integer */
function sqrt2(x) {
if (x < 0) while (true);
return Math.sqrt(x);
}

どちらも、引数xが負のときは異常な動作をします。sqrt1の動作は、“異常”とはいえ、まー常識の範囲内の振る舞いでしょう;例外を投げるだけ。が、sqrt2ってばヤケになって無限ループに入るという、なんか切れると恐いヤツ。

sqrt1とsqrt2の異常動作は全然違うように思えますが、実は大差ないんです。どちらも結局、終了時に破綻のシグナルを出して、終わるのですから。えっ? sqrt2は終わらないだろう、って。いえ、終わりますよ、無限時間後にね。

いずれは破綻するのだ、いずれはね

もっと簡単な例を出しましょう。


function foreverLoop() {
while (true);
}


function foreverRecursion() {
foreverRecursion();
}

foreverLoopはいつまでも終わらず、foreverRecursionはしばらくしてメモリー不足(使い果たし)のエラーが出るケースが多いでしょう。でも、ループ回数が一定値を越えるとエラーにする処理系もあるし、メモリの使い果たしを監視しない処理系もあるのでなんともいえません。

適当な正整数Nを決めて、ループをN回まわるか、スタックフレームをN個使った関数は処理系が強制終了させ、エラー(例外発生)となることにしましょう。そうすると、foreverLoopとforeverRecursionの挙動は区別が付かず、時間または空間(メモリ)という資源を食いつぶして破綻する関数に見えます。

Nをどんどん大きくしましょう、必要ならメモリも足して。Nがいくら大きくなっても、相変わらずforeverLoopとforeverRecursionの区別はつきません。Nが無限大までいっても事情は変わらず、無限の時間または無限の空間を食いつぶして破綻します。破綻を先延ばしすることはできますが、いずれは破綻するのです! 「いずれ」が無限時間後であっても。そして、破綻はエラー(例外)で通知されます。通知が無限時間後であっても。

アキレスは亀に追いつく

「無限時間後にエラーとなる」と言われても、我々は無限の時間が経過した“後”を体験できません。そう、超越者しかそのエラーをキャッチできないのです。それでも、我々は超越者の気分を想像することができるし、超越者のパースペクティブを擬似的になら体験できます。

有名なアキレスと亀を持ち出しましょう。話を簡単にするために、亀は100m先に止まっているとします。アキレスは100mを10秒ちょうどで走るので、スタートから10秒後には亀に追いつきます、っていうか、止まっている亀にタッチできます。

いいですよね、10秒で亀にタッチした“後”のアキレスの姿、想像できるでしょ。Vサイン出してニコッと笑っていますね。

さて、アキレスは50m地点で「半分まで来た」と思います。75m地点では「さらに半分まで来た」と思います。もちろん、87.5m地点でも「さらに半分まで来た」と思います。律儀に思い続けると、アキレスは無限回「半分来た」と確認したはずですね。でもアキレスほどのランナーなら、内心で無限回の確認をしたところで、体は勝手に走り、10秒後に亀にタッチ、その“後”Vサインです。

はたから見てる我々は、アキレスの内心における無限回の確認を気にも留めず、亀にタッチとVサインを観測するでしょう。同じように超越者は、foreverLoopやforeverRecursionが無限の時間(回数)や空間(メモリー)を消費する過程は気にも留めず、資源消尽の結果のエラー発生やエラーのキャッチを観測できるのですね。

これで、「神様になった気分」のオハナシは終わりです。



whileループと再帰がある抽象レベルで区別付かないことは算術計算*3でも示せます。次を参照してください。

*1:最近、ダイアリーがtumblr化しているので、小難しげな見出しにしてみたかったんですが、内容が追いついてない。

*2:牧師と神父ってどう違うんだっけ? 憶えてみるけどすぐに忘れる。

*3:無限級数の計算が入るので、厳密には算術的とは言えませんが。