問題4.71 – SICP(計算機プログラムの構造と解釈)その243
問題4.71 ;;;; 評価機での simple-query 手続き (define (simple-query query-pattern frame-stream) (stream-flatmap (lambda (frame) (stream-append-delayed (find-assertions query-pattern frame) (delay (apply-rules qu…続きを読む
問題4.71 ;;;; 評価機での simple-query 手続き (define (simple-query query-pattern frame-stream) (stream-flatmap (lambda (frame) (stream-append-delayed (find-assertions query-pattern frame) (delay (apply-rules qu…続きを読む
問題4.70 cons-stream により作られるストリームの cdr は遅延評価されるため THE-ASSERTIONS は初期値として与えられた assertion の無限ストリームとなる。 let により一時退避させることにより無限ストリーム化を防いでいる。 ;; 元の評価機の add-assertion! 手続き (define (add-assertion! assertion) (s…続きを読む
問題4.69 問題4.63 のデータベースと各規則の子と孫の関係を利用する。 (assert! (rule ((great . ?rel) ?x ?y) (and (son-of ?x ?w) (?rel ?w ?y)))) (assert! (rule ((grandson) ?x ?y) (grandson-of ?x ?y))) 実行結果 ;;; Query input: ((great g…続きを読む
問題4.68 (assert! (rule (append-to-form () ?y ?y))) (assert! (rule (append-to-form (?u . ?v) ?y (?u . ?z)) (append-to-form ?v ?y ?z))) (assert! (rule (reverse () ()))) (assert! (rule (reverse (?car . ?c…続きを読む
問題4.66 (define (accumlation-function-of-sum query frame-stream) (let ((sum 0) ;; アキュムレートの初期値 (query-pattern (cadr query)) ;; 質問パターン (var (car query))) ;; 変数 (stream-for-each (lambda (frame) (let ((val…続きを読む
問題4.65 4.4.1節の wheel 規則 (assert! (rule (wheel ?person) (and (supervisor ?middle-manager ?person) (supervisor ?x ?middle-manager)))) 実行結果 ;;; Query input: (wheel ?who) ;;; Query results: (wheel (Warbuc…続きを読む
問題4.64 ;; 元の outranked-by 規則 (assert! (rule (outranked-by ?staff-person ?boss) (or (supervisor ?staff-person ?boss) (and (supervisor ?staff-person ?middle-maneger) (outranked-by ?middle-maneger ?boss)…続きを読む
問題4.63 Adam の子孫のデータベース (assert! (son Adam Cain)) (assert! (son Cain Enoch)) (assert! (son Enoch Irad)) (assert! (son Irad Mehujael)) (assert! (son Mehujael Methushael)) (assert! (son Methushael Lamech…続きを読む
問題4.62 リストの car が x で、cdr が () の場合 x が最後の要素となる。 任意の x, y, z において、y が最後の要素 z であるならば、(cons x y) の最後の要素は z となる。 (assert! (rule (last-pair (?x . ()) (?x)))) (assert! (rule (last-pair (?x . ?y) ?z) (last-p…続きを読む
問題4.61 最初の規則(rule)だけでは先頭からの2つの要素の隣接関係しか見つけられない。 2番目の規則(rule)によって連続する要素を再帰的に調べていく。 ; 調査対象リストの最初の 1, 2 番目の要素を next-to 関係とする。 (assert! (rule (?x next-to ?y in (?x ?y . ?u)))) ; 調査対象リストの内、2番目の要素以降のリストを調べる…続きを読む