home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 02 / levelki / unify.lsp < prev   
Encoding:
Text File  |  1988-02-12  |  1.1 KB  |  43 lines

  1. (define (unify d1 d2 e)
  2.     (cond ((equal? d1 d2) t)
  3.           ((var? d1) (var-u d1 d2 e))
  4.           ((var? d2) (var-u d2 d1 e))
  5.           ((const? d1) nil)
  6.           ((const? d2) nil)
  7.           (else (if (unify (car d1) (car d2) e)
  8.                     (unify (cdr d1) (cdr d2) e) nil))))
  9.  
  10. (define (var-u var pat env)
  11.   (let ((as nil))
  12.     (cond ((equal? var pat) t)
  13.           ((bound-in-frame? var env)
  14.            (unify (access var env) pat env))
  15.           ((contains? (extend pat env) var) nil)
  16.           (else (def var pat env)))))
  17.  
  18. (define (extend pat env)
  19.   (cond ((var? pat) (var-extend pat env))
  20.         ((const? pat) pat)
  21.         (else (cons (extend (car pat) env)
  22.                     (extend (cdr pat) env)))))
  23.  
  24. (define (var-extend var env)
  25.   (if (bound-in-frame? var env)
  26.       (access var env)
  27.       var))
  28.  
  29. (define (var? x)
  30.   (symbol? x))
  31.  
  32. (define (const? x)
  33.   (or (and (pair? x) (equal? 'quote (car x)))
  34.       (null? x)
  35.       (number? x)
  36.       (string? x)))
  37.  
  38. (define (contains? s o)
  39.   (cond ((equal? s o) t)
  40.         ((const? s) nil)
  41.         (else (or (contains? (car s) o)
  42.                   (contains? (cdr s) o)))))
  43.