2008年6月29日
手続きによる抽象の構築(5)
Diablo3で浮かれていますが、SICPの勉強もしました。
1.1.5 手続き作用の置き換えモデル
合成手続きの評価モデルを紹介している。これらは人間の思考を助けるためのものであって、実際にLispがこのような方法で評価している訳ではない、とのこと。
- 置き換えモデル(substitution model) 人間が考えるときの補助としてのモデル
- 正規順序の評価(normal-order evaluation) 完全に展開し、簡約する
- 作用的順序の評価(applicative-order evaluation) 引数を評価し、作用させる
Lispは作用的順序の評価を使用している。下2つの評価モデルは一長一短であるらしい。
いまいち、理解しきれている気がしない・・・。
1.1.6 条件式と述語
条件式の書き方が登場。condを使用すると複数の条件が書け、ifを使うと真偽判定が出来る。condの場合、最後にelseでどの条件にも一致しなかった場合が書ける。条件式を複数、組み合わせるために、and・or・notが用意されている。
一般的なプログラム言語と一緒なので、問題なし。condだけじゃなくて、ifが用意されているのが、Lispらしくないと思った。cond/elseで書けるわけだから、シンタックスシュガーなわけで。シンプルを良しとするLispらしくない印象。
問題 1.1
10
# => 10
(+ 5 3 4)
# => 12
(- 9 1)
# => 8
(/ 6 2)
# => 3
(+ (* 2 4) (- 4 6))
# => (+ 8 -2)
# => 6
(define a 3)
# => a
(define b (+ a 1))
# => b
(+ a b (* a b))
# => (+ 3 (+ a 1) (* 3 (+ a 1))
# => (+ 3 (+ 3 1) (* 3 (+ 3 1))
# => (+ 3 4 (* 3 4))
# => (+ 3 4 12)
# => 19
(= a b)
# => (= 3 (+ a 1))
# => (= 3 (+ 3 1))
# => (= 3 4)
# => False NG.goucheの戻り値は#fでした。
(if (and (> b a) (< b (* a b)))
b
a)
# 以後、bは4として扱います
# => (if (and (> 4 3) (< 4 (* 3 4)))
# 4
# 3)
# => (if (and True (< 4 12))
# 4
# 3)
# => (if (and True True)
# 4
# 3)
# => (if True
# 4
# 3)
# => 4
# 書き終わってから気づきましたが、andの2つの式を同時に評価しているのはNG
ですね
# 1つ目の式がTrueになってから2つ目を評価すべき
(cond ((= a 4) b)
((= b 4) (+ 6 7 a))
(else 25))
# => (cond ((= 3 4) b)
# ((= b 4) (+ 6 7 a))
# (else 25))
# => (cond (False b)
# (= b 4) (+ 6 7 a))
# ((else 25))
# => (cond (False b)
# ((= 4 4) (+ 6 7 a))
# (else 25))
# => (cond (False b)
# (True (+ 6 7 a))
# (else 25))
# => (cond (False b)
# (True (+ 6 7 3))
# (else 25))
# => (cond (False b)
# (True 16)
# (else 25))
# => 16
(+ 2 (if (> b a) b a))
# => (+ 2 (if (> 4 3) b a))
# => (+ 2 (if (True) b a))
# => (+ 2 (if (True) 4 a))
# => (+ 2 4)
# => 6
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
# => (* (cond ((> 3 4) a)
# ((< a b) b)
# (else -1))
# (+ 3 1))
# => (* (cond (False a)
# ((< a b) b)
# (else -1))
# 4)
# => (* (cond (False a)
# ((< 3 4) b)
# (else -1)
# 4)
# => (* (cond (False b)
# (True b)
# (else -1)
# 4)
# => (* (cond (False b)
# (True 4)
# (else -1)
# 4)
# => (* 4
# 4)
# => 16Trackback on "手続きによる抽象の構築(5)"
このエントリーのトラックバックURL:
"手続きによる抽象の構築(5)"へのトラックバックはまだありません。
"手続きによる抽象の構築(5)"へのコメントはまだありません。