問題4.50 – SICP(計算機プログラムの構造と解釈)その222
2009年07月19日
問題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)))))
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542