Reasoned Schemer (015) 自然数
自然数の表現
- ビット(0、1)のリスト
- リストの先頭が20の位、末尾が最上位
- 表現は一意
- 最上位は0にならない
- 自然数0の表現は
()
自然数をビットによる表現に変換する
(define (build-num n)
(cond
((zero? n) '())
((even? n) (cons 0 (build-num (/ n 2))))
((odd? n) (cons 1 (build-num (/ (- n 1) 2))))))
(zero? n)
を最後の条件に持ってくる・・・
(define (build-num n)
(cond
((odd? n) (cons 1 (build-num (/ (- n 1) 2))))
((and (not (zero? n)) (even? n)) (cons 0 (build-num (/ n 2))))
((zero? n) '())))
・・・と、どんなnに対してもcond
の条件がひとつだけ成り立つ
っていうんだけど、それはzero?
を最後に持ってきたからじゃなくて
even?
の行にnot zero?
をつけたからじゃないのか
実際、「だから順番変えてもおk」って言ってるし
non-overlapping propertyというらしい
非重複属性とでもいうのかな
たしかによさげな性質ぽいけれども
くわしくは次の章で!らしい
defrel
に直したりはしないんだな
`(,x 1)
と表現されるのはどんな数ですか。
x
によります。
同意
何?
(略)
ということは、`(,x 1)
と表現されるのはどんな数ですか。
2と3です。
あ、そういう流れか
非決定ってやつだな?
そういえば
ひとつめの「どんな数」は"number"でふたつめの「どんな数」は"numbers"だ
"Two or three"じゃなくて"Two and three"だし
このへん、慣れておく必要があるのかな
かなりしつこく練習する
`(0 . ,z)
は0より大きいすべての偶数、だとか
`(1 ,y . ,z)
は3から始まる一つおきの奇数、だとか
という流れなので
(defrel (poso n)
(fresh (a d)
(== `(,a . ,d) n)))
はnが0より大きいってこと
positive の pos か
ということは、
(poso r)
はr
がfreshならいつでも成功するということですか。
はい。
そうですね
だから何
(defrel (>1o n)
(fresh (a ad dd)
(== `(,a ,ad . ,dd) n)))
まあ練習したから意味は取れるんだけれども
何を教えてくれようとしているんだろうか
ということは、
(>1o r)
はr
がfreshならいつでも成功するということですか。
はい。
だからなんなの