This module contains a collection of functions for
obtaining lists of solutions to constraints.
These operations are useful to encapsulate
non-deterministic operations between I/O actions in
order to connects the worlds of logic and functional programming
and to avoid non-determinism 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.
| Exported names: |
Datatypes:
SearchTree
Constructors:
SearchBranch
| Solutions
Functions:
getAllFailures
| getAllSolutions
| getOneSolution
| getOneValue
| getSearchTree
| Summary of exported functions: |
|
||
|
||
|
||
|
||
|
| Imported modules: |
| Exported datatypes: |
A search tree for representing search structures.
Constructors:
:: [(b,SearchTree a b)] -> SearchTree a b
:: [a] -> SearchTree a b
| Exported functions: |
:: (a -> Success) -> IO [a]
Gets all solutions to a constraint (currently, via an incomplete depth-first left-to-right 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.
:: (a -> Success) -> IO (Maybe a)
Gets one solution to a constraint (currently, via an incomplete left-to-right strategy). Returns Nothing if the search space is finitely failed.
:: a -> IO (Maybe a)
Gets one value of an expression (currently, via an incomplete left-to-right strategy). Returns Nothing if the search space is finitely failed.
:: a -> (a -> Success) -> IO [a]
Returns a list of values that do not satisfy a given constraint.
Example call: (getAllFailures x c)
x
- an expression (a generator evaluable to various values)
c
- a constraint that should not be satisfied
:: [a] -> (b -> Success) -> IO (SearchTree b a)
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.