問題4.66 – SICP(計算機プログラムの構造と解釈)その239

問題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.65filter-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

パス

計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»