/usr/local/lib/swipl/library/clp/clpfd.pl
All Application Manual Name SummaryHelp

  • library
    • clp
      • clpfd.pl -- CLP(FD): Constraint Logic Programming over Finite Domains
        • in/2
        • ins/2
        • indomain/1
        • label/1
        • labeling/2
        • all_different/1
        • all_distinct/1
        • sum/3
        • scalar_product/4
        • #>=/2
        • #=</2
        • #=/2
        • #\=/2
        • #>/2
        • #</2
        • #\/1
        • #<==>/2
        • #==>/2
        • #<==/2
        • #/\/2
        • #\//2
        • #\/2
        • lex_chain/1
        • tuples_in/2
        • serialized/2
        • element/3
        • global_cardinality/2
        • global_cardinality/3
        • circuit/1
        • cumulative/1
        • cumulative/2
        • disjoint2/1
        • automaton/3
        • automaton/8
        • transpose/2
        • zcompare/3
        • chain/2
        • fd_var/1
        • fd_inf/2
        • fd_sup/2
        • fd_size/2
        • fd_dom/2
        • fd_degree/2
        • in_set/2
        • fd_set/2
        • is_fdset/1
        • empty_fdset/1
        • fdset_parts/4
        • empty_interval/2
        • fdset_interval/3
        • fdset_singleton/2
        • fdset_min/2
        • fdset_max/2
        • fdset_size/2
        • list_to_fdset/2
        • fdset_to_list/2
        • range_to_fdset/2
        • fdset_to_range/2
        • fdset_add_element/3
        • fdset_del_element/3
        • fdset_disjoint/2
        • fdset_intersect/2
        • fdset_intersection/3
        • fdset_member/2
        • fdset_eq/2
        • fdset_subset/2
        • fdset_subtract/3
        • fdset_union/3
        • fdset_union/2
        • fdset_complement/2
      • clpb.pl -- CLP(B): Constraint Logic Programming over Boolean Variables
 fd_dom(+Var, -Dom)
Dom is the current domain (see in/2) of Var. This predicate is useful if you want to reason about domains. It is not needed if you only want to display remaining domains; instead, separate your model from the search part and let the toplevel display this information via residual goals.

For example, to implement a custom labeling strategy, you may need to inspect the current domain of a finite domain variable. With the following code, you can convert a finite domain to a list of integers:

dom_integers(D, Is) :- phrase(dom_integers_(D), Is).

dom_integers_(I)      --> { integer(I) }, [I].
dom_integers_(L..U)   --> { numlist(L, U, Is) }, Is.
dom_integers_(D1\/D2) --> dom_integers_(D1), dom_integers_(D2).

Example:

?- X in 1..5, X #\= 4, fd_dom(X, D), dom_integers(D, Is).
D = 1..3\/5,
Is = [1,2,3,5],
X in 1..3\/5.