  We propose a new conflict-driven program synthesis technique that is capable
of learning from past mistakes. Given a spurious program that violates the
desired specification, our synthesis algorithm identifies the root cause of the
conflict and learns new lemmas that can prevent similar mistakes in the future.
Specifically, we introduce the notion of equivalence modulo conflict and show
how this idea can be used to learn useful lemmas that allow the synthesizer to
prune large parts of the search space. We have implemented a general-purpose
CDCL-style program synthesizer called Neo and evaluate it in two different
application domains, namely data wrangling in R and functional programming over
lists. Our experiments demonstrate the substantial benefits of conflict-driven
learning and show that Neo outperforms two state-of-the-art synthesis tools,
Morpheus and Deepcoder, that target these respective domains.
