About this course

Welcome to CS/MATH 220! The official course description:

Students will practice formal reasoning over discrete structures through two parallel modes: mathematical proofs and computer programs. We will introduce sets and lists, Boolean logic, and proof techniques. We will explore recursive algorithms and data types alongside mathematical and structural induction. We consider relations and functions as mathematical objects built on set theory and develop idioms of higher-order programming. If time permits, additional topics may include graphs, lattices, or groups, and their applications to computer science.

I am excited to bring together so many beautiful ideas in this course.

Course goals

By the end of this class, you will be able to:

Manipulate forms in symbolic logic, including forms that use universal and existential quantifiers;

Prove propositions about sets, relations, and functions, using proof techniques including direct proof, proof by contradiction, proof by division into cases, proving the contrapositive, and proof by induction;

Write proofs that not only are logically correct, but exhibit coherence and cohesion;

Find counterexamples to disprove conjectures;

Write functions in the SML programming language, using functional programming concepts such as pattern matching, recursion, and functions as first-class values;

Appreciate the relationship between functional programming and mathematical constructs;

Model phenomena in nature or culture using mathematical concepts and the SML programming language;

Appreciate two proofs that some problems cannot be solved algorithmically.

Recurring themes include:

Writing and using formal definitions. We look carefully at formal, rigorous definitions of mathematical ideas, built from primitive terms.

Thinking recursively. Recursion is defining something in terms of itself. This technique is crucial to some kinds of algorithms and to some kinds of mathematical definitions and proofs.

Analysis and synthesis. Many of our proofs and programs comprise two main steps: Breaking something apart and putting something else together.

Overview

For a detailed outline, see the table of contents for the first seven chapters in your textbook.

Set and List.

We meet the basic mathematical concepts of set, element, set operations, cardinality, Cartesian product, and powerset. We learn the basics of the ML programming language including functions and datatypes. We learn to use ML's main composite type, the list.

Preposition.

We explore the system of Boolean logic (the "first-order predicate calculus"). This heading is characterized by three "games" to exercise your understanding of symbolic logic: 1. verifying logical equivalences; 2. verifying argument forms; 3. verifying argument forms with quantification. We also write ML programs that use Boolean operators and consider how the quantification of a problem specification affects the algorithm to solve it.

Proof.

We learn to write careful proofs of set-theoretical propositions. This includes one of the most challenging sections, proofs about powersets. We also consider the connections between proofs and algorithms.

Relation.

We build on our understanding of sets to consider the definition of mathematical relations and their properties, propositions about them, and programs that manipulate them. The relation is a useful concept in itself, but this heading also lets us practice further the proof and programming techniques we have learned so far.

Self-reference.

Earlier parts of our study will have introduced recursive definitions, but here we tackle the idea head-on. Specific topics are recursive types in ML programming and proofs using structural and mathematical induction.

Function.

We study functions as mathematical objects built on set theory. These proofs will build on all the techniques you have learned so far. We also learn programming idioms that build on the theory of functions as mathematical objects. We'll also learn how to count members of sets!

Acknowledgments

Thanks to Thomas VanDrunen, John David Stone, and John Stratton for informing my development of the course.

The syllabus page shows a table-oriented view of the course schedule, and the basics of
course grading. You can add any other comments, notes, or thoughts you have about the course
structure, course policies or anything else.