Depth first search #
We perform depth first search of a tree or graph,
where the neighbours of a vertex are provided either by list α → List α
or a lazy list α → MLList MetaM α
.
This is useful in meta code for searching for solutions in the presence of alternatives. It can be nice to represent the choices via a lazy list, so the later choices don't need to be evaluated while we do depth first search on earlier choices.
A generalisation of depthFirst
, which allows the generation function to know the current
depth, and to count the depth starting from a specified value.
Depth first search of a graph generated by a function
f : α → m α
.
Here m
must be an Alternative
Monad
,
and perhaps the only sensible values are List
and MLList MetaM
.
The option maxDepth
limits the search depth.
Note that if the graph is not a tree then elements will be visited multiple times.
(See depthFirstRemovingDuplicates
)
Equations
- One or more equations did not get rendered due to their size.
Instances For
Variant of depthFirst
,
using an internal HashSet
to record and avoid already visited nodes.
This version describes the graph using α → MLList m α
,
and returns the monadic lazy list of nodes visited in order.
This is potentially very expensive. If you want to do efficient enumerations from a generation function, avoiding duplication up to equality or isomorphism, use Brendan McKay's method of "generation by canonical construction path".
Equations
- One or more equations did not get rendered due to their size.
Instances For
Variant of depthFirst
,
using an internal HashSet
to record and avoid already visited nodes.
This version describes the graph using α → List α
, and returns the list of nodes visited in order.
Equations
- depthFirstRemovingDuplicates' f a maxDepth = Option.get! (MLList.force (depthFirstRemovingDuplicates (fun (a : α) => MLList.ofList (f a)) a maxDepth))