The art of computer programming, volume 1 (3rd ed.): fundamental algorithms
The art of computer programming, volume 1 (3rd ed.): fundamental algorithms
A Transformation System for Developing Recursive Programs
Journal of the ACM (JACM)
A fast algorithm for copying list structures
Communications of the ACM
A bounded storage algorithm for copying cyclic structures
Communications of the ACM
Copying cyclic list structures in linear time using bounded workspace
Communications of the ACM
An efficient machine-independent procedure for garbage collection in various list structures
Communications of the ACM
Correctness-preserving program transformations
POPL '75 Proceedings of the 2nd ACM SIGACT-SIGPLAN symposium on Principles of programming languages
On Backtracking and Greatest Fixpoints
Proceedings of the Fourth Colloquium on Automata, Languages and Programming
Abstractions, instantiations, and proofs of marking algorithms
Proceedings of the 1977 symposium on Artificial intelligence and programming languages
Control structure abstractions of the backtracking programming technique
ICSE '76 Proceedings of the 2nd international conference on Software engineering
Program abstraction and instantiation
ACM Transactions on Programming Languages and Systems (TOPLAS)
A bibliography on garbage collection and related topics
ACM SIGPLAN Notices
Garbage Collection of Linked Data Structures
ACM Computing Surveys (CSUR)
A System for Assisting Program Transformation
ACM Transactions on Programming Languages and Systems (TOPLAS)
Combining Algebraic and Algorithmic Reasoning: An Approach to the Schorr-Waite Algorithm
ACM Transactions on Programming Languages and Systems (TOPLAS)
Derivation of efficient DAG marking algorithms
POPL '83 Proceedings of the 10th ACM SIGACT-SIGPLAN symposium on Principles of programming languages
On correct program development
ICSE '79 Proceedings of the 4th international conference on Software engineering
Hi-index | 0.00 |
How can one organize the understanding of complex algorithms? People have been thinking about this issue at least since Euclid first tried to explain his innovative greatest common divisor algorithm to his colleagues, but for current research into verifying state-of-the-art programs, some precise answers to the question are needed. Over the past decade the various verification methods which have been introduced (inductive assertions, structural induction, least-fixedpoint semantics, etc.) have established many basic principles of program verification (which we define as: establishing that a program text satisfies a given pair of input-output specifications). However, it is no coincidence that most published examples of the application of these methods have dealt with "toy programs" of carefully considered simplicity.Experience indicates that these "first generation" principles, with which one can easily verify a three-line greatest common divisor algorithm, do not directly enable one to verify a 10,000 line operating system (or even a 50 line list-processing algorithm) in complete detail. To verify complex programs, additional techniques of organization, analysis and manipulation are required. (That a similar situation exists in the writing of large, correct programs has long been recognized -- structured programming being one solution.)This paper examines the usefulness of correctness-preserving program transformations (see [6]) in structuring fairly complex correctness proofs. Using our approach one starts with a simple, high-level (or "abstract") algorithm which can be easily verified, then successively refines it by implementing the abstractions of the initial algorithm to obtain various final, detailed algorithms. In Section 2 we introduce the technique by deriving the Deutsch-Schorr-Waite list-marking algorithm [14]. Our main example is the more complex problem of verifying bounded-workspace list-copying algorithms: Section 3 defines the issues, Section 4 presents the key intermediate algorithm in detail and Section 5 considers three of the most complex (published) implementations of list-copying, one of which is discussed in detail. In Section 6 we make some general remarks on program verification and the relevance of our results to the (larger) field of program correctness; Section 7 mentions some related work.