The Idea of Program Refinement Programs are complex. They are typically
so complex, that they go beyond the full comprehension even of the
programmer or team who designed them, with all the consequences this
has. How can we cope with such complexity in a satisfactory way? An
approach, advocated for a long time, is to separate a concise
specification of a program - the "what" - from a possibly involved
implementation - the "how". Once a specification is obtained from the
set of requirements on the program, there can still be a large gap to an
efficient implementation. The development from specification to
implementation can then proceed by a succession oflayers, such that each
layer is a refinement of the previous one. Design decisions can be
introduced in refinement steps one at a time. By this, the refinement
steps can be kept small and manageable. Still, the set of all
requirements can be far too large to be taken completely into account in
the initial specification. Even if they could, they might obscure issues
more than clarify them. For example: - An information system for stored
goods needs to produce an error message on il- legal input. Yet, the
exact wording - and even the language - of those messages is irrelevant
for an understanding of the essence of the system. - A banking
application interacts with customers with a graphical interface. Yet the
specification of the graphical layout is secondary compared to the
specification of the possible transactions.