問題4.58 – SICP(計算機プログラムの構造と解釈)その231
問題4.58 次の規則を定義する。 ある人の部門と、 ある人の supervisor の部門が異なる場合。 ある人は、その部門の big shot (黒幕)である。 (assert! (rule (same ?x ?x))) (assert! (rule (big-shot ?person) (and (job ?person (?section . ?type)) (supervisor ?pe…続きを読む
問題4.58 次の規則を定義する。 ある人の部門と、 ある人の supervisor の部門が異なる場合。 ある人は、その部門の big shot (黒幕)である。 (assert! (rule (same ?x ?x))) (assert! (rule (big-shot ?person) (and (job ?person (?section . ?type)) (supervisor ?pe…続きを読む
問題4.57 問題文が非常に解りにくい… "person-1 が person-2 と同じ担当である" というのはすぐ理解できるが、その次の条件がよく解らない。 (assert! (rule (same ?x ?x))) (assert! (rule (replace ?person-1 ?person-2) (and (or (and (job ?person-1…続きを読む
問題4.56 a. Ben Bitdiddle が監督している人すべての名前と住所 (and (supervisor ?x (Bitdiddle Ben)) (address ?x ?y)) 実行結果 ;;; Query input: (and (supervisor ?x (Bitdiddle Ben)) (address ?x ?y)) ;;; Query results: (and (sup…続きを読む
問題4.55 a. Ben Bitdiddle に監督されている人すべて (supervisor ?x (Bitdiddle Ben)) 実行結果 ;;; Query input: (supervisor ?x (Bitdiddle Ben)) ;;; Query results: (supervisor (Tweakit Lem E) (Bitdiddle Ben)) (supervisor (…続きを読む
プログラムが実際に動かないとつまらないので、今回も先に評価器を実装する。 "4.4.4 質問システムの実装" からの手続き群を丸写しする。 stream.scm、put、get の各手続きは3章で利用したものを使う。(p159) stream-append は 3.5.3節のものを、tagged-list? 、prompt-for-input は4.1節の超循環評価器のものを利…続きを読む
問題4.54 pred-value が false の場合に失敗継続を呼び出す。 (define (analyze exp) (cond ((self-evaluating? exp) (analyze-self-evaluating exp)) ;; 省略 ((require? exp) (analyze-require exp)) ;; 省略 (else (error "Unknow…続きを読む
CSV ファイルのレコードに重複するカラムがある場合に、そのレコードを削除する Gauche スクリプト。 以下のコードでは *check-column-index* を定義して2番目のカラムでの重複をチェックしている。 (use text.csv) (use gauche.collection) (use srfi-13) (define *check-column-index* 1) (def…続きを読む
Gauche でクイックソートを利用して CSV 形式のデータをソートする。 クイックソートについては、"M.Hiroi’s Home Page / お気楽 Scheme プログラミング入門" を参考にした。 この例では、CSV ファイルの読み込みは省略して、リスト化されたダミーデータを定義して使っている。 CSV ファイルの読み込みについては、"Gauc…続きを読む
make-csv-reader で、入力ポートを引数とする手続きを作る。 この手続きはポートからレコードを1つ読み込み、フィールドのリストを返す。 port->list を使って、返されたフィールドのリストをリストに追加していく。 (use text.csv) (define (read-csv file) (let ((reader (make-csv-reader #\,))) (cal…続きを読む
問題4.53 (amb) があるために、if-fail の第1引数はバックトラックを繰り返して prime-sum-pair により全ての組み合わせを探索する。 また、permanent-set! で pairs にセットした値はバックトラックしても元の値に戻されないため、成功した組み合わせは pairs に追加されていく。 全ての組み合わせを探索し、選択を使い切った時、if-fail の第1引数…続きを読む