[eclipse 2]: module(enum).
warning: creating a new module in module(enum)
[enum 3]: [user].
:- meta_attribute(enum, [unify:unify_enum/2, print:print_enum/2]).
:- import setarg/3 from sepia_kernel.
% unify_enum(+Term, Attribute)
unify_enum(_, Attr) :-
/*** ANY + VAR ***/
var(Attr). % Ignore if no attribute for this extension
unify_enum(Term, Attr) :-
compound(Attr),
unify_term_enum(Term, Attr).
unify_term_enum(Value, enum(ListY)) :-
nonvar(Value), % The attributed variable was instantiated
/*** NONVAR + META ***/
memberchk(Value, ListY).
unify_term_enum(Y{AttrY}, AttrX) :-
-?->
unify_enum_enum(Y, AttrX, AttrY).
unify_enum_enum(_, AttrX, AttrY) :-
var(AttrY), % no attribute for this extension
/*** VAR + META ***/
AttrX = AttrY. % share the attribute
unify_enum_enum(Y, enum(ListX), AttrY) :-
nonvar(AttrY),
/*** META + META ***/
AttrY = enum(ListY),
intersection(ListX, ListY, ListXY),
( ListXY = [Val] ->
Y = Val
;
ListXY \= [],
setarg(1, AttrY, ListXY)
).
print_enum(enum(List), Attr) :-
-?->
Attr = List.
user compiled traceable 1188 bytes in 0.03 seconds
yes.
[enum 4]: A{enum([yellow, blue, white, green])}
= B{enum([orange, blue, red, yellow])}.
A = B = A{[blue, yellow]}
yes.
[enum 5]: A{enum([yellow, blue, white, green])}
= B{enum([orange, blue, red, black])}.
A = B = blue
yes.
[enum 6]: A{enum([yellow, blue, white, green])} = white.
A = white
yes.
[enum 7]: A{enum([yellow, blue, white, green])} = red.
no (more) solution.
Some further remarks on this code: