This is the 100th. book in the Prentice Hall International Series in Computer Science. It's main purpose is to show how to calculate programs. Describing an algebraic approach to programming based on a categorical calculus of relations, Algebra of Programming is suitable for the derivation of individual programs, and for the study of programming principles in general. The programming principles discussed are those paradigms and strategies of program construction that form the core of Algorithm Design. Examples of such principles include: dynamic programming, greedy algorithms, exhaustive search, and divide-and-conquer.The fundamentsl ideas of the algebraic approach are illustrated by an extensive study of optimisation problems.