2.1.2 の subst あたりを復習。subst の定義が以下。
(define subst
(lambda (new old slist)
(if (null? slist)
'()
(cons
(subst-in-symbol-expression new old (car slist))
(subst new old (cdr subst))))))
あるいは subst-in-symbol-expression の定義が以下。
(define subst-in-symbol-expression
(lambda (new old se)
(if (symbol? se)
(if (eqv? se old) new se)
(subst new old se))))
あと、Ex.2.13 の term の定義が以下。
(define-datatype term term?
(var-term
(id symbol?))
(constant-term
(datum constant?))
(app-term
(terms (list-of term?))))
これらを踏まえて
- (empty-subst)
- (apply-subst s i)
- (extend-subst i t s)
を、とのこと。2.3.2 な Procedural なソレと 2.3.3 な Abstract なソレをとあります。
Procedural Representation
時間が無い。ちょっとだけ。こちらは
- extend-subst と empty-subst は手続きを戻す
- apply-subst は手続きを apply するのみ
ということは apply-subst は以下になるはず。
(define apply-subst
(lambda (s i)
(s i)))
empty は時間無いので略。extend の中身がどうなるか。
(define extend-subst
(lambda (i t s)
(lambda (sym)
む、これって sym と i が eqv? なら置換、なのか。以下?
(lambda (sym)
(if (eqv? sym i)
;; subst
(apply-subst s sym)))
むむ、微妙。今日はこれで時間切れです。置換がハードル高いけど parse-term を確認したら微妙だった。