kb84tkhrのブログ

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

Reasoned Schemer (50) 10章 alwayso

(define (alwayso) (lambda (s) (lambda () ((disj2 succeed (alwayso)) s))))

しっかり読んだらalwaysoの動きがイメージできるようになるだろうか

まずalwaysoの形を確認
alwaysoは引数のない関数で
substitutionを引数にとって、substitusionのstreamを返すsuspensionを返す
なかなかのややこしさ

とりあえず評価

> ((alwayso) empty-s)
#<procedure:...r/minikanren.scm:56:30>
> (((alwayso) empty-s))
(()
 .
 #<procedure:...r/minikanren.scm:56:30>)

(succeed empty-s)(())だからそうなるね

  ((alwayso) empty-s)
= ((lambda (s) (lambda () ((disj2 succeed (alwayso)) s))) empty-s)
= (lambda () ((disj2 succeed (alwayso)) empty-s))

  (((alwayso) empty-s))
= ((lambda () ((disj2 succeed (alwayso)) empty-s)))
= ((disj2 succeed (alwayso)) empty-s)
= (append-inf (succeed empty-s) ((alwayso) empty-s))
= (append-inf `(()) (lambda () ((disj2 succeed (alwayso)) empty-s)))
= `(() . ,(lambda () ((disj2 succeed (alwayso)) empty-s)))

このcdrを評価すると同じ形が出てくるわけだな
正直よくわかりません

“a list of the first empty substitution”を作るのがこれ

> (let ((s-inf (((alwayso) empty-s))))
    (cons (car s-inf) '()))
(())

“a list of the first two empty substitutions”を作るのがこれ

> (let ((s-inf (((alwayso) empty-s))))
    (cons (car s-inf)
          (let ((s-inf (((alwayso) empty-s))))
            (cons (car s-inf) '()))))
(() ())

“a list of the first three (略)”を(略)
なんなのこれ
何が言いたいの
わかりません

Can we keep track of how many substitution we still need?

あといくつsubstitutiongが必要なのか把握しなきゃいけないらしいです
進んでいけばわかるのか?