A.9.17 CLP(FD) predicate index
All Application Manual Name SummaryHelp

  • Documentation
    • Reference manual
      • The SWI-Prolog library
        • library(clpfd): CLP(FD): Constraint Logic Programming over Finite Domains
          • CLP(FD) predicate index
            • Arithmetic constraints
            • Membership constraints
            • Enumeration predicates
            • Global constraints
            • Reification predicates
            • Reflection predicates
              • fd_var/1
              • fd_inf/2
              • fd_sup/2
              • fd_size/2
              • fd_dom/2
              • fd_degree/2
            • FD set predicates
            • FD miscellaneous predicates
    • Packages

A.9.17.6 Reflection predicates

Reflection predicates let us obtain, in a well-defined way, information that is normally internal to this library. In addition to the predicates explained below, also take a look at call_residue_vars/2 and copy_term/3 to reason about CLP(FD) constraints that arise in programs. This can be useful in program analyzers and declarative debuggers.

fd_var(+Var)
True iff Var is a CLP(FD) variable.
fd_inf(+Var, -Inf)
Inf is the infimum of the current domain of Var.
fd_sup(+Var, -Sup)
Sup is the supremum of the current domain of Var.
fd_size(+Var, -Size)
Reflect the current size of a domain. Size is the number of elements of the current domain of Var, or the atom sup if the domain is unbounded.
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.
[det]fd_degree(+Var, -Degree)
Degree is the number of constraints currently attached to Var.