[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends:00557] Re: 20 回議事録 (Re: 「計算機プログラムの構造と解釈第二版」を読む会第20 回のお知らせ)



┏━━━━━━━━━┓ ━━━━━━━━━━━━━━━━━━━━━━━
┃  売上不振で  ┃◆◆楽天市場ECノウハウ本プレゼント!◆◆ 
┃悩んでいませんか?┃   ⇒ http://common.rakuten.co.jp/cl/?i=473 
┗━━━━━━━━━┛
━━━━━━━ 8000社が選んだ!ユーザーからの支持もNO.1!━━━━
----------------------------------------------------------------------



こんにちは。
鈴木 秀直です。

先月、今月と読書会に参加できなくて申しわけありません。
4月からは社会人 in 名古屋となりますのでどうなるかわかりませんが、
会社から研修のための出張費として捻出できないか交渉してみます。

さて、今回の部分のフォローです。

> 問題 4.28
> 
>  p.239 の application? 節を eval に書き換えて、うまくいかないケースを調べる
> 
> ((application? exp)
>   (apply (eval (operator exp) env)
>          (operands exp)
>          env))
> 
>  (+ 1 2) --> 3 (正常)
> 
>  ((lambda (x, y z) (if (+ x 0) (+ y z) (* y z))) 0 1 2) --> 3 (正常)
> 
>  (define (foo x) x)
> 
>  ((lambda (y) (+ (foo 3) y)) 5) --> 8 (正常)
> 
> ...うまくいくので宿題

こんなのどうでしょう?


(define (calc x)
  (x 100 20))

actual-value にしないといけない理由は
上記の関数を実行してみればわかる.
x には四則演算がはいり,
(calc -) とすると,
元のバージョンは 80と答を出すが,
evalにしたバージョンは
ERROR: Unknown procedure type -- APPLY (thunk - (((calc ...(無限)
となり,エラーになってしまう.

◎◎◎実行例◎◎◎

▲既存のバージョン▲

;;; L-Eval input:
(define (calc x) (x 100 20))
;;; L-Eval value:
ok
;;; L-Eval input:
(calc *)
;;; L-Eval value:
2000


▼eval にしたバージョン▼

;;; L-Eval input:
(define (calc x) (x 100 20))
;;; L-Eval value:
ok

;;; L-Eval input:
(calc *)

ERROR: Unknown procedure type -- APPLY (thunk * (((calc procedure (x) ((x 100 20))


> 問題 4.36
> 
> 宿題
> 


3.69は interleaveしているのが味噌.

深さ優先探索で行なわれているため,
バックトラックが行なわれず,
無限に探索が続いてしまうから.

これがちゃんと結果を出すように修正


;;(1 1) (2 1) (2 2) (3 1) (3 2) (3 3) (4 1) ...
;;と,(i, j) [i >= j] となる対を出力している.
;;計算するのは i^2 + j^2なので,これで十分.

(define (pairs-starting-from low)
  (define (pairs-starting-from-aux init a b)
    (amb (list a b)
         (cond ((= a b)
                (pairs-starting-from-aux init (+ a 1) init))
               (else
                (pairs-starting-from-aux init a (+ b 1))))))
  (pairs-starting-from-aux low low low))

;;基本的には次の4.37と同じ戦略.
;;2つの数字から,左辺を計算し,その平方根が整数かどうかで判断している.

(define (a-pythagorean-triple-starting-from low)
  (let ((i (pairs-starting-from low)))
    (let ((ksq (+ (* (car i) (car i))
                  (* (car (cdr i)) (car (cdr i))))))
      (let ((k (sqrt ksq)))
        (require (integer? k))
        (list (car i) (car (cdr i)) k)))))

;;実行結果
;;; Amb-Eval input:
(a-pythagorean-triple-starting-from 1)
;;; Starting a new problem 
;;; Amb-Eval value:
(4 3 5.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(8 6 10.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(12 5 13.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(12 9 15.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(15 8 17.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(16 12 20.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(20 15 25.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(21 20 29.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(24 7 25.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(24 10 26.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(24 18 30.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(28 21 35.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(30 16 34.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(32 24 40.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(35 12 37.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(36 15 39.0)
;;; Amb-Eval input:
try-again
;;; Amb-Eval value:
(36 27 45.0)


以上です。

鈴木 秀直

------------------------------------------------------------------------
            ▼超人たちのプレーを見よ!▼
         http://www.infoseek.co.jp/NBA?svx=971122