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 learn
how 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 the language of logic, 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.