Reasoned Schemer (70) fuseとか
> (run* q (fresh (x) (== x q)))
'(_0)
x
とq
がfuseしている
というのは`(,x . ,q)
というassociationがあるということ
でもx
もq
もfreshなので_0
すこし分解して試す
> ((fresh (x) (== x q)) empty-s)
'(((#(x) . #(q))))
> (unify x q empty-s)
'((#(x) . #(q)))
> ((reify q) '((#(x) . #(q))))
'_0
x
が変数じゃなくて'#(x)
だと思って見るとunify
も結構単純だなという気がする(気のせい
> (run* q (== '(((pea)) pod) '(((pea)) pod)))
'(_0)
> ((== '(((pea)) pod) '(((pea)) pod)) empty-s)
'(())
> (unify '(((pea)) pod) '(((pea)) pod) empty-s)
'()
> ((reify q) '())
'_0
見えてきた
> (run* q (== '(((pea)) pod) `(((pea)) ,q)))
'(pod)
> ((== '(((pea)) pod) `(((pea)) ,q)) empty-s)
'(((#(q) . pod)))
> (unify '(((pea)) pod) `(((pea)) ,q) empty-s)
'((#(q) . pod))
> ((reify q) '((#(q) . pod)))
'pod
打ち込み
> (run* q (== `(((,q)) pod) `(((pea)) pod)))
'(pea)
> (run* q (fresh (x) (== `(((,q)) pod) `(((,x)) pod))))
'(_0)