[cl-unification-devel] newbie; questions on comutivity.

Marco Antoniotti marcoxa at cs.nyu.edu
Thu Apr 16 07:01:14 UTC 2009


Hi

It is correct because what you see in Prolog systems you actually see  
one extra step in the process.

This is LW Prolog (SWIPl, arguably the most stable, free Prolog out  
there does the same).

======================

==> ?-

?- 42 = X.

X = 42;
NO.

?- t(42, A) = t(A, B).

A = 42
B = 42;
NO.

?- t(A, B) = t(42, A).

A = 42
B = 42;
NO.

?-
======================

When the variables are printed (or even during unification, but this  
makes things slower) the 'terms' (read: the 'variables') are  
"grounded".  I.e. all the substitutions are done and, in the second  
case the substitution for A is printed for B.

So, the choice is where to do the "grounding" of the terms.  I choose  
to leave it downstream.

The algorithm is nevertheless correct.   Check the following:

============================================================

UNIFY 10 > (unify '(?a ?b ?b) '(42 ?a 123))

Error: Cannot unify two different numbers: 42 123.
   1 (abort) Return to level 0.
   2 Return to top loop level 0.

Type :b for backtrace, :c <option number> to proceed,  or :? for other  
options

============================================================

If you inspect the environment in this debug level, you will see that  
the bindings are what you expect, and that (?B . ?A) appears among them.


To achieve what you expect you just need to add the proper call to  
APPLY-SUBSTITUTION to the binding of ?B.

Having said that, the current definition of APPLY-SUBSTITUTION is  
incomplete/buggy.  But I just fixed it to work in your example. I will  
put it in CVS ASAP.

Cheers
--
Marco






On Apr 16, 2009, at 06:22 , Matthew D. Swank wrote:

> As someone exposed to unification through languages like prolog and
> kanren, I'm a little puzzled as to why the following doesn't seem to
> commute:
> CL-USER> (let ((e (unify '(42 ?a) '(?a ?b))))
>           (values (v? '?b e) (v? '?a e)))
> 42
> 42
> CL-USER> (let ((e (unify '(?a ?b) '(42 ?a))))
>           (values (v? '?b e) (v? '?a e)))
> ?A
> 42
> CL-USER>
>
> If this is correct behavior, could someone explain it to me?
>
> Thank you,
>
> Matt
>
> -- 
> "You do not really understand something unless you can explain it to
> your grandmother." -- Albert Einstein.
>
> _______________________________________________
> cl-unification-devel site list
> cl-unification-devel at common-lisp.net
> http://common-lisp.net/mailman/listinfo/cl-unification-devel

--
Marco Antoniotti






More information about the cl-unification-devel mailing list