SMT Solvers (or Theorem Provers) have traditionally been used for verifying correctness of systems
that have been annotated with relevant inductive invariants. Such an annotation usually is an undesirable
burden on the user. This project explores techniques for using SMT solvers
to automatically discover inductive invariants for proving given safety properties of systems. Additionally,
this project also explores techniques for using SMT solvers to synthesize systems in the
first place given enough specifications.

Saurabh Srivastava, who is leading work on this project in the context of software
systems for his Phd dissertation, has maintained a more detailed webpage here.

Papers

From Program Verification to Program Synthesis, POPL 2010,
Saurabh Srivastava, Sumit Gulwani, and Jeffrey Foster
[abstract
|ps
|pdf
|ppt slides]
This paper describes how to use program verification tools in an almost off-the-shelf manner to not only verify programs against their specifications, but also to synthesize them in the first place given their full-functional specifications. We can automatically synthesize several algorithms from undergraduate textbooks such as sorting algorithms, dynamic programming algorithms, and some numerical algorithms such as Strassen's sub-cubic matrix multiplication.

Program Verification using Templates over Predicate Abstraction , PLDI 2009,
Saurabh Srivastava and Sumit Gulwani
[abstract
|ps
|pdf
|ppt slides]
This paper describes how to discover quantified invariants over a given set of predicates and templates (in order to prove given safety assertions) using SMT solvers. Additionally, it also describes how to discover quantified pre-conditions that ensure validity of given safety assertions, in case the safety assertions do not always hold.