Reasoned Schemer (54) 10章 call/fresh, reified variable
新たな変数を導入する
(define (call/fresh name f)
(f (var name)))
f
は変数を引数にとってgoalを返す関数
たとえば(lambda (fruit) (== 'plum fruit))
> (take-inf 1 ((call/fresh 'kiwi (lambda (fruit) (== 'plum fruit))) empty-s))
(((#(kiwi) . plum)))
変数を導入したところがすっとばされてる感じもするので
すこし途中を補足するとこう
(call/fresh 'kiwi (lambda (fruit) (== 'plum fruit)))
= ((lambda (fruit) (== 'plum fruit)) (var 'kiwi))
= (== 'plum (var 'kiwi))
だったらtake-inf
なんてしなくてもよさそうな気がするけど
何かの布石?
> ((== 'plum (var 'kiwi)) empty-s)
(((#(kiwi) . plum)))
When would it make sense to use distinct symbols for variables?
When we present values.
ちょっとなんて言ってるのかよくわかりませんが
reified variableの話だそうで
reified variableの名前はreify-name
で作る
(define (reify-name n)
(string->symbol (string-append "_" (number->string n))))
fresh variableにreified variableを対応付けるには``(,x . _0)
のようにassociationを使う
こういうassociationを含むsubstitutionをreified-name substitutionと呼ぶ