kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

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ならいつでも成功するということですか。
はい。

だからなんなの