CSE 311: Topics

1. Formal Logic

Formal Logic gives us tools for precisely describing and analyzing logical statements. Real-world problems are usually given to us in English. In order to apply our new tool, we must first “formalize” the problem by translating the statement into Logic. Then, we can analyze it using tools such as truth tables or SAT solvers.

2. Proofs

In this topic, we will learn a new way to reason about facts in logic. Previously, we saw how to show that various facts are equivalent. Here, we will see how to infer new facts from known ones using a “proof”. This includes equivalence as a special case (when we can infer either fact from the other) but is vastly more powerful.

We will begin by writing our proofs formally, using inference rules. This makes them easy to check. Afterward, we will begin learning how to write English proofs by translating our formal proofs into English. As the course continues, we aim to get more confortable writing proofs directly in English, without working formally.

3. Number Theory

In the remainder of the course, we will look at different kinds of mathematical objects that show up frequently in computer science. In addition to learning about their properties, this will give us settings in which to practice the proof techniques we learned in Topic 2.

In this topic, we look at important properties of numbers. All data in a computer is stored as numbers and the only operations computers can do on their own are arithmetic calculations. For that reason, numbers arise everywhere in computer science, and we need to understand them well in order to make computers do interesting things for us.

4. Set Theory

Our goal for the remainder of the course is to move beyond numbers to look at more interesting kinds of mathematical objects that show up in computer science. Such objects are usually described in the language of set theory, which will study in this topic.

In addition to their use throughout theoretical computer science, sets also arise in almost every area of programming. In Java, for example, Set and the closely related Map interfaces are two of the most widely used parts of the standard Java library.

5. Languages

In this topic, we begin our study of theoretical computer science. We will start by looking at two declarative ways of defining “languages”. Next, we see how to define a language by describing a “machine” that can recognize strings in the language. We will look at a few different kinds of machines and not only relate them to each other but also connect them to the ways of defining languages we saw earlier. This will eventually lead us to showing that our simple machines are not sufficiently powerful to define some languages we have seen before.

6. Computability

Are there problems that computers cannot solve? In this topic, we will see there are certain languages that cannot be described by any regular expression. What about a similar question for Java? Are there languages that cannot be recognized by any Java program?

Surprisingly, the answer is yes. We will discuss an important sense in which there are “more” languages than there are Java programs. Hence there must be some languages that are not described by any Java program. These languages are called “uncomputable” or “undecidable”. (To make this argument precise, we will need to define what it means for one infinite set to have “more” elements than another.) We will also see Turing's famous example of an uncomputable language: the Halting Problem.

  • Lecture slides (more coming soon)

More topics will be added here as the course continues...