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が必要なのか把握しなきゃいけないらしいです
進んでいけばわかるのか?