The aim is to show how procedural programs can be developed rigorously
from their mathematical specifications. In the first part, the emphasis
is primarily on how to derive loops from invariants; this activity is
called algorithm refinement.
The second part of the course deals with specification and data refinement. It shows how
modules and systems can be specified abstractly, how algorithms can
be developed using abstract datatypes, and how such abstract datatypes
can be implemented using concrete datatypes, and that implementation
formally justified.
Students may not take this course if they have previously taken either Formal Program Design I and Formal Program Design II.
At the end of the course students are expected to:
- Be able to specify modules, and in particular programs, abstractly
- Understand the criteria for algorithm refinement
- Be able to specify modules and systems, abstractly
- Perform rigorous and formal derivations of efficient programs from their abstract specifications
- Understand the criteria for algorithm refinement and data refinement