Welcome!
This course continues the study of how to design useful
programs, which you started in Fundamentals of Computer Science
1. Instead of programming techniques, here we will emphasize how
to reason ("think") about programs. The goal is to
demonstrate that the programs we design are reliable,
i.e. that they are free of certain types of "bugs" and satisfy
other, user-specified properties, no matter what the input.
The vehicle to achieving such apparently miraculous results is
mathematical logic: We will learn how computation can be
captured in logical terms, and how logical techniques can help
us reason effectively about programs and computation.
Use the links on the left to navigate to the information you need.