2014年10月10日金曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の4(超言語的抽象)、4.3(Schemeの変形 - 非決定性計算)、4.3.3(非決定性プログラムの例)、論理パズル、問題 4.38.を解いてみる。

その他参考書籍

問題 4.38.

コード(BBEdit, Emacs)

sample38.scm

#!/usr/bin/env gosh
;; -*- coding: utf-8 -*-

(define (multiple-dwelling)
  (let ((baker (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 baker cooper fletcher miller smith)))
    (require (not (= baker 5)))
    (require (not (= cooper 1)))
    (require (not (= fletcher 5)))
    (require (not (= fletcher 1)))
    (require (> miller cooper))
    ;; (require (not (= (abs (- smith fletcher)) 1)))
    (require (not (= (abs (- fletcher cooper)) 1)))
    (list (list 'baker baker)
          (list 'copper cooper)
          (list 'fletcher fletcher)
          (list 'miller miller)
          (list 'smith smith))))


問題の制限を除去した解は、

  1. ((baker 1) (cooper 2) (fletcher 4) (miller 3) (smith 5))
  2. ((baker 1) (cooper 2) (fletcher 4) (miller 5) (smith 3))
  3. ((baker 1) (cooper 4) (fletcher 2) (miller 5) (smith 3))
  4. ((baker 3) (cooper 2) (fletcher 4) (miller 3) (smith 5))
  5. ((baker 3) (cooper 4) (fletcher 2) (miller 5) (smith 1))
の5組が存在する。

0 コメント:

コメントを投稿