EoPL reading (121) 2.3 Representation Strategies for Data Types
Exercise 2.25
よく分からんのう、と言いつつ手続き定義をニラむ。以下、unify-term の一部。
(define unify-term (lambda (t u) (cases term t (var-term (tid) (if (or (var-term? u) (not (memv tid (all-ids u)))) (unit-subst tid u) #f)) (else
var-term? って何だっけ、と言いつつ試験を書いてみた。
(use gauche.test) (add-load-path ".") (load "define-datatype") (load "term") (test-start "term") (test-section "predicate") (test* "(var-term? '(var-term a))" #t (var-term? '(var-term a))) (test-end)
var-term? なんて知らんぞ、と言われ試験失敗。しかも all-ids って何だよ、と。文句言っても仕方が無いので手続きを考えてみる。
(define all-ids (lambda (t) (cases term t (constant-term (datum) '()) (var-term (id) id) (app-term (terms) (let f ((rslt '()) (terms terms)) (if (null? terms) rslt (f (append rslt (list (all-ids (car terms)))) (cdr terms))))))))
うーん、つい map 使わずに書いてしまうな。てーか map 使えるのかな。
それは良いとして var-term? も検討。
(define var-term? (lambda (t) (cases term t (var-term (id) #t) (else #f))))
とりあえず、以下な試験にパス。
(test* "(var-term? '(var-term a))" #t (var-term? '(var-term a))) (test* "(var-term? '(constant-term 1))" #f (var-term? '(constant-term 1))) (test* "(var-term? '(app-term ((var-term x) (var-term y))))" #f (var-term? '(app-term ((var-term x) (var-term y)))))
ってか
ちゃんと問題読みきれてないな。もすこしきちんと問題読みます。