kb84tkhrのブログ

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

Reasoned Schemer (46) 10章 stream、==

streamとは空リストかcdrがstreamであるペアかまたはsuspension
suspensionとは(lambda () body)という形をしていて評価するとstreamを返すもの

遅延ストリームって言われるやつだな
そんなのが突然の出現
そして意外にさらっと説明・例示が終わる

goalとはsubstitutionを引数に取ってsubstitutionのstreamを(返すならば)返すもの

なんでそれがgoalなんだろう
意味がわからない
進むしかない

単純なgoalの例

(define succeed (lambda (s) `(,s)))
(define fail (lambda (s) '()))

succeedfailは実は#s#fのことなんだけど
#s#fは定義できなくて、実はsucceedfailで定義する
確かにsubstitutionを引数に取ってsubstitutionのstreamを返す
だからといってこれがgoalだなあ(しみじみ)とか成功っぽいねなどとは感じない

もう少しgoalっぽいgoal

(define (== u v)
  (lambda (s)
    (let ((s (unify u v s)))
      (if s `(,s) '()))))

substitutionを引数にとってsubstitutionのstreamを返すからgoalだし
sを取って(,s)を返すならsucceedと同じだし
sを取って()を返すならfailと同じ
uvunifyして#fならfailだしそうでなければsucceed
理屈は合っているな
unifyできれば==であるということ

> ((== #t #f) empty-s)
()
> (fail empty-s)
()
> ((== #f #f) empty-s)
(())
> (succeed empty-s)
(())
> ((== x y) empty-s)
(((#(x) . #(y))))