“…Some well-known approaches to constructing correct programs are: -specify a problem by means of pre-and post-conditions, and then calculate a program from the specification, or provide an implementation and prove that the implementation satisfies the specification [Hoare, 1969, Dijkstra, 1975, -refine a specification by means of refinement rules until an executable program is obtained [Back, 1987, Morgan, 1990, -specify a problem by means of a simple but possibly very inefficient program, and transform it to an efficient program using semantics-preserving transformation rules [Bird, 1987, Meertens, 1986]. …”