Re: [eclipse-users] Problems with attributed variables

From: Matteo Monesi <matteo.monesi_at_gmail.com>
Date: Wed, 25 Jul 2007 11:59:33 +0200
dom([1,2,3]) was an example for testing the unification predicates, the 
final code will be like "add_attribute(X, dom(Dom), dom)"...

Now I try with the "final" Dom, the one must be instanced.

Thanks a lot
Matteo

(I'll change the AttrXY variable name, good hint!)

Kish Shen ha scritto:
> Hi Matteo.
>
> Matteo Monesi wrote:
>> Hi ECLiPSe users,
>>
>> I'm trying to programming a bidimensional domain with attributed 
>> variables but I have a problem making unification predicates.
>>
>> I modified the user manual example (with help):
>>
>>         :-meta_attribute(dom,[unify:unify_dom/2]).
>>
>>         unify_dom(_, Attr) :-
>>             /*** ANY + VAR ***/
>>             var(Attr).                  % Ignore if no attribute for 
>> this extension
>>         unify_dom(Term, Attr) :-
>>             compound(Attr),
>>             unify_term_dom(Term, Attr).
>>
>>         unify_term_dom(Value, dom(ListY)) :-
>>             nonvar(Value),               % The attributed variable 
>> was instantiated
>>             /*** NONVAR + META ***/
>>             Value=dom(List),
>>             memberchk(List, ListY).
>>            %%%%%%%%%%%%%%
>>         %%% Modified Code %%%
>>
>>         unify_term_dom(Y{dom:AttrY}, AttrX) :-
>>             -?->
>>             writeln(AttrY),
>>             unify_dom_dom(Y, AttrX, AttrY,AttrXY),
>>             setarg(1, AttrY, AttrXY).
>>
>>         unify_dom_dom(_Y, AttrX,AttrY,AttrXY):-
>>             AttrX = dom(ListX),
>>             AttrY = dom(ListY),
>>             intersection(ListX,ListY,AttrXY).
>>
>>   
> Just an aside: the name AttrXY was somewhat confusing to me -- DomXY 
> may be a better name for the variable, as it is the list of domain, 
> rather than the whole attribute structure (i.e. dom/1).
>
>>         %%%%%%%%%%%%%%%
>>
>> If I try in the goal:
>>
>>     add_attribute(X,dom([1,2,3]),dom), 
>> add_attribute(Y,dom([1,2]),dom), X=Y.
>>
>> it works, but if I try:
>>
>>     test_dom(X,Y), X=Y.
>>
>> with test_dom/2:
>>
>>     test_dom(X,Y):-
>>         add_attribute(X,dom([1,2,3]),dom),
>>         add_attribute(Y,dom([1,2]),dom).
>>
>> it gives me an error:
>>
>>     trying to modify a read-only ground term in setarg(1, dom([1, 2, 
>> 3]), [1, 2])
>>
>>   
> The reason you get this error is because the term dom([1,2,3]) appears 
> explicitly in your code, and
> is thus compiled and store (in the compiled form) by ECLiPSe. When the 
> code is ran, the compiled form
> of this is used (instead of being constructed at runtime), and thus 
> you cannot modify it.
>
> Remember that setarg/3 is quite low-level, and its exact behaviour is 
> dependnet on such implementation issues as the above.
>
> This should normally not be a problem because in normal use, you 
> probably would not have something like dom([1,2,3]) in your code -- 
> you will have a predicate that will add the domain, like:
>
> add_dom(X, Dom) :-
>    add_attribute(X, dom(Dom), dom).
>
>> I obtained the same error here:
>>
>>     test1(X,Y)
>>
>> with
>>
>>     test1(X,Y):-
>>                 add_attribute(X,dom([(1,1), (2,1)]),dom),
>>                 add_attribute(Y,dom([(2,1),(2,2)]),dom),
>>                 X=Y.
>>
>> I can't understand if it is a my mistake or an ECLiPSe bug.
>>
>> Anyone can help me?
>>
>> Thanks in advance for any hints,
>> Matteo
>>
>> _______________________________________________
>> ECLiPSe-Users mailing list
>> ECLiPSe-Users_at_crosscoreop.com
>> http://www.crosscoreop.com/mailman/options/eclipse-users
>>   
>
Received on Wed Jul 25 2007 - 11:00:07 CEST

This archive was generated by hypermail 2.2.0 : Thu Feb 02 2012 - 02:31:58 CET