SICP 読み

継続もミリョク的なんですが SICP に方面に手を出してみる事に。目標としては松が明ける迄に 2 章あたりまでをなんとかしたいな、と。
ただ、数学なナニが微妙な事からスルーが多用される可能性大 (を

あまり細かいコトは気にせずにメモを垂れ流してみる。

1.1.5 手続き作用の置き換えモデル

英語リソースは 1.1.5 The Substitution Model for Procedure Application

日本語が微妙なのか、わしの理解力が微妙なのかは分からんが、解説がすうっと脳に入ってこない。英語リソースも無料解放されてますし、そちらも見ながらだったのですが、なんか時間がかかります。スルーしたかったのですがなんとか読んだ。

意味が分からんかったのはまず以下。

合成手続きを引数に作用させるには、各仮パラメタを対応する引数で取り替え、手続きの本体を評価する。

計算機プログラムの構造と解釈 第二版 より引用

英語リソースの記述は以下。

To apply a compound procedure to arguments, evaluate the body of the procedure with each formal parameter replaced by the corresponding argument.

1.1.5 The Substitution Model for Procedure Application より引用

この節で出てくるサンプルの評価 (evaluation) にあたって

  • 作用させるべき手続きを得るために演算子を評価
  • 引数を得るために、被演算子を評価

のどっちを優先させるか、というナニがアレ。(を

(sum-of-squares (+ 5 1) (* 5 2))

(+ (* 6 6) (* 10 10))

に至るまでの間の評価の方法が上記二点の差である、と。

引数を評価し、作用させる (eveluate the arguments and then apply) 方法

(sum-of-squares (+ 5 1) (* 5 2))

(sum-of-squares 6 10)

(+ (square 6) (square 10))

(+ (* 6 6) (* 10 10))

この手法は作用的順序の評価 (applicative-order evaluation) とある。

完全に展開し、簡約する (fully expand and then reduce) 方法

(sum-of-squares (+ 5 1) (* 5 2))

(+ (square (+ 5 1)) (square (* 5 2)))

(+ (* (+ 5 1) (+ 5 1)) (* (* 5 2) (* 5 2)))

(+ (* 6 6) (* 10 10))

この手法は正規順序の評価 (normal-order evaluation) となっている。

で、最後に微妙なコトが書いてあるんですが

置換えでモデル化できる手続きの範囲を抜けた途端に正規順序の評価が極めて複雑になる

計算機プログラムの構造と解釈 第二版 より引用


とあります。どんな世界なのか想像もつきませんが、オソロしい。

問題 1.5

正規順序と作用的順序の評価が同じ結果にならない「不当な」値の例は、問題 1.5 を見て欲しい

計算機プログラムの構造と解釈 第二版 より引用


との事にて見てみた。

guile> (define (p) (p))
guile> (define (test x y) (if (= x 0) 0 y))
guile> (test 0 (p))

な一連のナニを applicative-order と normal-order で評価した挙動を説明せえ、との設問なんですが、ポイント高いのは p という名前で定義された手続きですな。
これ、以前は意味が分からん定義だったのですが、自分自身を呼び出している訳で

  • normal-order なら引数展開別途ですので 0 返却 (p は評価されないハズ)
  • applicative-order なら評価機がループ

というのが答えかなぁ。

斜体な記述は基本的に SICP からの引用となっております。

追記

英訳サイトなんかも使ってみたんですが、reduce の訳 (簡約) が意味分からないとゆーかイメージできん。
てーか、scheme も理解微妙で 2 章のどこだかまで読みかけたコトがあったんですが、例えば問題 1.5 の

(define (p) (p))

さえも意味が分からんレベルだった記憶あり。蛇足ながら補足しとくと、こんな冗長な書き方のが分かりやすいかも。

(define p
  (lambda ()
    (p)))