This course is about discrete structures and forms an introduction to the theoretical side of computer science. Discrete structures and discrete mathematics turn out to be the “calculus’’ of computer science--these are the structures that students will use to model real-world problems, to build algorithms upon, and to program with (both for modeling problems as well as use in data-structures and algorithms). In this course students will learn about various discrete structures (numbers, sets, relations, functions, trees, graphs), how to talk about them (propositional and predicate logic), how to prove things about them (using contradiction, construction, induction, combinatorics), and how to read and write literate formal mathematics. Students will also get a quick introduction to key applications to algorithmic analysis (like asymptotic worst-case running time analysis for algorithms). This “calculus of computer science’’ will serve students as a foundation for computational thinking.