|
|
||
「時間が巻戻る」、あるいは「時間が循環する」話のことを、無限ループとか言う表現が一般的ではあるんだけれども、このループ構造を再帰構造として表現しても面白いんじゃないか、みたいな話をTwitterに書いたところ、面白がってくれた人がいたので、メモしておく。
その発想が生まれたのは、最近はめっきりプログラミングばっかりやっていて、関数型言語というのを扱っていたときだった。Haskellという関数型言語は制御命令として反復を持ち合わせていない。じゃあ反復をどのように表現するのか、といえば自分自身の機能を呼び出してやることによって成立している。自分自身の機能を自分から呼び出す方法のことを、プログラムでは「再帰」と呼ぶ。これを使って、Haskellは反復したりする。
プログラムの場合、行頭から行末に掛けて、命令を処理していくのが一般的で、それを「手続き型言語」と呼んだりする。この場合、当然のことながら制御命令として反復する。制御命令の反復は、反復する範囲を指定して、その間をぐるぐると回りつづける……という理解をする。これが一般的に思われている「物語のループ構造」というもので、要するに「8月1日~8月31日」を繰り返し実行しているという理解をする。その一方で、再帰構造の場合だと、自分自身を呼び出しているわけだから「8月1日から8月31日」を生成する機能があったとして、7月30日は「8月1日~8月31日」を生み出す、と考える。同時に、8月31日にまた「8月1日~8月31日」という機能を呼び出すことによって、連鎖的に「8月1日」が生まれるという話になる。どっちにしろ「8月1日」が何度もやってくるのには変わりないのだが、「8月31日」の機能が「8月1日」に戻り実行しなおされるのか、あるいは「8月1日」がもう一度呼び出されるのか、もしこの二つに差異があるとするならば如何なる差異なのか、ということを考えてみると楽しいかもしれないなと思ったりした。