SICP 4.4.4.5 Maintaining the Data Base
一つ分かった。
assertionとruleはそれぞれ、グローバル変数のTHE-ASSERTIONSとTHE-RULESにstreamとして保存される。
両方ともdriver-loopから(assert! ・・・・)で追加できる。
データベースを初期化するには、こんな感じでassertionとruleのリストを作る。
(define microshaft-data-base
'((address (Bitdiddle Ben) (Slumerville (Ridge Road) 10))
(job (Bitdiddle Ben) (computer wizard))
(salary (Bitdiddle Ben) 60000)
(address (Hacker Alyssa P) (Cambridge (Mass Ave) 78))
省略
(can-do-job (computer wizard) (computer programmer))
(can-do-job (computer wizard) (computer technician))
省略
(rule (wheel ?person)
(and (supervisor ?middle-manager ?person)
(supervisor ?x ?middle-manager)))
(rule (outranked-by ?staff-person ?boss)
(or (supervisor ?staff-person ?boss)
(and (supervisor ?staff-person ?middle-manager)
(outranked-by ?middle-manager ?boss))))
))
このリストを、add-rule-or-assertionに順に渡せばOK。
(define (initial-database)
(map add-rule-or-assertion! microshaft-data-base))
(initial-database)
上手くassertionが入っているかの確認は、THE-ASSERTIONSを順に評価すればよい。
gosh> THE-ASSERTIONS
((can-do-job (administration secretary) (administration big wheel)) . #
gosh> ((cdr THE-ASSERTIONS))
((can-do-job (computer programmer) (computer programmer trainee)) . #
gosh>
initial-databaseで登録したassertionが、おしりから順に取り出せる。ruleも同じ。
Exercise 4.70
add-assertion!で、streamをいったんletでold-assertionsに束縛するのはなぜか?
(add-assertion! '(can-do-job (computer wizard) (computer technician)))
(add-assertion! '(can-do-job (computer wizard) (computer technician)))
みたいに、同じassertionを2回追加すると、順にストリームから取り出せなくなる。
The comments to this entry are closed.


Comments
もう一つ分かった。
僕はStreamが分かっていない。
flatten-streamとかが、どういう動きをするのか全然説明できない。
3章に戻れ!
Posted by: なつたん | 2007.09.17 12:21 PM