Program analysis are static (compile-time) techniques for computing approximate and yet reliable information about the dynamic behaviour of programs. This module lays the foundation for study of program analysis. It covers the essential mathematics upon which program analyses are built, and provides an overview of different approaches to program analysis. Topics include: Partially ordered sets, induction and co-induction, data flow analysis, constraint based analysis, abstract interpretation, and type and effect systems. Students with interest in programming-language design and compiler design will find this module beneficial.