SICP 読み (117) 3.3.4 ディジタル回路のシミュレータ

この節はオブジェクト指向な教材としては良質だな。別なエントリ起こして ruby か何かで実装してみたいな、と。

問題 3.31 の前に

この問題の検討中で直前エントリな解が微妙である事が判明。ある単位時刻の中で複数の処理が並列に実行される模様。ってか、こんな複雑なシミュレータをたったの 8 頁でヤッツケちゃってるこの本は何だ。
話が進んでいく手順として

  • wire オブジェクトの存在を前提として
  • 半加算器、全加算器の解説
  • 上記実装に必要な or-gate、and-gate、inverter の実装の検討
  • wire オブジェクトに必要なメソドの列挙 (上記の degital function gate の実装に必要な手続き)

が列挙されつつ (微妙に順番逆だな)、ワケワカなまま、話が進む。次はこれらの部品を用いたシミュレータの実装、という部分にフォーカスが移り、agenda が中心となって話が進んでいくみたいなんですが、凄く濃い。

問題 3.31

それは良いとして、微妙な現実トウヒ的に問題を検討。回線の信号の変化を契機として手続きが駆動されるのは非常に興味深い。ってゴタクは略して検討内容を日本語にしてみる。

初期化が必要な理由

例示されている half-adder で言うと内部定義されている d とか e という回線の状態を初期化するために add-action! される手続きの実行が必要なため。half-adder ではオブジェクトが生成された時点で e の回線の状態 (signal) は 1 になっていなければならないが、add-action! される手続きが実行されなければ 0 のままになる。

システムの応答はどう違うか

(set-signal! input-1 1) しても sum の値は変わらない。ので probe も動かないんだと思うのですが、経過時間はどういった状態になるんだろうか。一応 d 回線の状態は変わるから 8 は経過するのか。
次に (set-signal! input-2 1) したら例示されているものと同じ出力になるはず。

追記

実装してみないと当ってるかどうか分からんが、このままエントリ投入。あと、次の問題を検討した後に ruby か何かでもやってみたいな、と。

追記その2

そういえば、例示されている実装では

(set-signal! input-1 1)
done

とはならないように読めるんですが ...

って SICP なコンテンツからコピペで試験してみたら done って出力。propagate が出力している。(とほほ