Reasoned Schemer (49) 10章 nevero
(define (nevero) (lambda (s) (lambda () ((nevero) s))))
これはminikanren言語じゃないよね
動かしても関数が返ってくるだけなのでわかりづらい
> nevero
#<procedure:nevero>
> (nevero)
#<procedure:...r/minikanren.scm:52:17>
> ((nevero) empty-s)
#<procedure:...r/minikanren.scm:52:29>
しかたないので人間evalをやる
(nevero)
= (lambda (s) (lambda () ((nevero) s)))
((nevero) empty-s)
= ((lambda (s) (lambda () ((nevero) s))) empty-s)
= (lambda () ((nevero) empty-s))
(((nevero) empty-s))
= ((lambda () ((nevero) empty-s)))
= ((nevero) empty-s)
((((nevero) empty-s)))
= (((nevero) empty-s))
= ((nevero) empty-s)
てわけか
> (((nevero) empty-s))
#<procedure:...r/minikanren.scm:52:29>
> ((((nevero) empty-s)))
#<procedure:...r/minikanren.scm:52:29>
まあそういうことだろう
nevero
は評価するとgoalを返すからrelation
(nevero)
はstreamに適用するとsubstitutionを返すからgoal
((nevero) empty-s)
はsubstitutionのstreamで全体がsuspension
((nevero) empty-s)
を何度評価してもsuspension
てことで