About this course

CSCI 54 “Discrete Math and Functional Programming” is the second course in our computer science sequence. Its goals are twofold: to give you a solid foundation for programming and to introduce you to formal proof.

Instructor and TAs

This course is taught by me—Michael Greenberg.

The TAs are Austin Blatt (head), Mehdi Drissi, Alex Hof, Katie Li, Vivaswat Ojha, and Adam Starr.


We will be using Piazza for class discussion. Instead of emailing questions directly to me, please post your questions on Piazza. If you have any problems or feedback for the developers, email team@piazza.com.


You must have taken some version of CS 051 or an equivalent, like getting a 4 or 5 on the AP CS exam. Since this course is part of the Pomona introductory sequence, you may not take this course if you've already started the Harvey Mudd introductory sequence.


Programs for this course will be run on the Pomona College Computer Science department’s lab facilities, based in Edmunds 227. You are welcome to use other computers to write and test your programs, but they must run on our facilities. You may log in remotely to any of the lab machines using ssh. Please do not log into any of our servers (e.g., project or xserv) to do homework.

If you do not have an account on the Pomona College Computer Science network, please request one immediately.

We’ll be using Coq 8.6.1, though any version of 8.6 should work. Do not use Coq 8.7, which is incompatible with our textbook. You’ll probably want to install Coq on your own computer, but it should be available (along with CoqIDE) on all of the lab machines and on little.cs.pomona.edu. In addition to CoqIDE, which comes with Coq itself, I recommend Proof General, an emacs mode for working with Coq scripts.

We'll build up our own tactics guide as the course progresses. If you have suggestions of explanations and examples, please don't hesitate to contribute!

Installing Coq

To install Coq on OS X, I recommend the following steps:

  1. Download and install Coq 8.6.1
  2. Get Homebrew
  3. In a Terminal, run brew install graphviz

If that process doesn't work, you can install Coq manually like so:

  1. Get Homebrew
  2. In a Terminal, run brew install opam
  3. In a Terminal, run opam switch 4.0.5
  4. In a Terminal, run opam install coq=8.6.1

If you're an Emacs user, then you'll want to use Proof General. If you would also like CoqIde, you'll need to run the following additional commands:

  1. In a Terminal, run brew install gtksourceview
  2. In a Terminal, run opam install coqide=8.6.1

If you have any problems, please don't hesitate to ask on Piazza or come by office hours.

Lectures and readings

The course home page has a listing of the planned material.


Half of the course will use Coq as the main grader: if Coq accepts your proof, it’s correct! The other half of the course will be on paper proofs, which will be graded by hand. There will be in-class quizzes, but they will not be for credit.

Your grade for the course will be determined by your aggregate grades on:

  • homework (30%)
  • midterm (30%)
  • final (40%)

Turning in homework

Homework will be a mix of Coq and paper proofs, typically as a single file. You’ll submit homework via the CS submit server; you may have to manually 'enroll' in the course. Homework is due on Wednesdays at 5pm.

Homework that doesn’t compile, due to syntax or type errors, gets no points.

Late policy and resubmission

This course is rife with dependencies and is very homework-oriented; much of the learning you do will happen while you’re doing homework!

I will allow you to resubmit each homework no more than once. I will accept only one resubmission per week, and I will only re-grade the automatically graded Coq portions. After resubmission, your grade will be computed as a weighted average: 25% your original grade, 75% your new grade.

Resubmission is in lieu of any late policy. If you do not submit a homework but then resubmit it for full credit, your grade on that homework will be 75%.


Learning any new language is challenging, and Coq is very different from conventional programming languages. I encourage you to help each other learn the language and I also encourage you to discuss the text.

However: all work in the course must be your own. As explained in the student handbook, this means that the work you turn in must represent only your own work. It must not be based on help from others or information obtained from sources other than those approved by the instructor. Examples of acceptable sources of information include:

Examples of unacceptable sources of information include Stack Overflow, Quora, and your classmates’ code.

You should never read or copy another student’s solutions (code or otherwise), exchange files, or share your solutions with anyone else in the class until after everyone involved has turned in their work. If a discussion with another student helped you find your answer, mention that in a comment. It’s hard to tell the difference between uncredited help and plagiarism (because they’re the same thing).

If any of this is unclear, please: just ask me.

Failure to abide by these rules is considered plagiarism, and will result in severe penalties. The first offense typically results in failing the assignment and referral to the appropriate college office or committee—which may mean further consequences. See the CS Academic Honesty Policy and Pomona Academic Standards. for further information. Please don’t put anyone—me, you, or anyone else—in this unpleasant situation.


Pomona students seeking academic accommodations should contact Jan Collins-Eaglin in the Dean of Students Office. You’ll need to meet with Jan to discuss appropriate accommodations and provide documentation as necessary.

Students from other colleges should contact their home college’s disability coordinator for accommodations. The coordinators are:

We’re in this together

This is my second time teaching this course to undergraduates; it's the first time through some of this material. Let’s make a deal. My side: if things aren’t working, I’ll change them. Your side: if things aren’t working, you’ll tell me.