I’m working on a large-scale development used to prove properties about programs. A component of this development is coded in OCaml. This is a work in progress, and has multiple sub-projecs that you can work on. You don’t need to understand the high-level goal of the entire project to be able to do useful tasks but here it is anyway.
Coq is an interactive theorem prover (ITP), a software tool used to prove logical properties. It’s often used to prove properties about software. Properties in Coq are tedious and often difficult to prove, because it has limited supported for automation of proofs. There also exist automated theorem provers (ATP), software tools that can prove logical properties automatically. A subset of these tools are called SMT (satisfiability modulo theories) solvers.
Proofs in ITPs are harder to perform than proofs in ATPs but they are more desired, essentially because ATPs are more susceptible to bugs. The tool that I’m working on - SMTCoq - uses proofs from SMT solvers (a kind of ATP), to automate proofs in Coq (the ITP), making it easier to perform proofs in Coq. Since SMT solvers are more susceptible to bugs than Coq, the solver emits, in addition to its result, a certificate of its result. SMTCoq checks the SMT solver certificate to make sure that the result of the SMT solver is not buggy.
A significant part of the SMTCoq codebase is a checker for proof certificates from SMT solvers. This checker has already been implemented for a particular language of proofs emitted by SMT solvers (let’s call this language L1 for convenience). Modern SMT solvers now produce proof certificates in a different language (L2). The high-level goal of this project is a translator from L2 down to L1. This translator will allow SMTCoq to support modern SMT solvers, without having to change the code for its checker. Changing the checker is a very difficult task. On the contrary, language translation is a relatively simple task. If you have taken CSC 370 in Fall 2024 with me, you will be familiar with language translation in OCaml. We built interpreters for functional and imperative programming languages that compiled the source code down to OCaml and evaluated them in OCaml. In this project, we interpret/translate L2 down to L1 so that we can utilize the infrastructure that already exists for proof certificates in L1.
A large part of the translator is already built. You can find the code here. There are a lot of lines of code but fundamentally the structure of the program is pretty similar to interpreters written in CSC 370. Proofs are parsed down to a abstract syntax tree (AST) which is defined in the beginning of the linked file. The rest of the file defines functions that modify proof trees (instances of the AST). Tasks/possible projects:
Possible next steps if you're interested:
Skills you will need:
Things that you can potentially get out of this experience:
Coq is an interactive theorem prover (ITP), a software tool used to prove logical properties. It’s often used to prove properties about software. Properties in Coq are tedious and often difficult to prove, because it has limited supported for automation of proofs. However, ITP proofs are highly sought after in industry especially for safety-critical software systems - software whose failure could result in human fatality. For example, in airplanes, medical devices, weapon systems, etc. Another popular application of ITP proofs is in hardware verification - companies like Intel and Apple formally verify their hardware before they build them. Verification of hardware is done at the bit level. Since the verification of the hardware is done in software (recall that an ITP is a software tool), we need a theory to represent bits and proofs in this theory. Bit-vectors - arrays of bits - are commonly used to do bit-level specification and verification. I have been contributing to a bit-vector library in the Coq theorem prover. The library includes a representation of bit-vectors in Coq and proofs of many interesting properties over bit-vectors. The goal of this project is to make interesting contributions to this bit-vector library.
This is one of the more challenging projects but could be equally rewarding.
Skills you will need: