Purely Functional Lazy Non-deterministic Programming

Functional logic programming and probabilistic programming have
demonstrated the broad benefits of combining laziness (non-strict
evaluation with sharing of the results) with non-determinism. Yet these
benefits are seldom enjoyed in functional programming, because the
existing features for non-strictness, sharing, and non-determinism in
functional languages are tricky to combine.

We present a practical way to write purely functional lazy
non-deterministic programs that are efficient and perspicuous. We
achieve this goal by embedding the programs into existing languages
(such as Haskell, SML, and OCaml) with high-quality implementations,
by making choices lazily and representing data with non-deterministic
components, by working with custom monadic data types and
search strategies, and by providing equational laws for the programmer
to reason about their code.