Types and traits for Programming by Navigation
Programming by Navigation is an interactive program synthesis problem in
which a [StepProvider] provides a list of next [Step]s that a step
decider can choose between.
To solve the Programming by Navigation Synthesis Problem, these steps are
required to satisfy properties called Strong Soundness and Strong
Completeness, which roughly say that all provided steps can lead to a valid
solution and that all possibly-reachable valid solutions are reachable among
just the provided steps (respectively). Validity is an arbitrary notion
defined by a [ValidityChecker].
Usage
The [Controller] struct can be used to conveniently manage a Programming
by Navigation interactive session. Its API (and implementation) is a good
starting point to see how all the components hook together.