Algebraic methods for specification and formal development of programs

and development including applications to the formal development of reliable complex software systems. We regard this area of research as straddling the borderline between theory and practice. It has connections with work on the design and semantics of software systems and programming languages, on formal methods for system verication (various program logics in particular), and relies heavily on some basic concepts of mathematical logic, universal algebra and category theory, while being directly inspired by and potentially applicable in practice. In this note we sum up our experiences so far, hint at the need for further work in certain areas, and speculate a bit about the directions in which we expect to go in the future. The roots of our work in this area are in the theory of algebraic specication. The most fundamental assumption underlying this theory is that programs are modelled as many-sorted algebras consisting of a collection of sets of data values together with functions over those sets. This level of abstraction is commensurate with the view that the correctness of the input/output behaviour of a program takes precedence over all its other properties. Another common element is that