手続きによる抽象の構築(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)
# => 16

シェアする

  • このエントリーをはてなブックマークに追加

フォローする