From the course catalog:

Building reliable software through formal verification. We weave together five threads: (1) logic, for making and justifying precise claims about programs; (2) proof assistants, to construct rigorous logical arguments; (3) functional programming, both as a method of programming and as a bridge between programming and logic; (4) formal techniques for reasoning about the properties of specific programs (e.g., the fact that a loop terminates on all inputs, or that a sorting function or a compiler obeys a particular specification); and (5) type systems, for establishing well-behavedness guarantees for all programs in a given programming language (e.g., the fact that well-typed Java programs cannot be subverted at runtime).

Prerequisites: CSCI081 PO or CSCI131. Please see the syllabus for more information.


We’ll be using the latest edition of the Software Foundations textbook.

Office hours

I am available for appointments via and on Friday afternoons from 1-2pm.


In general, Wednesdays will be devoted entirely to new material, while Mondays will focus on understanding: students will take turns explaining proofs from the homework. Homework from the previous week is typically due on Wednesday before class.

It will not be particularly useful at first, but the Coq reference manual may eventually be helpful.

Week Monday Presenters Wednesday Lecture/reading Homework due
1 Jan 20 Preface, Basics
2 Jan 25 Jan 27 Induction HW01 (Basics, presentation signups)
3 Feb 1 Reid, Austin Feb 3 Lists HW02 (Induction; skip beq_nat_refl_informal; skip binary_inverse—but give it a go if you have the time)
4 Feb 8 Dan, Becki, Antony Feb 10 Poly HW03 (Lists; skip bag_more_functions, bag_proofs, and bag_count_sum)
5 Feb 15 Austin, Antony Feb 17 Tactics, Logic HW04 (Poly)
6 Feb 22 Becki, Aloke Feb 24 IndProp HW05 (Tactics
do trans_eq_exercise, beq_nat_true, plus_n_n_injective, double_induction, bool_fn_applied_thrice, filter_exercise
do and_exercise, mult_eq_0, not_implies_our_not, double_neg_inf, contrapositive, dist_not_exists, All, tr_rev, evenb_double_conv, excluded_middle_irrefutable)
7 Feb 29 Eric, Aloke Mar 2 IndProp, Maps Start on HW06 (IndProp) now
do ev'_ev, ev_ev__ev, le_trans, Sn_le_Sm__n_le_m, leb_complete, leb_correct, R_equiv_fR
8 Mar 7 Reid, Eric Mar 9 Imp HW06 (IndProp
do the above, re_not_empty/re_not_empty_correct, reflect_iff, palindromes, nostutter
do all of Maps)
Mar 14 Mar 16 Spring break
9 Mar 21 Eric, Austin Mar 23 ImpCEvalFun HW07 (Imp
skip optimizer, short_circuit, add_for_loop)
10 Mar 28 Aloke, Dan Mar 30 Equiv HW08 (ImpCEvalFun
skip ceval_step__ceval_inf)
11 Apr 4 Dan, Antony Apr 6 Hoare Logic HW08 (Equiv
skip equiv_classes, WHILE_true_nonterm_informal, optimize_0plus, better_subst_equiv, inequiv_exercise, p5_p6_equiv, for_while_equiv, capprox)
12 Apr 11 Eric, Dan, Reid Apr 13 Perm, Sort HW09 (Hoare
skip assertions, swap_exercise, repeat)
13 Apr 18 Aloke, Austin Apr 20 SearchTree HW10 (Perm, Sort skip final, optional, three-part exercise in Sort.v)
14 Apr 25 Becki, Antony Apr 27 ProofObjects, Smallstep HW11 (SearchTree skip unrealistically_strong_can_relate, lookup_relateX)
15 May 2 Reid, Becki May 4 Types, Stlc HW12 (ProofObjects, Smallstep skip eval__multistep_inf)

HW14 (Types, Stlc)—which amounts to the final—is due on Thursday, May 12th at 5pm. Seniors will be given a different final to accommodate graduation timing.