Computer Science › Foundations of Computer Science
What separates a convincing argument from a rigorous mathematical proof, and why computer science leans on proof the same way it leans on code.
Formalizing true/false statements with logical connectives (¬, ∧, ∨, →, ↔) and the truth tables that pin down exactly what each one means.
Two formulas that always agree in truth value, and the identities (De Morgan's laws among them) that let you rewrite one into the other.
Statements that depend on a variable (predicates), and the universal (∀) and existential (∃) quantifiers that turn them into full propositions.
Sets, subsets, and the operations — union, intersection, difference, complement — that combine them.
The power set (the set of all subsets) and the Cartesian product (the set of ordered pairs) — the two constructions that make relations and functions possible.
A relation as a subset of a Cartesian product, and the properties — reflexive, symmetric, transitive — that classify how its elements relate to one another.
Vertices and edges, directed and undirected graphs, and the two standard ways — adjacency matrix, adjacency list — to represent one in a program.
A graph that can be drawn on a plane with no edges crossing, and Euler's formula relating its vertices, edges, and faces.
A connected graph with no cycles — the structure behind hierarchies, and the properties (n vertices, n-1 edges) that make a tree a tree.
A function as a special kind of relation, and the three properties — injective, surjective, bijective — that describe how its inputs map to its outputs.
Counting the number of ways to arrange (permutations) or choose (combinations) elements from a set, with or without order mattering.
Counting the size of a union of overlapping sets by adding and subtracting the sizes of their intersections.
If more items are placed into containers than there are containers, some container must hold more than one — a simple idea with surprisingly powerful consequences.
A relation that is reflexive, antisymmetric, and transitive — capturing "comes before" relationships that don't have to compare every pair of elements.
A relation that is reflexive, symmetric, and transitive splits its set into disjoint equivalence classes — one idea with two equivalent descriptions.
Visualizing set operations with Venn diagrams, and proving set identities like De Morgan's laws for sets rigorously rather than just from the picture.
The precise rule for negating a quantified statement — ∀ becomes ∃ (and vice versa) as the negation moves inward — and why getting this wrong is one of the most common proof-writing mistakes.
Every non-empty set of non-negative integers has a least element — the quiet assumption underneath induction and many number-theoretic proofs.
Proving a statement holds for every natural number by proving a base case and a step that carries truth from n to n+1.
Divisibility, prime numbers, and the Euclidean algorithm for computing the greatest common divisor without factoring.
Arithmetic that wraps around after reaching a modulus — the mathematics behind clocks, hashing, and cryptography.
A variant of induction where the inductive step gets to assume the statement holds for every smaller case, not just the one immediately before it.
Defining an object in terms of smaller instances of itself, and proving properties about it by induction on that same structure — the same idea behind recursion in code.
Proving "if P then Q" directly by assuming P and deriving Q, or equivalently by proving the contrapositive "if not Q then not P".
Assuming a statement is false and deriving an absurdity, which forces the original statement to be true.
Part of the Computer Science curriculum.
What separates a convincing argument from a rigorous mathematical proof, and why computer science leans on proof the same way it leans on code.
Formalizing true/false statements with logical connectives (¬, ∧, ∨, →, ↔) and the truth tables that pin down exactly what each one means.
Two formulas that always agree in truth value, and the identities (De Morgan's laws among them) that let you rewrite one into the other.
Statements that depend on a variable (predicates), and the universal (∀) and existential (∃) quantifiers that turn them into full propositions.
Sets, subsets, and the operations — union, intersection, difference, complement — that combine them.
The power set (the set of all subsets) and the Cartesian product (the set of ordered pairs) — the two constructions that make relations and functions possible.
A relation as a subset of a Cartesian product, and the properties — reflexive, symmetric, transitive — that classify how its elements relate to one another.
Vertices and edges, directed and undirected graphs, and the two standard ways — adjacency matrix, adjacency list — to represent one in a program.
A graph that can be drawn on a plane with no edges crossing, and Euler's formula relating its vertices, edges, and faces.
A connected graph with no cycles — the structure behind hierarchies, and the properties (n vertices, n-1 edges) that make a tree a tree.
A function as a special kind of relation, and the three properties — injective, surjective, bijective — that describe how its inputs map to its outputs.
Counting the number of ways to arrange (permutations) or choose (combinations) elements from a set, with or without order mattering.
Counting the size of a union of overlapping sets by adding and subtracting the sizes of their intersections.
If more items are placed into containers than there are containers, some container must hold more than one — a simple idea with surprisingly powerful consequences.
A relation that is reflexive, antisymmetric, and transitive — capturing "comes before" relationships that don't have to compare every pair of elements.
A relation that is reflexive, symmetric, and transitive splits its set into disjoint equivalence classes — one idea with two equivalent descriptions.
Visualizing set operations with Venn diagrams, and proving set identities like De Morgan's laws for sets rigorously rather than just from the picture.
The precise rule for negating a quantified statement — ∀ becomes ∃ (and vice versa) as the negation moves inward — and why getting this wrong is one of the most common proof-writing mistakes.
Every non-empty set of non-negative integers has a least element — the quiet assumption underneath induction and many number-theoretic proofs.
Proving a statement holds for every natural number by proving a base case and a step that carries truth from n to n+1.
Divisibility, prime numbers, and the Euclidean algorithm for computing the greatest common divisor without factoring.
Arithmetic that wraps around after reaching a modulus — the mathematics behind clocks, hashing, and cryptography.
A variant of induction where the inductive step gets to assume the statement holds for every smaller case, not just the one immediately before it.
Defining an object in terms of smaller instances of itself, and proving properties about it by induction on that same structure — the same idea behind recursion in code.
Proving "if P then Q" directly by assuming P and deriving Q, or equivalently by proving the contrapositive "if not Q then not P".
Assuming a statement is false and deriving an absurdity, which forces the original statement to be true.