# Project Suggestions for SAV 2008

This list of projects is very preliminary. Your own ideas are welcome. This list is periodically updated.

## Verification-Condition Generator

Implement a general verification condition generator that handles data structures and accepts programs in a subset of a working programming language. Either write a parser or connect it to an existing compiler infrastructure (for example: Scala compiler, Java bytecode reader, CIL system).

You may choose a particular language subset such as:

- purely functional programs that manipulate algebraic data types
- programs that manipulates sets and relations, as the SETL programming language

## Solving Computable Constraints over Finite Domains

Explore techniques for solving constraints over finite domains given by expressive constructs such as recursive definitions and transitive closure.

The theoretical foundation is based on the fact that, if we fix a finite domain, then we can express a wide range of constraints over such domains, which are given by user-specified functions in a subset of a purely functional programming language. For example, quantification becomes an iteration or list fold, transitivity becomes computation of the set of reachable nodes in a graph. The solver for such finite constraints combines search for interpretation of relations with checking whether given constraint is true in interpretation constructed so far.

Relevant techniques are finite model finding, especially Alloy and Kodkod, as well as TestEra and Korat, but deployed in the context of purely functional programs.

An input to such a tool would be a pure function taking as input an interpretation and returning 'true' iff the given constraint is true in the given interpretation. The tool would search for an interpretation for which the given function becomes true. Among important subproblems is a generalization of the notion of boolean constraint propagation to such more general domains.

## Interactive Prover

Write an interactive theorem prover in Scala or Ocaml, following the widely-used LCF approach:

The interactive prover should allow Scala programmer to write proofs in the form of Scala programs. Explore the suitability of Scala as a domain-specific language for writing proofs.

## Verifying Composable Distributed Systems

Modelling distributed systems using combinators and verifying them using model checking or proof-based methods.

## Invariant Inference

Design an algorithm for infering an interesting class of loop invariants.

## SMT Solver

Build a simple SMT (satisfiability modulo theory) solver that uses e.g. Nelson-Oppen combination.

## Quantifier Elimination

Write a quantifier elimination procedure for a theory such as term algebras, or implement a version of Omega test and use it to analyze properties of programs manipulating arrays and integers.

- Omega test (and related papers)

## Infinite Model Construction

Investigate techniques for constructing representations of infinite models for first-order formulas.

## Theorem Proving with Induction

Explore techniques for proving inductive statements such as

and their application to software verification.

## Language Design for Verifiability

Design a language where complex data structures are easy to prove correct. Possibly use ideas from separation logic.

## SAT Solver

Improve your SAT solver further or experiment with new ideas. Your goal would be to get a working solver at least as good as the best solver we had in class competition.

## Combine Specification-Based Testing with Static Analysis

Enable simultaneous use of theorem proving and test-case generation techniques for some subset of the speficiation language.

## Simple Resolution-Based Prover

Accepting TPTP syntax and handling equality, but not necessarily implementing sophisticated orderings.

## Verification Case Study

Use Jahob system to verify some more data structures like these.

# Other Examples

Here is a list of SAV'07 Projects (note that the course last year covered different material).