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

問題4.43

問題文には記載されていないが、Parker のヨット名が Mary Ann であることは自明。
よって、以下の様な関係がわかっている。

ヨット
Moore Mary Ann Lorna
Downing   Melissa
Hall   Rosalind
Barnacle Hood Melissa Gabrielle
Parker   Mary Ann

各父親の名前の変数に (<娘の名前> . <ヨットの名前>) のペアを束縛していく。

(define (require p)
  (if (not p) (amb)))

(define (yacht-owner)
  (let ((moore (cons 'mary 'lorna))
        (downing (cons (amb 'lorna 'rosalind 'gabrielle) 'melissa))
        (hall (cons (amb 'lorna 'gabrielle) 'rosalind))
        (barnacle-hood (cons 'melissa 'gabrielle))
        (parker (cons (amb 'lorna 'rosalind 'gabrielle) 'mary)))
       (let ((father-list (list moore downing hall barnacle-hood parker)))
            (require (distinct? (map car father-list)))
            (require (eq? (cdr (car (filter (lambda (n) (eq? (car n) 'gabrielle)) father-list))) (car parker)))
            (list 'moore moore 'downing downing 'hall hall 'barnacle-hood barnacle-hood 'parker parker))))

(define (distinct? items)
  (cond ((null? items) true)
        ((null? (cdr items)) true)
        ((member (car items) (cdr items)) false)
        (else (distinct? (cdr items)))))

(define (filter pred lst)
  (if (null? lst)
    '()
    (if (pred (car lst))
       (cons (car lst) (filter pred (cdr lst)))
       (filter pred (cdr lst)))))

(define (map proc items)
  (if (null? items)
      '()
      (cons (proc (car items))
            (map proc (cdr items)))))

実行結果

Lorna の父親は Downing 大佐

;;; Amb-Eval input:
(yacht-owner)

;;; Starting a new problem 
;;; Amb-Eval value:
(moore (mary . lorna) downing (lorna . melissa) hall (gabrielle . rosalind) barnacle-hood (melissa . gabrielle) parker (rosalind . mary))

;;; Amb-Eval input:
try-again

;;; There are no more values of
(yacht-owner)

Mary Ann の姓が Moore だとわからなかった場合の yacht-owner 手続き

(define (yacht-owner)
  (let ((moore (cons (amb 'rosalind 'gabrielle 'mary) 'lorna))
        (downing (cons (amb 'lorna 'rosalind 'gabrielle 'mary) 'melissa))
        (hall (cons (amb 'lorna 'gabrielle 'mary) 'rosalind))
        (barnacle-hood (cons 'melissa 'gabrielle))
        (parker (cons (amb 'lorna 'rosalind 'gabrielle) 'mary)))
       (let ((father-list (list moore downing hall barnacle-hood parker)))
            (require (distinct? (map car father-list)))
            (require (eq? (cdr (car (filter (lambda (n) (eq? (car n) 'gabrielle)) father-list))) (car parker)))
            (list 'moore moore 'downing downing 'hall hall 'barnacle-hood barnacle-hood 'parker parker))))

実行結果

2通りの解が存在する。

;;; Amb-Eval input:
(yacht-owner)

;;; Starting a new problem 
;;; Amb-Eval value:
(moore (gabrielle . lorna) downing (rosalind . melissa) hall (mary . rosalind) barnacle-hood (melissa . gabrielle) parker (lorna . mary))

;;; Amb-Eval input:
try-again

;;; Amb-Eval value:
(moore (mary . lorna) downing (lorna . melissa) hall (gabrielle . rosalind) barnacle-hood (melissa . gabrielle) parker (rosalind . mary))

;;; Amb-Eval input:
try-again

;;; There are no more values of
(yacht-owner)
計算機プログラムの構造と解釈
ジェラルド・ジェイ サスマン ジュリー サスマン ハロルド エイブルソン
ピアソンエデュケーション
売り上げランキング: 6542
«
»