問題4.38 – SICP(計算機プログラムの構造と解釈)その212
2009年07月04日
問題4.38
p249 の multiple-dwelling
手続きの (require (not (= (abs (- smith fletcher)) 1)))
部分を削除するだけでよい。
(define (require p) (if (not p) (amb))) (define (multiple-dwelling) (let ((backer (amb 1 2 3 4 5)) (cooper (amb 1 2 3 4 5)) (fletcher (amb 1 2 3 4 5)) (miller (amb 1 2 3 4 5)) (smith (amb 1 2 3 4 5))) (require (distinct? (list backer cooper fletcher miller smith))) (require (not (= backer 5))) (require (not (= cooper 1))) (require (not (= fletcher 5))) (require (not (= fletcher 1))) (require (> miller cooper)) (require (not (= (abs (- fletcher cooper)) 1))) (list (list 'backer backer) (list 'cooper cooper) (list 'fletcher fletcher) (list 'miller miller) (list 'smith smith)))) (define (distinct? items) (cond ((null? items) true) ((null? (cdr items)) true) ((member (car items) (cdr items)) false) (else (distinct? (cdr items))))) (multiple-dwelling)
実行結果
5通りの正解が存在する。
;;; Amb-Eval input: (multiple-dwelling) ;;; Starting a new problem ;;; Amb-Eval value: ((backer 1) (cooper 2) (fletcher 4) (miller 3) (smith 5)) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: ((backer 1) (cooper 2) (fletcher 4) (miller 5) (smith 3)) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: ((backer 1) (cooper 4) (fletcher 2) (miller 5) (smith 3)) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: ((backer 3) (cooper 2) (fletcher 4) (miller 5) (smith 1)) ;;; Amb-Eval input: try-again ;;; Amb-Eval value: ((backer 3) (cooper 4) (fletcher 2) (miller 5) (smith 1)) ;;; Amb-Eval input: try-again ;;; There are no more values of (multiple-dwelling)
計算機プログラムの構造と解釈
posted with amazlet at 08.11.07
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
ピアソンエデュケーション
売り上げランキング: 6542