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