SICP 4.4.4 質問システムの実装

  • 投稿日:
  • カテゴリ:

amb評価器とうって変わって継続は一切でてこない。

ストリームの処理だけで実装している。あんまりややこしいところはない。

p286 4.4.4.5 データベースの保守ででてくる、get, put, assoc の定義がないように見えるが、 これは、3章 p159のものを使っている。注意。

DBの格納先は、2箇所ある。

①1つは THE-ASSERTIONS、THE-RULES というグローバル変数で、

②もう一つは、3章 p159 で出てくる make-table というクロージャの中の local-table という変数である。

(local-table から THE-ASSERTIONS、THE-RULES は完全に復元できるのに、わざわざ2重に持っている。理由はよく分からない。)

local-table は2次元のリストで第1次元のキーはsonとかjobとかで、第2次元のキーは assertion とか rule とかである。 table

こんな感じでDBが格納されている。

本文中 index と呼ばれているのは、表明や規則の名前のこと。 job とか son のことである。一意の番号とかではないので注意。

(get-indexed-assersions '(son ?x ?y))

とすると、第1次元のキー = son、第2次元のキー = assertion でDB検索して

((son Adam Cain) . (delay (son Cain Enoch) . (delay (son Irad Mehujael) . ... )))

というのが返ってくる。delay を省くと分かるが、単なる son 表明のリストである。

((son Adam Cain) (son Cain Enoch) (son Irad Mehujael) ... )

格納されたDBレコードに delay が付いているのは、store-assersion-in-index 関数の中で cons ではなく、cons-stream を使っているためである。

しかし、この delay はハッキリ言って無用である。

ストリームを遅延させる理由は、①ストリームが無限であるか、②未定義の変数をストリームに混ぜる場合であるが、DBの表明は有限個のレコードであり、未定義の変数も含まない。 なので遅延させる理由がない。(理由なく遅延させてもいいけど)

実際、store-assersion-in-index 関数の中で cons-stream を cons に置き換えても質問システムは動作する。