If you're interested in either of these projects, and have the relevant background, drop me an email at razvan at comp dot nus dot edu dot sg
Extend JML with modal logic/separation logic -- formalization in Coq
The Java Modeling Language is a specification language for Java programs, using Hoare style pre- and post-conditions and invariants, which has been implemented in verification tools such as ESC/Java and Krakatoa. One of the main pitfalls of the Hoare formalism, and consequently of JML, is its inability to produce concise reusable proofs for a programming language with concurrency, mutable store, dynamic allocation, and garbage collection. Nevertheless, in recent developments, separation logic and dynamic logic have been jointly used, quite successfully, to correct this drawback.
The purpose of this project is to extend the JML specification language with separation and modal constructs that would make it more expressive, and thus more concise in expressing mutable store properties such as pointer (un)aliasing, or the fact that a possible concurrent invocation of the garbage collector will leave the current instruction unaffected. The new specification language features must be accompanied by appropriate inference rules, which are expected to produce concise reusable proofs for programs that manipulate arrays, linked lists, trees, and graphs. The entire approach must be formalized in a proof assistant (preferrably Coq), and proven sound mechanically.
Interactive verification of object-oriented programs
This project is a possible concurrent development of the one listed above. Following the example of the Krakatoa program verifier, which can be used to interactively develop correctness proofs for JML annotated Java programs, we propose to build an interactive program verifier for the extension of JML proposed above.
Automation of inductive proofs in Coq
Proofs by induction are notoriously hard to automate. The main difficulty is that in general the number of choices for every proof step is large, and that results in a search space of prohibitive size. However, in recent work, we have successfully applied search techniques to "discover" induction proofs for implication-based goals in a constraint logic programming setting. Our search techniques employ a notion of interpolation which, in a constraint-based setting, happens to have a variety of instances that can be efficiently implemented.
The aim of this project is to implement our method in a more general setting, as a tactic in the proof assistant Coq. The challenge here is that, in the realm of recursively defined predicates that Coq
allows, the notion of interpolation is no longer as straightforward as in the constraint based setting, and requires an innovative implementation.
An extensible tactical
language for proof algorithms
This is a possible concurrent project with the one listed above. For many proof assistants, the tactical language (i.e. the language used to develop new tactics) is not powerful enough to allow the development of search techniques such as the one mentioned above. In this project, we would aim to extend the tactical language of a proof assistant (preferrably Coq) in such a way that the search algorithm could be implemented in this language.
Extraction of efficient
programs from verification proofs
Coq is a theorem prover based on the Curry-Howard
isomorphism. This isomorphism specifies that the type of an expression in a
typed higher-order programming language (such as Caml) can be interpreted as a
logic formula. The arrow that denotes a function type could be interpreted as
implication, while the tupling constructor could be interpreted as conjunction.
Based on the Curry-Howard isomorphism, a logic formula is true only when there
exists an expression having a type that is syntactically identical with the
formula of interest. For instance, the formula
A->A
(that is, A
implies A)
is true because for any type A we can construct an expression with type
A->A
(i.e. function from
A
to A).
This expression is
(fun x:A=>x),
that is, the identity function. In the Coq proof assistant, as the user develops
a proof by successively applying tactics to the goal at hand, the system builds
in the background an expression of a type syntactically identical to the goal.
This expression can be translated into a programming language and executed,
performing an operation that guarantees that the postcondition is valid. For
instance, in proving that a list is sorted, a by-product would be a sorting
function, that is, a function whose output is guraranteed to be sorted. This
function can be translated into Ocaml, and used to perform sorting operations on
lists. This operation is called _extraction_ . However, since the proof
assistant's main objective is to produce a concise, readable proof, the
extraction is, in general, not a very efficient function. In fact, it is
completely counterintuitive for the user, as he/she develops the proof, to
produce efficient code.
In this project, we would like to explore a methodology that would allow the
user to control the efficiency of their extraction in a step-by-step manner.
This can be done by assigning a semantics to each tactic, and representing the
proof in a way that makes its time complexity apparent. Armed with a correct set
of tactics, the user could, throughout an interactive proof, not only produce an
extraction that proves the goal of interest, but also produce an extraction that
is efficient.