This course studies the formal foundations of programming languages and their use in building reliable software. Topics include operational and axiomatic semantics, compiler correctness, Hoare logic and automated verification, the lambda calculus, type systems and type inference, type classes and monads, program analysis, and memory safety. Lectures and assignments use the Rocq Prover, Haskell, and Rust.
The lecture notes are Rocq files meant to be stepped through interactively in your editor. They are updated during the term; the latest versions are always in the course repository.
Prop, predicates, and relations. Logical connectives and their proof rules as tactics: implication, universal quantification, True and False, negation, disjunction, conjunction, if and only if, equality, and existential quantification. Inductively defined propositions, proof by contradiction and the excluded middle, and induction on the derivation of a proposition.Read the instructions at the top of each file before you start. Only the tactics covered in class may be used, and submitted files must compile. Each assignment is available in English and in Greek, and is submitted through Helios.
imp.v with the Imp definitions from Section 3 and a Makefile; follow the README inside and submit only assignment3.v.Further reading: PL resources, classic PL papers, and research schools and workshops for students.
If you would like to do your diploma thesis on formal verification, interactive theorem proving, verified compilers, or AI-assisted proof mechanization, see the thesis topics page for the currently available topics. More topics are available on request, and you are welcome to propose your own.