This book offers a 'hands-on' approach to teaching Discrete Mathematics. Using software that is freely available on Mac, PC & Unix platforms, the functional language Haskell allows students to experiment with mathematical notations & concepts -- a practical approach that provides students with instant feedback & allows lecturers to monitor progress easily. This 2nd edition contains additional material on the applications of formal methods to practical programming problems. There are more examples of induction proofs on small programs, & a new chapter showing how a mathematical approach can be used to motivate AVL trees, a complex data structure. Designed for 1st & 2nd year undergraduates, the book is also well suited for self-study. No prior knowledge of functional programming is required. Complete with an instructor's guide, via the web, this book is intended as the primary teaching text for Discrete Mathematics courses, but will also provide useful reading for Conversion Masters & Formal Methods courses.