home *** CD-ROM | disk | FTP | other *** search
- (define (unify d1 d2 e)
- (cond ((equal? d1 d2) t)
- ((var? d1) (var-u d1 d2 e))
- ((var? d2) (var-u d2 d1 e))
- ((const? d1) nil)
- ((const? d2) nil)
- (else (if (unify (car d1) (car d2) e)
- (unify (cdr d1) (cdr d2) e) nil))))
-
- (define (var-u var pat env)
- (let ((as nil))
- (cond ((equal? var pat) t)
- ((bound-in-frame? var env)
- (unify (access var env) pat env))
- ((contains? (extend pat env) var) nil)
- (else (def var pat env)))))
-
- (define (extend pat env)
- (cond ((var? pat) (var-extend pat env))
- ((const? pat) pat)
- (else (cons (extend (car pat) env)
- (extend (cdr pat) env)))))
-
- (define (var-extend var env)
- (if (bound-in-frame? var env)
- (access var env)
- var))
-
- (define (var? x)
- (symbol? x))
-
- (define (const? x)
- (or (and (pair? x) (equal? 'quote (car x)))
- (null? x)
- (number? x)
- (string? x)))
-
- (define (contains? s o)
- (cond ((equal? s o) t)
- ((const? s) nil)
- (else (or (contains? (car s) o)
- (contains? (cdr s) o)))))