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)))))

ってか

ちゃんと問題読みきれてないな。もすこしきちんと問題読みます。