【日記】プログラミングを久しぶりにやった

 かれこれ十年くらい前の話になるが、自分はコンピュータ科学周辺の問題に魅了されており、たぶん御多聞に漏れずということになるのだろうが、たとえばカオスの問題であるとか、自己組織化だとか、それを具体化するライフゲームやセルオートマトンの問題であるとか、マンデルブロ集合とかコッホ集合とか、そんなようなことだった。あとあと調べたらそれは当時最新の発見などではなく、もう少し、十年くらい前に既に見つかっていたものではあるのだが、自分は知らない。知らないのであれば、自分は火を教わった原始人と同じであるので、火を自分の手で改めて発見することに喜びを得てもなんら問題なかろうと思いそれらを解くことを夢見ていた、あるいは、自分の手で辿ることに、新しい問題を発見するとか解くとかいうこととは別で、喜びを感じていたということかもしれない、ところで、当時解いていたことの中には実際に、本当にその分野で中途半端にしか手を付けられていない問題、具体的に言うと「日本語の連続した文字の出現度合い」なのだが、そんなものも含まれていたがどれにせよ自分の手で何か世の中に自分の発見を持ち出すという発想はなく、それにしたところで自分が知るためにその問題を発見し解くのであって、とにかく世の中の問題系に対して歯車として機能するという考えはなかったのだった。
 エクスキューズがずいぶん長くなったが、簡単にいえば趣味でプログラミングをやっていたので、自分のできる範囲のことをやっていて、仕事を週五日間やるようになってからはそんな余裕はなくなったので離れて、それから十年たったということだ。
 だが、たまに頭をかすめる、昔はこんなこともやっていたのだと、まるでおじいさんの思い出話のように湧いて出るのだが、つい先ほど、前から知っていた問題ではあるのだが、コラッツ予想という、数学上の未解決問題で、その機序は学生時代の自分にも理解できるものすごく単純な仕組みなのに、それを証明するどころか、反証も出来ないというありさまであるという問題があって、関連動画をユーチューブで見かけて、その問題はその仕組みと解法の比率にクラクラするので、上記のいろいろな問題系と同様に魅了されていた。が、それも自分にはなぜそれほど複雑になっているのか、わかる気がする。マンデルブロ集合もそうだが、数学上で、一つの手続き、あるいは直線的な操作の結果というものは、すごくおさまりがよく、発散するにしても振動するにしても結果がわかりやすいということがあるのだが、今持っている数値を不定にして、それに対して同じ操作であるが、ある場合にはこう、別の場合にはこうといった具合でどんどん操作を加えて行って、どうなるか、といった問題に関しては、その結果が全く予想しかねる事態を招くということがよく起こる。マンデルブロ集合を成立させる式も、単純ではあるが、その一部分に繰り返しが含まれる。結果は見ての通りものすごく複雑怪奇で地図の海岸線や自然物、はては宇宙にまで譬えられる図形を描く結果となる。コラッツ予想も同じ形であるし、広く言えば、ゲーデルの不確定性原理は、このようなある変数に対して加えられる有限回かどうかわからない操作に関するものではなかったか。それをチューリングがチューリングマシンという架空のマシンを想定して否定的に解いたのではなかったか。
 チューリングマシンは、厳密に現在使っている我々が目の前に持っているマシンと対応する。なんでコンピュータに不正アクセスが絶えないのか。バグと言われる穴のようなものが無数に生じるのか。急に無限ループしてしまうのか。与えられた問題を解こうとして、つい答えられずに静止してしまうのか。その究極的答えはチューリングが、当時目の前にはない今はあるマシンを目の前にして、解き明かし、それは「ある操作を繰り返す」という、人間が行う人為であるとも機械的な自然であるともいえない何だか中間的な位置にある行為が、ゼロになる、無になるか無限になるかある一定の値になるか漸増するか漸減するかなどといった割り切りを拒むということにつながるのではないかと、直感的に思った。
 その困難性が、コラッツ予想の困難に直接対応すると、素人なりに思ったのである。
 話が逸れたが、そんなことをきっかけにして、どうなると思ったわけでもないのだが、というのは、コラッツ予想は、やはりどんな自然数に対しても適応しうる予想であると、直感としては思うのだが、それを改めてプログラムに解かせるということを、久しぶりにやってみた。
 ここからが本題なのだが、その昔に一番主軸として使っていたコンピュータ言語は、Perlという言語だった。今、どういう立ち位置なのかわからない。あとはC言語と、Javascriptをある程度書くことはできたが、すぐに何かを作ろうとする時には、決まってPerlを使うことにしていた。
 知っている人は知っているだろうが、Perlというのは、CGIという、サーバー上で動かしてその出力結果をHTMLとして排出するという、ウェブサイトの構築言語として流行っていた時期がある。今、アドレスを見ても「.cgi」という文字を見ないから、おそらく廃れているのだろう。元々はそれを製作するために勉強していたのだが、Perlという言語の思想に対しても、次第に共振するようになった。
 どういう思想か。これがパッと聞きはイメージが悪いのだが、「どれだけ汚く書いても機能する」ということである。
 その思想は、「There's More Than One Way To Do It.」という言葉にまとめられている。それをするにはたくさんの方法がある。当たり前のことのように感じるのだが、たとえば、一つの数字を表すのに、その変数を数字として処理するのか、それとも数字という文字で処理するのか、また整数とするのか、整数とも解釈されうる有理数として解釈するのか、等々といったこと。
 また、プログラミング言語の肝でもある条件分岐というものがあるが、if~~としながらwhile文でリピートするのか、for(i <= 100)というループにしてもいいしforloop (1 .. 100)なんて書き方もあって、その中身はなんと行列というデータである……等々、要は言語の文法が考えうる限り柔軟に組まれているのである。
 その中でも、僕がその言語の象徴であると思っているものが、until構文とunless構文である。until ()~というループは、そのままwhile ()~の否定形として表せる。while(真) ~というものが、until(偽)~と全く対応するということであり、全体の真偽を反転する式というのがちゃんとあるのだから、この二つの構文はまったく等価であり、普通に考えたら片方は要らないのである。unlessも同様で、条件分岐における、ifのまったく等価な反対物なのである。
 しかし、この「なんだか無駄に感じるな……」という文も、いったん直感的に「これが偽であるあいだにループする……」と思った時に書いてみると、なんかしっくりくるのだ。この、自然言語を書くのと同じような感覚で書ける、不思議な柔軟さを持った言語に魅了された。
 時代ははるかに下って現代だが、久しぶりに書いてみたPerlのプログラミングで、やはり真っ先に思い出したのはこのuntil、unlessの文で、当時よく使っていたのかは覚えていないが、気が付いたら手が書いており、むろん書き換えは可能であるにもかかわらず、これらを使ってコラッツ予想を力技で解きまくるプログラムを書き終えていた。

この記事が気に入ったらサポートをしてみませんか?