Contents    Page-10    Prev    Next    Page+10    Index   

Unification Code


(defn unify [u v] (unifyb u v '((t t))))

; unify terms: subst list, nil if failure.
(defn unifyb [u v subs]      ; unification works if:
(and subs
     (or (and (= u v) subs)      ; identical vars
         (varunify v u subs)     ; u is a var
         (varunify u v subs)     ; v is a var
         (and (cons? u) (cons? v) ; functions
              (= (first u) (first v)) ; same name
              (unifyc (rest u) (rest v) subs)) ) ) )
                                  ; and args unify

; unify variable and term if possible
; adds (var term) to subs, or nil
(defn varunify [term var subs]
  (and var subs (symbol? var)
       (not (occurs var term))
       (cons (list var term)
             (subst term var subs))))