Welcome to CSC 208! In this course, we study the theoretical foundations of computer science, i.e., discrete mathematics. Along the way, we will develop mathematical literacy skills that will allow us to read and scrutinize mathematical prose as well as author rigorous mathematical arguments. While it may feel like a topic unrelated to the programming-focused computer science courses you’ve taken so far, we will make the argument throughout the semester that:
- Mathematical literacy is really algorithmic literacy and
- The problem solving techniques of a successful mathematician are identical to those of a successful programmer.
Thus, while computer science is not mathematics, it is critical that every computer scientist has a foundational understanding of the mathematics that underlie our discipline!
In our first class of the semester, we will dive into material. However, rather than diving into the deep end of the mathematics pool, we’re going to begin our exploration of discrete mathematics at a middle ground between programming and mathematics: program correctness. We will look at how we might state and ultimately prove correctness properties of programs. Program correctness will serve as our bridge from the world of programming to the world of mathematical logic, the starting point for our exploration of discrete mathematics.
Course Cadence
In this course, we will build two important soft skills in learning mathematics and programming:
- Collaboration: employ appropriate collaborative strategies to productively solve problems with peers.
- Practice: habitualize learning mathematics through self-driven, hands-on exploration and problem-solving practice.
Two of four main activities of the course will you develop these skills.
- The majority of our classes will feature laboratory assignments where you will work with your peers on various sorts of activities meant to mimic and reinforce the kinds of collaborative problem-solving and engineering situations you will encounter outside of Grinnell.
- Before every class, you will need to complete a reading in preparation for the lab. However, reading about mathematics (or programming for that matter) is never enough—you need to actually do math to learn about it. To this end, every reading will have a required daily drill, a few quick questions to reinforce the concepts of the reading. These questions mimic the sorts of exercises you might do when reading through a piece of mathematical prose and need to check your understanding.
In our first class, we will have a lab activity to set up a Markdown environment and to re familiarize ourselves with the Racket programming language. However, there will be nothing to turn in for this lab. Official turn-ins will begin on our second class with a required reading on symbolic evaluation and an associated lab during that class period.
Concrete Evaluation
Our journey into program correctness begins with formalizing our intuition behind how Racket programs operate. This will lead us to a model of evaluation based on a substitutive semantics of evaluation. Continue reading about Racket and concrete evaluation below: