EoPL reading (124) 2.3 Representation Strategies for Data Types
なんとなく目が覚めたので続行。
直前エントリで compose-subst の定義を以下って書いてました。
(define compose-subst (lambda (s1 s2) (if (eqv? 'empty-subst-rec (car s1)) s1 (list (car s1) (cadr s1) (caddr s1) s2))))
こちらとどっちが良いんでしょ。
(define compose-subst (lambda (s1 s2) (if (eqv? 'empty-subst-rec (car s1)) s1 (extend-subst (cadr s1) (caddr s1) s2))))
下の方が格好良いカンジではあります。そりゃ良いとして試験を検討。とりあえず car が unify じゃないケイスからか。
てか、unify-term の試験ってきちんと書いてない気がしてきた。なにしてるんだ。
追加した試験が以下。#f を戻すケイスです。
(test* "(unify-terms '((var-term a)) '((app-term ((var-term a)))))" #f (unify-terms '((var-term a)) '((app-term ((var-term a)))))) (test* "(unify-terms '((app-term ((var-term a))) (var-term a)))" #f (unify-terms '((app-term ((var-term a)))) '((var-term a)))) (test* "(unify-terms '((constant-term 1)) '((constant-term 2)))" #f (unify-terms '((constant-term 1)) '((constant-term 2)))) (test* "(unify-terms '((constant-term 1)) '((app-term ((var-term a)))))" #f (unify-terms '((constant-term 1)) '((app-term ((var-term a)))))) (test* "(unify-terms '((app-term ((var-term x)))) '((constant-term 1)))" #f (unify-terms '((app-term ((var-term x)))) '((constant-term 1)))) (test* "(unify-terms '((app-term ((var-term x)))) '((var-term s)))" #f (unify-terms '((app-term ((var-term x)))) '((var-term x))))
残りは以下の部分なんですが
(let ((new-ts (subst-in-terms (cdr ts) subst-car)) (new-us (subst-in-terms (cdr us) subst-car))) (let ((subst-cdr (unify-terms new-ts new-us))) (if (not subst-cdr) #f (compose-subst subst-car subst-cdr))))))))))
#f を戻すナニを検討するリキは無いッス。