Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
;;; Code from Paradigms of Artificial Intelligence Programming
;;; by Peter Norvig, adapted to Scheme by Gary Leavens
;;; File unify.ss: Unification functions
(define unify ; TYPE: s-expression, s-expression, env -> env
(lambda (x y bindings)
; ENSURES: result is either *failure* or the env that unifies x and y
(cond ((eq? bindings *failure*) *failure*)
((equal? x y) bindings)
((variable? x) (unify-variable x y bindings))
((variable? y) (unify-variable y x bindings))
((and (pair? x) (pair? y))
(unify (cdr x) (cdr y)
(unify (car x) (car y) bindings)))
(else *failure*))))
(define unify-variable ; TYPE: variable, s-expression, env -> env
(lambda (var x bindings)
; ENSURES: result is either *failure* or the unifing env for
; var with x; the env may be extended
(cond ((env-bound? var bindings)
(unify (env-value var bindings) x bindings))
((and (variable? x) (env-bound? x bindings))
(unify var (env-value x bindings) bindings))
((occurs-check var x bindings) *failure*)
(else (env-update var x bindings)))))
(define occurs-check ; TYPE: variable, s-expression, env -> boolean
(lambda (var x bindings)
; ENSURES: result is #t iff var occurs anywhere inside x
(cond ((eq? var x) #t)
((and (variable? x) (env-bound? x bindings))
(occurs-check var (env-value x bindings) bindings))
((pair? x) (or (occurs-check var (car x) bindings)
(occurs-check var (cdr x) bindings)))
(else #f))))
;;; ==============================
(define subst-bindings ; TYPE: env, s-expression -> s-expression
(lambda (bindings x)
; ENSURES: result is the substitution of the value of variables
; in bindings into x, taking recursively bound variables
; into account.
(cond ((eq? bindings *failure*) *failure*)
((eq? bindings (env-empty)) x)
((and (variable? x) (env-bound? x bindings))
(subst-bindings bindings (env-value x bindings)))
((not (pair? x)) x)
(else (cons (subst-bindings bindings (car x))
(subst-bindings bindings (cdr x)))))))
;;; ==============================
(define unifier ; TYPE: s-expression -> s-expression
(lambda (x y)
; ENSURES: result is either *failure* or
; an s-expression that unifies with both x and y
(subst-bindings (unify x y (env-empty)) x)))