All science requires mathematics. Formal methods used in developing computer systems are mathematically based techniques for describing system properties. These formal methods then can provide frameworks within which developers can specify, develop, verify, and prove systems in a systematic, rather than ad hoc manner. According to some researchers, the application of formal specification and verification methods could avoid disasters such as Heartbleed bug, Ariane 5 rocket explosion, and Therac-25 radiation therapy machine harms. This course is an introduction to the vast world of formal methods. The course starts with review of propositional logic, predicate logic, and covers set theoretic specification methods via Z, temporal specification via PTL, grammars, and logic based methods via Caml and Coq proof assistant. Each student will carry out an investigation of an existing formal verification system, applying it to a suitable problem of the student’s choice. Among possible projects will be the formal verification of problem solutions such as designing a semaphore, designing a machine learning algorithm, a web interface, a test suite, a sophisticated data structure, or a theorem.