This module contains a collection of functions for obtaining lists of solutions to constraints or values of expressions. These operations are useful to encapsulate nondeterministic operations between I/O actions in order to connect the worlds of logic and functional programming and to avoid nondeterminism failures on the I/O level.
In contrast the "old" concept of encapsulated search (which could be applied to any subexpression in a computation), the operations to encapsulate search in this module are I/O actions in order to avoid some anomalities in the old concept.
Author: Michael Hanus
Version: June 2021
getAllValues
:: a > IO [a]
Gets all values of an expression (currently, via an incomplete depthfirst strategy). 
getOneValue
:: a > IO (Maybe a)
Gets one value of an expression (currently, via an incomplete lefttoright strategy). 
getAllSolutions
:: Data a => (a > Bool) > IO [a]
Gets all solutions to a constraint (currently, via an incomplete depthfirst lefttoright strategy). 
getOneSolution
:: Data a => (a > Bool) > IO (Maybe a)
Gets one solution to a constraint (currently, via an incomplete lefttoright strategy). 
getAllFailures
:: a > (a > Bool) > IO [a]
Returns a list of values that do not satisfy a given constraint. 
getSearchTree
:: (Data a, Data b) => [a] > (b > Bool) > IO (SearchTree b a)
Computes a tree of solutions where the first argument determines the branching level of the tree. 
A search tree for representing search structures.
Constructors:
SearchBranch
:: [(b,SearchTree a b)] > SearchTree a b
Solutions
:: [a] > SearchTree a b
Gets all values of an expression (currently, via an incomplete depthfirst strategy). Conceptually, all values are computed on a copy of the expression, i.e., the evaluation of the expression does not share any results. Moreover, the evaluation suspends as long as the expression contains unbound variables. 
Gets one value of an expression (currently, via an incomplete lefttoright strategy). Returns Nothing if the search space is finitely failed. 
Gets all solutions to a constraint (currently, via an incomplete depthfirst lefttoright strategy). Conceptually, all solutions are computed on a copy of the constraint, i.e., the evaluation of the constraint does not share any results. Moreover, this evaluation suspends if the constraints contain unbound variables. Similar to Prolog's findall. 
Gets one solution to a constraint (currently, via an incomplete lefttoright strategy). Returns Nothing if the search space is finitely failed. 
Returns a list of values that do not satisfy a given constraint.

Computes a tree of solutions where the first argument determines the branching level of the tree. For each element in the list of the first argument, the search tree contains a branch node with a child tree for each value of this element. Moreover, evaluations of elements in the branch list are shared within corresponding subtrees. 