Ex. 4.71
どう考えても、delay を使うメリットはない。
delay を使ったところで、ruleの無限ループを回避できるわけではない。結局、強制終了するしかない。
無限ループを起こす壊れたソフトが、途中経過を少しばっか印字したからといって許されるわけがない。(少なくとも私の感覚では。)
現状の query システムは、delay を入れていても rule の無限ループは止まらず、結局ユーザが運用で回避することになっている。(無限ループしないよう質問文を工夫する)
ということであれば、割り切って、4章のqueryシステム全体に散らばっているこの遅延関係のコードをすべてなくせばいい。ものすごくすっきりした易しいqueryシステムのソースになる。そして動作も現状とあんまり大差ない(筈)である。
一応、前向きに考えると、プログラムの下の層で delay を入れて無限ストリームの発覚を先送りにしておくと、無限ストリームへの対処を上の層で取り扱うことが可能になる。(例えば query-driver-loop で10個印字する度に、続行?のプロンプトを出すとか)。将来、このシステムを修理するときのために delay を入れていると考えられないこともない。
or についても同じ理由。A or B の B だけを delay させておけば、Aの無限ストリーム、Bの無限ストリームどちらの場合も、無限ストリームの発覚を先送りにできる。(A or B 内のストリーム結合にinterleave を使っているので)