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) '()))
succeed
とfail
は実は#s
や#f
のことなんだけど
#s
や#f
は定義できなくて、実はsucceed
とfail
で定義する
確かに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
と同じ
u
とv
をunify
して#f
ならfail
だしそうでなければsucceed
理屈は合っているな
unify
できれば==
であるということ
> ((== #t #f) empty-s)
()
> (fail empty-s)
()
> ((== #f #f) empty-s)
(())
> (succeed empty-s)
(())
> ((== x y) empty-s)
(((#(x) . #(y))))