SICP 3.3.5


今日は SICP の 3.3.5 「Propagation of Constraints」と 3.4 「Concurrency: Time Is of the Essence」を読みました。

Propagation of Constraints は、一昨日に Implementing the constraint system の直前まで読んでました。最後のちょっとのところで少し苦しみました。

制約ネットワークの伝搬系をオブジェクトベースプログラミングで実現しているのですが、伝搬はわかるのですが、すでに伝搬させた値をキャンセルする動きがいまひとつ捉えにくかったのです。ぼくが一番、気になったのは、加算器が記憶していた値を忘れるときに動かす以下のコードの最後の式です。

(define (process-forget-value)
(forget-value! sum me)
(forget-value! a1 me)
(forget-value! a2 me)
(process-new-value))

process-new-value は値を伝搬させるための関数なのですが、すでに値を忘れてしまっているのにいまさら伝搬させても意味があるのだろうかというのが疑問点でした。

結局、学生さんとのしばしの議論の末に、これが役に立つ場合も存在するけれど、相手が adder の場合には意味がないかもしれないという結論を得ました。((さて、どういう場合に process-new-value が意味を持つのでしょうね?))

SICP から抜粋した以下の分がここを解説しているらしいのですが、このことのいわんとすることを受けとめるのは骨が折れます。

>
The reason for this last step is that one or more connectors may still have a value (that is, a connector may have had a value that was not originally set by the adder), and these values may need to be propagated back through the adder.

SICP 日本語版では subtle を「微妙」と訳しています。辞書を引くと「微妙な、とらえがたい」という意味があるようですが、「器用な、巧妙な」という別の意味もあります。もしかすると和田先生の年代の方が使われる「微妙」には「巧妙」に近い意味があるのかもしれませんが、「最近の若い者」が使う「微妙」の持つ大雑把な意味とここでの subtle は大きくずれています。SICP 日本語版で「微妙」を見たら、それが微妙なことではないと覚悟した方がよいようです。