EoPL reading (92) 2.2 An Abstraction for Inductive Data Type
現時点での試験、lambda 式なナニが以下。
<subst lambda experssion>------------------------------------------------------ test subst y (lambda (x) (lambda (x) y)), expects (lambda-exp x (lambda-exp x (var-exp y))) ==> ok test subst y (lambda (x) (lambda (y) y)), expects (lambda-exp y (lambda-exp y (var-exp y))) ==> ok test subst y (lambda (x) (lambda (x) x)), expects (lambda-exp y (lambda-exp x (var-exp x))) ==> ok test subst y (lambda (x) (lambda (y) x)), expects (lambda-exp y (lambda-exp y (var-exp x))) ==> ok test subst y (lambda (x) ((lambda (x) x) x)), expects (lambda-exp y (app-exp (lambda-exp x (var-exp x)) (var-exp y))) ==> ok test subst y (lambda (x) ((lambda (x) y) x)), expects (lambda-exp x (app-exp (lambda-exp x (var-exp y)) (var-exp x))) ==> ok test subst y (lambda (x) ((lambda (y) (+ x y)) x)), expects (lambda-exp y (app-exp (lambda-exp y (primapp-exp + (var-exp x) (var-exp y))) ( var-exp y))) ==> ok
パターン的に欠けてそげなのが以下?
- (lambda (x) ((lambda (x) x) x)) ;; 既存
- (lambda (x) ((lambda (x) x) y))
- (lambda (x) ((lambda (x) y) y))
- (lambda (x) ((lambda (x) y) x)) ;; 既存
- (lambda (x) ((lambda (y) y) y))
- (lambda (x) ((lambda (y) y) x))
- (lambda (x) ((lambda (y) x) x))
- (lambda (x) ((lambda (y) x) y))
ええと、一つづつ見てきます。
gosh> (occurs-free? 'y (parse-expression '((lambda (x) x) y))) #t gosh>
これは変換対象でない。次。
gosh> (occurs-free? 'y (parse-expression '((lambda (x) y) y))) #t gosh>
これも変換対象でない。次。
gosh> (occurs-free? 'y (parse-expression '((lambda (y) y) y))) #t gosh>
これも。次。
gosh> (occurs-free? 'y (parse-expression '((lambda (y) y) x))) #f gosh>
これは変換対象か。次。
gosh> (occurs-free? 'y (parse-expression '((lambda (y) x) x))) #f gosh>
これも変換対象。これはどう変換されるんかな。次。
gosh> (occurs-free? 'y (parse-expression '((lambda (y) x) y))) #t gosh>
てーコトは試験をどう書くか、というとまとめて以下。
(test* "subst y (lambda (x) ((lambda (x) x) x))" '(lambda-exp y (app-exp (lambda-exp x (var-exp x)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp x (var-exp x)) (var-exp x))))) (test* "subst y (lambda (x) ((lambda (x) x) y))" '(lambda-exp x (app-exp (lambda-exp x (var-exp x)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp x (var-exp x)) (var-exp y))))) (test* "subst y (lambda (x) ((lambda (x) y) y))" '(lambda-exp x (app-exp (lambda-exp x (var-exp y)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp x (var-exp y)) (var-exp y))))) (test* "subst y (lambda (x) ((lambda (x) y) x))" '(lambda-exp x (app-exp (lambda-exp x (var-exp y)) (var-exp x))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp x (var-exp y)) (var-exp x))))) (test* "subst y (lambda (x) ((lambda (y) y) y))" '(lambda-exp x (app-exp (lambda-exp y (var-exp y)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp y (var-exp y)) (var-exp y))))) (test* "subst y (lambda (x) ((lambda (y) y) x))" '(lambda-exp y (app-exp (lambda-exp y (var-exp y)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp y (var-exp y)) (var-exp x))))) (test* "subst y (lambda (x) ((lambda (y) x) x))" '(lambda-exp y (app-exp (lambda-exp y (var-exp x)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp y (var-exp x)) (var-exp x))))) (test* "subst y (lambda (x) ((lambda (y) x) y))" '(lambda-exp x (app-exp (lambda-exp y (var-exp x)) (var-exp y))) (alpha-conversion 'y '(lambda-exp x (app-exp (lambda-exp y (var-exp x)) (var-exp y)))))
試験パス。これで本当に良いのでしょうか。一応 occurs-free? の後ろ盾があるのでサラせるっちゃそうなんですが。
そして
(lambda (x) ((lambda (y) (+ x y)) x))
に類似なパターンの試験を検討するリキはもう無いのかどうなのか。あるいは変数増やすとか云々。どこがキリなのかも不明。