This course introduces the use of formal mathematical notation and reasoning in the software development process. These methods have applications in requirements specification, design and verification. Course topics include automata theory, finite state automata, pushdown automata, regular expressions, normal forms, predicates, types of formal models, and the strengths and limitations of formal methods.