2014年7月17日木曜日

開発環境

計算機プログラムの構造と解釈[第2版](ハロルド エイブルソン (著)、ジュリー サスマン (著)、ジェラルド・ジェイ サスマン (著)、Harold Abelson (原著)、Julie Sussman (原著)、Gerald Jay Sussman (原著)、和田 英一 (翻訳)、翔泳社、原書: Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)(SICP))の3(標準部品化力、オブジェクトおよび状態)、3.4(並列性: 時が本質的)、3.4.1(並列システムでの時)、並列プログラムの正しい振舞い、問題 3.38-a, b.を解いてみる。

その他参考書籍

問題 3.38-a, b.

a.

  • Peter, Paul, MaryとPaul, Peter, Maryの順序の時: 45
  • Peter, Mary, Paulの順序の時: 35
  • Paul, Mary, Peterの順序の時: 50
  • Mary, Peter, PaulとMary, Paul, Peterの時: 40

コード(BBEdit, Emacs)

constraint_system.scm

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

(define balance 100)
(define (init) (set! balance 100))
(define (withdraw amount)
  (if (>= balance amount)
      (begin (set! balance (- balance amount))
             balance)
      "Insufficient funds"))

(define (peter) (set! balance (+ balance 10)))
(define (paul) (set! balance (- balance 20)))
(define (mary) (set! balance (- balance (/ balance 2))))

(peter)
(paul)
(mary)
(print balance)

(init)
(paul)
(peter)
(mary)
(print balance)

(init)
(peter)
(mary)
(paul)
(print balance)

(init)
(paul)
(mary)
(peter)
(print balance)

(init)
(mary)
(peter)
(paul)
(print balance)

(init)
(mary)
(paul)
(peter)
(print balance)

sample3_38.scm

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

(load "./constraint_system.scm")

(define (c+ x y)
  (let ((z (make-connector)))
    (adder x y z)
    z))

(define (c- x y)
  (let ((z (make-connector)))
    (adder y z x)
    z))

(define (c* x y)
  (let ((z (make-connector)))
    (multiplier x y z)
    z))

(define (c/ x y)
  (let ((z (make-connector)))
    (multiplier y z x)
    z))

(define (cv value)
  (let ((x (make-connector)))
    (constant value x)
    x))

(define (celsius-fahrenheit-converter x)
  (c+ (c* (c/ (cv 9) (cv 5))
          x)
      (cv 32)))

(define celsius (make-connector))
(define fahrenheit (celsius-fahrenheit-converter celsius))

(probe 'celsius celsius)
(probe 'fahrenheit fahrenheit)

(set-value! celsius 0 'kamimura)
(forget-value! celsius 'kamimura)
(set-value! fahrenheit 32 'kamimura)
(forget-value! fahrenheit 'kamimura)
(set-value! celsius 20.0 'kamimura)
(forget-value! celsius 'kamimura)
(set-value! fahrenheit 0 'kamimura)
(forget-value! fahrenheit 'kamimura)
(set-value! fahrenheit 0.0 'kamimura)

入出力結果(Terminal(gosh), REPL(Read, Eval, Print, Loop))

$ ./sample3_38.scm 
45
45
35
50
40
40
$

b.

それぞれの最終残高。

  • PeterとPaulが同時に残高100ドルにアクセスした場合。
    • 途中残高が110ドルでそれにMaryがアクセスした場合: 55ドル
    • 途中残高が80ドルでそれにMaryがアクセスした場合: 40ドル
  • PeterとMaryが同時に残高100ドルにアクセスした場合。
    • 途中残高が110ドルでそれにPaulがアクセスした場合: 90ドル
    • 途中残高が50ドルでそれにPaulがアクセスした場合: 30ドル
  • PaulとMaryが同時に残高100ドルにアクセスした場合。
    • 途中残高が80ドルでそれにPetterがアクセスした場合: 90ドル
    • 途中残高が50ドルでそれにPetterがアクセスした場合: 60ドル
  • PeterとPaulとMaryが同時に残高にアクセスした場合。
    • 110ドル
    • 80ドル
    • 50ドル
  • Peterの次に、PaulとMaryが同時にアクセスした場合。
    • 90ドル
    • 55ドル
  • Paulの次に、PeterとMaryが同時にアクセスした場合。
    • 90ドル
    • 40ドル
  • Maryの次に、PeterとPaulがアクセスした場合。
    • 60ドル
    • 30ドル

よって、生じる可能性のある値は、

  1. 55
  2. 40
  3. 90
  4. 30
  5. 60
  6. 110
  7. 80
  8. 50
  9. 55
の8通り。

0 コメント:

コメントを投稿