SICP 4.4.4.5 Ex. 4.73

  • 投稿日:
  • カテゴリ:

Ex. 4.73

ここも前向きに考える。将来の修理のために、プログラムの下位層での無限ストリームを遅延させようとしているとする。

flatten-stream は、interleave を使って car と cdr を混ぜ合わせ、また cdr にだけ delay が入っている。

つまり、(flatten-stream (A B C)) は (A1 delay-B1 delay-C1 A2 delay-B2 delay-C2 ...)という感じのリストを返す。

このように、flatten-stream が遅延するので、これを呼び出す stream-flatmap も遅延し、さらにこれを呼び出す simple-query も遅延する。

simple-query について、Ex. 4.71 で入れた delay と Ex. 4.73(この問題)で入れた delay の役割分担はこんな感じ。

入力フレームストリーム
(flame1, flame2, ....無限)  ← 入力フレームストリームが無限 (Ex.4.73 (この問題)で対処)
  |        ↓
  ↓     flame2の拡張 (flame2-1, flame2-2, .. 無限) ← flame2の拡張が無限 (Ex.4.71で対処)
flame1の拡張 (flame1-1, flame1-2, ...無限)  ← flame1 の拡張が無限 (Ex.4.71で対処)

apply-rules について

apply-rules も stream-flatmap を呼び出している。

で、気づいたが、stream-flatmapはストリームの最初の car を遅延しない。なので、ストリームの最初が無限ループする rule である場合

apply-rules → apply-a-rule → qeval → apply-rules → apply-a-rule ...

という無限ループがまったく遅延されない。結局一番肝心な無限ループを起こす最下層部分が放置されたままである。

一体なんのために、Ex.4.71, 4.72, 4.73 と無限ストリームを一所懸命、遅延させてきたのか?

ほんとにくそプログラムだなあ。(-.-;)ボソ