Project suggestions from Michael Norrish
I am leaving Britain in December 2002. If you are interested in doing
these projects, you will need to find a supervisor who will be here
for the whole year, though I will happily see you through the
Michaelmas term. Joe Hurd has said that
he will be such a supervisor for these projects, so he's a likely
prospect.
Simple declarative theorem-proving
When specifying systems formally, a significant error-finding benefit
can accrue simply from writing everything down in an expressive logic,
and getting it all to type-check. Actual formal verification of
important properties can almost be relegated to the role of ``nice work
if you can get it''.
The HOL system
currently doesn't allow for this model of work very well. Part of the
reason for this is that script files for HOL inter-mingle ML (which is
the theorem-prover's implementation language) and embedded bits of
logic. We would like to check the logic without having to be able to
parse (and execute) ML as well.
Therefore, the aim of this project is to design a simple file format
in which users could write ``ML-less HOL'', and to then implement at
least two tools for manipulating this format. The first tool would be
the type-checker. It would make sure that the definitions and other
logical material in the file actually made sense at the level of
types. The second tool would do all this and also produce a genuine
HOL theory, using the various facilities already present in HOL.
If this all went well, there would be ample opportunity to extend this
project so that it also included a declarative proof (as opposed to
just definition) element.
Implementing proof kernels
At the core of LCF systems like HOL,
there is a small ``kernel'' that implements the primitive rules of
inference of the logic. There are a number of interesting issues
relating to the design of these kernels. For example
- How to represent free and bound variables?
- Optimising common calculations (such as calculating the set of
free variables)
The project would be to explore this design space by
implementing first a very simple-minded kernel, and then testing a
suite of possible optimisations on top of this initial design. This
problem comes with its own test suite, and admits a very explicit and
clear specification, because of its position as part of HOL.
Comparison of (arithmetic decision/first order logic) procedures
There are a variety of well-known decision procedures for deciding
logical problems. For first order logic, the PartIB course
Logic and proof describes tableau and resolution methods.
Another method is model elimination. In arithmetic, there is also a
variety of methods, including Cooper's algorithm, the Omega Test,
SUP-INF, loop residue and the like.
FOL procedures solve problems like
(forall x y z. R(x,y) and R(y,z) implies
R(x,z)) and R(a,b) and R(b,c) and
R(c,d) implies R(a,d).
Arithmetic procedures solve problems like
2x > x implies x > 0
and
there exist x and y such that
2x + y > 7 and x + 2y < 11
A project in this area would involve implementing appropriate
procedures and then comparing their performance. I can provide
documentation and explanations for the arithmetic procedures.
Word unification
Given an equation involving variables and characters, where variables
can range over strings of any length, and the only operation is string
concatenation, is there any satisfying assignment of strings to
variables to make the two sides of the equation equal?
E.g., given the equation
aXb = aaY
where X and Y are variables, one satisfying
assignment is X = a and Y = b. But X = aa
and Y = ab also works. In fact, there are an infinite number
of unifiers, all of the form X = aZ, Y = Zb, where Z
can be anything at all (including the empty string, as in the first
solution above). There is a horrendously complicated algorithm for
solving these problems. Your task would be to understand it, and then
implement it.
Michael Norrish <Michael.Norrish@cl.cam.ac.uk>
Last modified: Tue Oct 1 13:52:18 BST 2002