| - Up - | Next >> |
All these engines take a script as input and return a list of its solutions.
base.one{Search.base.one+ScriptP?Xs}
returns a singleton list containing the first solution of the script +ScriptP (a unary procedure) obtained by depth-first search. If no solution exists, nil is returned.
As an example,
{Search.base.one proc {$ X}
choice
choice X=ape [] X=bear end
[] X=cat
end
end} returns the list [ape].
base.all{Search.base.all+ScriptP?Xs}
returns the list of all solutions of the script +ScriptP (a unary procedure) obtained by depth-first serach. As an example,
{Search.base.all proc {$ X}
choice
choice X=ape [] X=bear end
[] X=cat
end
end} returns the list [ape bear cat].
Search.base.best{Search.base.best+ScriptP+OrderP?Xs}
returns a singleton list containing the best solution with respect to the order +OrderP (a binary procedure) of the script +ScriptP (a unary procedure) obtained by branch and bound search. If no solution does exist, nil is returned.
The branch and bound strategy works as follows. When a solution is found, all the remaining alternatives are constrained to be better with respect to the order +OrderP. The binary procedure +OrderP is applied with its first argument being the previous solution, and its second argument the root variable of a space for one of the remaining alternatives.
For instance, the following script constrains its root variable to a pair of integers, such that a certain equation holds between its components.
proc {Script Root}
X={FD.int 1#10} Y={FD.int 1#10}
in
Y =: 10 - X - 2*Y
Root = X#Y
{FD.distribute split Root}
end
With the order
proc {MaxSum Old New}
Old.1 + Old.2 <: New.1 + New.2
end we can search for a solution with maximal sum of X and Y by
{SearchBest Script MaxSum} This returns the singleton list [7#1].
Similarly, we can search for the solution with the maximal product, by using the order:
proc {MaxProduct Old New}
Old.1 * Old.2 <: New.1 * New.2
endin:
{SearchBest Script MaxProduct} This returns the singleton list [4#2].
| - Up - | Next >> |