問題4.66 – SICP(計算機プログラムの構造と解釈)その239
2009年08月08日
問題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 (instantiate var frame #f))) ;; val: 変数に束縛されている値 (if (and val (number? val)) (set! sum (+ sum val))))) (qeval query-pattern frame-stream)) ;; 単に質問パターンを qeval に送り込み、フレームのストリームを返す (singleton-stream (extend var sum '())))) ;; 変数に結果の sum の値を束縛したフレームのストリーム (put 'sum 'qeval accumlation-function-of-sum)
実行結果
重複する結果も累積されるため、期待する値よりも多い値が結果として返される。
;;; Query input: (sum ?amount (and (wheel ?who) (salary ?who ?amount))) ;;; Query results: (sum 660000 (and (wheel ?who) (salary ?who 660000)))
結果のストリームから重複するものをフィルタリングする。
(define (filter-distinct query frame-stream) (let ((val-list '()) (var (car query))) (stream-flatmap (lambda (frame) (let ((val (instantiate var frame #f))) ;; val: 変数に束縛されている値 (if (and val (not (member val val-list))) ;; val-list に val が存在しない場合 (begin (set! val-list (cons val val-list)) ;; val-list に val を登録 (singleton-stream (extend var val '()))) ;; 変数に val を束縛したフレームのストリーム the-empty-stream))) (qeval (cadr query) frame-stream)))) (put 'filter-distinct 'qeval filter-distinct)
実行結果
重複をフィルタリングした結果を累積するため、期待される値が結果となる。
;;; Query input: (sum ?amount (and (filter-distinct ?who (wheel ?who)) (salary ?who ?amount))) ;;; Query results: (sum 210000 (and (filter-distinct ?who (wheel ?who)) (salary ?who 210000)))
問題4.65 に filter-distinct
を使用してみる。
;;; Query input: (filter-distinct ?who (wheel ?who)) ;;; Query results: (filter-distinct (Warbucks Oliver) (wheel (Warbucks Oliver))) (filter-distinct (Bitdiddle Ben) (wheel (Bitdiddle Ben)))
参考:sicpstudygroup @ ウィキ – naga:4-55/4-79
問題4.67
パス
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542