52 lines
1.9 KiB
Prolog
52 lines
1.9 KiB
Prolog
/* From the SICSTUS Prolog documentation at:
|
|
https://sicstus.sics.se/sicstus/docs/3.7.1/html/sicstus_17.html
|
|
*/
|
|
|
|
:- module(domain, [domain/2]).
|
|
|
|
:- use_module(library(atts)).
|
|
:- use_module(library(ordsets), [
|
|
ord_intersection/3,
|
|
ord_intersect/2,
|
|
list_to_ord_set/2
|
|
]).
|
|
|
|
:- attribute dom/1.
|
|
|
|
verify_attributes(Var, Other, Goals) :-
|
|
get_atts(Var, dom(Da)), !, % are we involved?
|
|
( var(Other) -> % must be attributed then
|
|
( get_atts(Other, dom(Db)) -> % has a domain?
|
|
ord_intersection(Da, Db, Dc),
|
|
Dc = [El|Els], % at least one element
|
|
( Els = [] -> % exactly one element
|
|
Goals = [Other=El] % implied binding
|
|
; Goals = [],
|
|
put_atts(Other, dom(Dc))% rescue intersection
|
|
)
|
|
; Goals = [],
|
|
put_atts(Other, dom(Da)) % rescue the domain
|
|
)
|
|
; Goals = [],
|
|
ord_intersect([Other], Da) % value in domain?
|
|
).
|
|
verify_attributes(_, _, []). % unification triggered
|
|
% because of attributes
|
|
% in other modules
|
|
|
|
attribute_goals(Var, domain(Var,Dom)) :- % interpretation as goal
|
|
get_atts(Var, dom(Dom)).
|
|
|
|
domain(X, Dom) :-
|
|
var(Dom), !,
|
|
get_atts(X, dom(Dom)).
|
|
domain(X, List) :-
|
|
list_to_ord_set(List, Set),
|
|
Set = [El|Els], % at least one element
|
|
( Els = [] -> % exactly one element
|
|
X = El % implied binding
|
|
; put_atts(Fresh, dom(Set)),
|
|
X = Fresh % may call
|
|
% verify_attributes/3
|
|
).
|