<html> <head> <link rel="stylesheet" href="style.css" type="text/css"> <link rel="Start" href="index.html"> <link rel="next" href="SetDomain.html"> <link rel="Up" href="index.html"> <link title="Index of types" rel=Appendix href="index_types.html"> <link title="Index of exceptions" rel=Appendix href="index_exceptions.html"> <link title="Index of values" rel=Appendix href="index_values.html"> <link title="Index of modules" rel=Appendix href="index_modules.html"> <link title="Index of module types" rel=Appendix href="index_module_types.html"> <link title="Domain" rel="Chapter" href="Domain.html"> <link title="SetDomain" rel="Chapter" href="SetDomain.html"> <link title="Stak" rel="Chapter" href="Stak.html"> <link title="Data" rel="Chapter" href="Data.html"> <link title="Cstr" rel="Chapter" href="Cstr.html"> <link title="Var" rel="Chapter" href="Var.html"> <link title="Invariant" rel="Chapter" href="Invariant.html"> <link title="Reify" rel="Chapter" href="Reify.html"> <link title="Arith" rel="Chapter" href="Arith.html"> <link title="Conjunto" rel="Chapter" href="Conjunto.html"> <link title="Goals" rel="Chapter" href="Goals.html"> <link title="FdArray" rel="Chapter" href="FdArray.html"> <link title="Gcc" rel="Chapter" href="Gcc.html"> <link title="Alldiff" rel="Chapter" href="Alldiff.html"> <link title="Sorting" rel="Chapter" href="Sorting.html"> <link title="Interval" rel="Chapter" href="Interval.html"><title>Domain</title> </head> <body> <div class="navbar"> <a href="index.html">Up</a> <a href="SetDomain.html">Next</a> </div> <center><h1>Module <a href="type_Domain.html">Domain</a></h1></center> <br> <pre><span class="keyword">module</span> Domain: <code class="code">sig</code> <a href="Domain.html">..</a> <code class="code">end</code></pre>Domain Operations<br> <hr width="100%"> <br> This module provides functions to create and handle domains, which are useful to build variables and perform propagation (i.e. domain filtering).<br> <pre><span class="keyword">type</span> <a name="TYPEelt"></a><code class="type"></code>elt = <code class="type">int</code> </pre> <div class="info"> Type of element of domains (for generic interface, ).<br> </div> <pre><span class="keyword">type</span> <a name="TYPEt"></a><code class="type"></code>t </pre> <div class="info"> Type of finite domains of integers (functional: no in-place modifications, domains can be shared). Standard equality and comparison can be used on domains.<br> </div> <br> <br> <pre><span class="keyword">val</span> <a name="VALempty"></a>empty : <code class="type"><a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> The empty domain.<br> </div> <pre><span class="keyword">val</span> <a name="VALcreate"></a>create : <code class="type"><a href="Domain.html#TYPEelt">elt</a> list -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">create l</code> builds a new domain containing the values of <code class="code">l</code>. Removes duplicates and sorts values. Returns <code class="code">empty</code> if <code class="code">l</code> is empty.<br> </div> <pre><span class="keyword">val</span> <a name="VALunsafe_create"></a>unsafe_create : <code class="type"><a href="Domain.html#TYPEelt">elt</a> list -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">unsafe_create l</code> builds a new domain containing the values of <code class="code">l</code>. <code class="code">l</code> must be sorted and must not contain duplicate values, otherwise the behaviour is unspecified. Returns <code class="code">empty</code> if <code class="code">l</code> is empty. It is a more efficient variant of <code class="code">create</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALinterval"></a>interval : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">interval inf sup</code> returns the domain of all integers in the closed interval <code class="code">[inf..sup]</code>. Raise <code class="code">Invalid_argument</code> if <code class="code">inf > sup</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALint"></a>int : <code class="type"><a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> The largest representable domain. Handy to create variables for which bounds cannot be previously known. It is actually much smaller than <code class="code">interval min_int max_int</code> (which really is the biggest one) to try to prevent overflows while computing bounds of expressions involving such variables.<br> </div> <pre><span class="keyword">val</span> <a name="VALboolean"></a>boolean : <code class="type"><a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> The domain containing <code class="code">0</code> and <code class="code">1</code>.<br> </div> <br> <br> <pre><span class="keyword">val</span> <a name="VALis_empty"></a>is_empty : <code class="type"><a href="Domain.html#TYPEt">t</a> -> bool</code></pre><div class="info"> <code class="code">is_empty d</code> tests whether the domain <code class="code">d</code> is empty or not.<br> </div> <pre><span class="keyword">val</span> <a name="VALsize"></a>size : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">size d</code> returns the number of integers in <code class="code">d</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALmin"></a>min : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><pre><span class="keyword">val</span> <a name="VALmax"></a>max : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">min d</code> (resp. <code class="code">max d</code>) returns the lower (resp. upper) bound of <code class="code">d</code>. If <code class="code">d</code> is empty, the behaviour is unspecified (incorrect return value or exception raised).<br> </div> <pre><span class="keyword">val</span> <a name="VALmin_max"></a>min_max : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> * <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">min_max d</code> returns both the lower and upper bound of <code class="code">d</code>. If <code class="code">d</code> is empty, the behaviour is unspecified (incorrect return value or exception raised).<br> </div> <pre><span class="keyword">val</span> <a name="VALiter"></a>iter : <code class="type">(<a href="Domain.html#TYPEelt">elt</a> -> unit) -> <a href="Domain.html#TYPEt">t</a> -> unit</code></pre><div class="info"> <code class="code">iter f d</code> successively applies function <code class="code">f</code> to all element of <code class="code">d</code> in increasing order.<br> </div> <pre><span class="keyword">val</span> <a name="VALinterval_iter"></a>interval_iter : <code class="type">(<a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> -> unit) -> <a href="Domain.html#TYPEt">t</a> -> unit</code></pre><div class="info"> <code class="code">interval_iter f d</code> successively applies function <code class="code">f</code> to the bounds of all the disjoint intervals of <code class="code">d</code> in increasing order. E.g. a suitable function <code class="code">f</code> to print a domain can be defined as <code class="code">fun mini maxi -> Printf.printf "%d..%d " mini maxi</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALmem"></a>mem : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> bool</code></pre><pre><span class="keyword">val</span> <a name="VALmember"></a>member : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> bool</code></pre><div class="info"> <code class="code">member n d</code> tests if <code class="code">n</code> belongs to <code class="code">d</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALvalues"></a>values : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> list</code></pre><div class="info"> <code class="code">value d</code> returns the list of values of the domain <code class="code">d</code><br> </div> <pre><span class="keyword">val</span> <a name="VALfprint_elt"></a>fprint_elt : <code class="type">Pervasives.out_channel -> <a href="Domain.html#TYPEelt">elt</a> -> unit</code></pre><pre><span class="keyword">val</span> <a name="VALfprint"></a>fprint : <code class="type">Pervasives.out_channel -> <a href="Domain.html#TYPEt">t</a> -> unit</code></pre><div class="info"> Pretty printing of elements and domains.<br> </div> <pre><span class="keyword">val</span> <a name="VALsprint"></a>sprint : <code class="type"><a href="Domain.html#TYPEt">t</a> -> string</code></pre><div class="info"> <code class="code">sprint d</code> returns a string representation of <code class="code">d</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALincluded"></a>included : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> bool</code></pre><div class="info"> <code class="code">included d1 d2</code> tests whether domain <code class="code">d1</code> is included in domain <code class="code">d2</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALsmallest_geq"></a>smallest_geq : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><pre><span class="keyword">val</span> <a name="VALgreatest_leq"></a>greatest_leq : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">smallest_geq dom val</code> (resp. <code class="code">greatest_leq dom val</code>) returns the smallest (resp. greatest) value in <code class="code">dom</code> greater (resp. smaller) than or equal to <code class="code">val</code>. Raises <code class="code">Not_found</code> if <code class="code">max dom < val</code> (resp. <code class="code">min dom > val</code>).<br> </div> <pre><span class="keyword">val</span> <a name="VALlargest_hole_around"></a>largest_hole_around : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> * <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">largest_hole_around dom val</code> returns the largest hole (interval) in <code class="code">dom</code> centred around <code class="code">val</code>. Returns <code class="code">(val, val)</code> if <code class="code">val</code> belongs to <code class="code">dom</code> and raises <code class="code">Not_found</code> if <code class="code">val</code> is outside <code class="code">dom</code> bounds. Equivalent to <code class="code">(greatest_leq dom val, smallest_geq dom val)</code> but faster.<br> </div> <pre><span class="keyword">val</span> <a name="VALchoose"></a>choose : <code class="type">(<a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> -> bool) -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">choose ord d</code> returns the mininum value of <code class="code">d</code> for order <code class="code">ord</code>. Raises <code class="code">Not_found</code> if <code class="code">d</code> is empty.<br> </div> <br> <br> <pre><span class="keyword">val</span> <a name="VALadd"></a>add : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">add n d</code> returns <code class="code">d</code> <code class="code">{n}</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALremove"></a>remove : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">remove n d</code> returns <code class="code">d</code> <code class="code">{n}</code>. Returns <code class="code">d</code> if <code class="code">n</code> is not in <code class="code">d</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALremove_up"></a>remove_up : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><pre><span class="keyword">val</span> <a name="VALremove_low"></a>remove_low : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">remove_up n d</code> (resp. <code class="code">remove_low n d</code>) returns <code class="code">d</code> <code class="code">[n+1..max_int]</code> (resp. <code class="code">d</code> <code class="code">[min_int..n-1]</code>), i.e. removes values stricly greater (resp. less) than <code class="code">n</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALremove_low_up"></a>remove_low_up : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">remove_low_up low up d</code> is a shortcut for <code class="code">remove_up up (remove_low low d)</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALremove_closed_inter"></a>remove_closed_inter : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">remove_closed_inter inf sup d</code> returns <code class="code">d</code> <code class="code">[inf..sup]</code>, i.e. removes values greater than or equal to <code class="code">inf</code> and less or equal to <code class="code">sup</code> in <code class="code">d</code>. Returns <code class="code">d</code> if <code class="code">inf > sup</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALremove_min"></a>remove_min : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><pre><span class="keyword">val</span> <a name="VALremove_max"></a>remove_max : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">remove_min d</code> (resp. <code class="code">remove_max d</code>) returns <code class="code">d</code> without its lower (resp. upper) bound. Raises <code class="code">Invalid_argument</code> if <code class="code">d</code> is empty.<br> </div> <pre><span class="keyword">val</span> <a name="VALintersection"></a>intersection : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><pre><span class="keyword">val</span> <a name="VALunion"></a>union : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> Intersection (resp. union) on domains.<br> </div> <pre><span class="keyword">val</span> <a name="VALdifference"></a>difference : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">difference big small</code> returns <code class="code">big</code> <code class="code">small</code>. <code class="code">small</code> must be included in <code class="code">big</code>, otherwise the behaviour is unspecified (incorrect return value or exception raised).<br> </div> <pre><span class="keyword">val</span> <a name="VALdiff"></a>diff : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">diff d1 d2</code> returns <code class="code">d1</code> <code class="code">d2</code>, i.e. domain of elements in <code class="code">d1</code> which are not in <code class="code">d2</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALminus"></a>minus : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">minus d</code> returns the domain of opposite values of <code class="code">d</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALplus"></a>plus : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">plus d n</code> translates a domain by <code class="code">n</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALtimes"></a>times : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEt">t</a></code></pre><div class="info"> <code class="code">times d k</code> expands a domain by factor <code class="code">k</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALcompare"></a>compare : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">compare d1 d2</code> is a comparison function working first on the cardinal, then (if <code class="code">d1</code> and <code class="code">d2</code> have the same size) on the lexicographic order of the domains (expressed in extension).<br> </div> <pre><span class="keyword">val</span> <a name="VALcompare_elt"></a>compare_elt : <code class="type"><a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a> -> <a href="Domain.html#TYPEelt">elt</a></code></pre><div class="info"> <code class="code">compare_elt e1 e2</code> is a comparison function on elements of domains. Convenient to use the <code class="code">Domain</code> module as a functor argument as in module <code class="code">Var</code>.<br> </div> <pre><span class="keyword">val</span> <a name="VALdisjoint"></a>disjoint : <code class="type"><a href="Domain.html#TYPEt">t</a> -> <a href="Domain.html#TYPEt">t</a> -> bool</code></pre><div class="info"> <code class="code">disjoint d1 d2</code> tests whether <code class="code">d1</code> and <code class="code">d2</code> are disjoint.<br> </div> </body></html>