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

問題4.50

ramb の実装はすぐできたけれども、問題4.49の Alyssa の問題を ramb で解こうとしても上手くいかなかったので写経することにした。

最初に考えた解答は、単純に ramb-choices で選択肢リストをシャッフルした。

(define (analyze exp)
  (cond ((self-evaluating? exp)
         (analyze-self-evaluating exp))
        ;; 省略
        ((ramb? exp) (analyze-ramb exp))
        ;; 省略
        (else
          (error "Unknown expression type -- ANALYZE" exp))))

(use gauche.sequence)

(define (ramb? exp) (tagged-list? exp 'ramb))

(define (ramb-choices exp) (shuffle (cdr exp)))

(define (analyze-ramb exp)
  (let ((cprocs (map analyze (ramb-choices exp))))
       (lambda (env succeed fail)
               (define (try-next choices)
                 (if (null? choices)
                     (fail)
                     ((car choices) env
                                    succeed
                                    (lambda ()
                                            (try-next (cdr choices))))))
               (try-next cprocs))))

写経したもの。
参考:exerise 4.50-54 – きちめも

(define (analyze exp)
  (cond ((self-evaluating? exp)
         (analyze-self-evaluating exp))
        ;; 省略
        ((ramb? exp) (analyze-ramb exp))
        ;; 省略
        (else
          (error "Unknown expression type -- ANALYZE" exp))))

(use srfi-27)

(define (ramb? exp) (tagged-list? exp 'ramb))

(define (ramb-choices exp) (cdr exp))

(define (analyze-ramb exp)
  (let ((cprocs (map analyze (ramb-choices exp))))
       (define (delete x seq)
         (cond ((null? seq) '())
               ((equal? x (car seq)) (cdr seq))
               (else (cons (car seq) (delete x (cdr seq))))))
       (lambda (env succeed fail)
               (define (try-next choices)
                 (if (null? choices)
                     (fail)
                     (let ((choice (list-ref choices (random-integer (length choices)))))
                          (choice env
                                  succeed
                                  (lambda ()
                                          (try-next (delete choice choices)))))))
               (try-next cprocs))))

写経したものでの実行結果

;;; Amb-Eval input:
(parse-sentense)

;;; Starting a new problem 
;;; Amb-Eval value:
(sentense (simple-noun-phrase (article a) (noun cat)) (verb eats))

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(sentense (simple-noun-phrase (article a) (noun cat)) (verb-phrase (verb eats) (prep-phrase (prep to) (simple-noun-phrase (article the) (noun professor)))))

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(sentense (simple-noun-phrase (article a) (noun cat)) (verb-phrase (verb-phrase (verb eats) (prep-phrase (prep to) (simple-noun-phrase (article the) (noun professor)))) (prep-phrase (prep for) (simple-noun-phrase (article a) (noun class)))))
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»