[cl-unification-cvs] CVS cl-unification
mantoniotti
mantoniotti at common-lisp.net
Tue Jan 18 14:50:17 UTC 2011
Update of /project/cl-unification/cvsroot/cl-unification
In directory cl-net:/tmp/cvs-serv18091
Modified Files:
unifier.lisp
Log Message:
After a careful reading of PAIP fixed a very subtle bug in VAR-UNIFY
that prevented the correct unification of:
(?x ?y a)
with
(?y ?x ?x)
--- /project/cl-unification/cvsroot/cl-unification/unifier.lisp 2009/12/17 16:44:46 1.7
+++ /project/cl-unification/cvsroot/cl-unification/unifier.lisp 2011/01/18 14:50:17 1.8
@@ -880,6 +880,8 @@
(defgeneric occurs-in-p (var pat env))
+
+#+old-version-no-paip
(defun var-unify (var pat env)
(if (eq var pat)
env
@@ -896,6 +898,33 @@
(extend-environment var pat env))))))
+;;; Version with PAIP test.
+
+(defun var-unify (var pat env)
+ (if (eq var pat)
+ env
+ (multiple-value-bind (value foundp)
+ (find-variable-value var env)
+
+ (cond (foundp
+ (unify value pat env))
+ ((variablep pat)
+ (multiple-value-bind (pat-value foundp)
+ (find-variable-value pat env)
+ (if foundp
+ (return-from var-unify
+ (unify var pat-value env)))
+ )))
+
+ (cond ((and *occurrence-check-p*
+ (occurs-in-p var pat env))
+ (error 'unification-failure
+ :format-control "Variable ~S occurs in ~S."
+ :format-arguments (list var pat)))
+ (t
+ (extend-environment var pat env))))))
+
+
#||
(defmethod occurs-in-p ((var symbol) pat env)
More information about the Cl-unification-cvs
mailing list