Of the Stanford Computer Forum

Total Page:16

File Type:pdf, Size:1020Kb

Of the Stanford Computer Forum ✓ <kV &** THE STANFORD PASCAL VERIFIER DAVID C. LUCKHAM PREPARED FOR THE ELEVENTH ANNUAL MEETING OF THE STANFORD COMPUTER FORUM FEBRUARY 1979 *,' FOREWORD The Stanford Pascal verifier is an interactive program verification system. It automates much of the work necessary to analyze a program for consistency with its documentation, and to give a rigorous mathematical proof of such consistency or to pin-point areas of inconsistency. It has been shown to have applications as an aid to programming, and to have potential for development as a new and useful tool in the production of reliable software. This verifier is a prototype system. It has inadequacies and shortcomings. It is undergoing continuous improvement, and is expected to be used eventually in conjunction with other kinds of program analyzers. The purpose of this manual is to introduce the verifier to a wider group of users for experimentation. We hope to encourage both feedback, to help improve this system, and the development of other program analyzers. The verifier is coded in Maclisp, a version of Lisp developed at M.I.T. for PDP-10 computers. A compiled version of the verifier including the Maclisp environment requires 100k words of core. The present version can be expanded to a maximum of 175k words. How to read this manual The manual is divided into two parts. Part I is an introduction to the verifier. It contains a short survey of its features and components, and examples of its use. The reader who has completed Part I should be able to construct simple examples and run them. He should also have gained some idea of what the verifier can do and what inadequacies to expect. Part II is a manual for those users who embark upon serious experiments with the verifier. Chapter 1 lists the differences between standard Pascal and the documented Pascal that the verifier requires as input. The major differences are the required documentation. There are also some minor differences in code. This is because it is planned that the verifier will accept a more general programming language than Pascal including Modules and constructs for concurrent processing. There is no discussion of the extended language in this manual. Chapter 2 describes the toplevel user commands. Chapter 3 is a short description of the special purpose theorem provers. This tells the user what kinds of knowledge are "built in" and what he must describe to the verifier by means of axioms. Chapter 4 is about the Rule Language. This chapter is in two sections. The first describes the rule language and how to express logical axioms as rules; the second section gets into the intricacies of writing rules and why rules written one way may lead the verifier into much more 1 efficient proof searches than if they are written another way. Section I should be enough for many simple examples. Appendix A contains syntax charts similar to the charts given in the Pascal User Manual. Here one will find the syntax of user commands for running the verifier and the syntax of input to the verifier, i.e., programs, assertions, and rules. Appendix B is a list of parser error messages with a more detailed description of their meaning than is provided by the comments from the system. Appendix C presents the axiomatic semantics used by the verification condition generator. Acknowledgements We would like to acknowledge the contributions made to the development of the verifier by our colleagues Shigeru Igrashi, Ralph London, Nori Suzuki, and Scot Drysdale. 2 PARTI INTRODUCTION TO THE STANFORD PASCAL VERIFIER 1. Overview Section 2 gives a toplevel overview of the verifier and how it is used. Section 3 describes the assertion language, the language in which the specifications of a program and the accompanying internal inductive assertions must be written. There are some brief remarks about what kinds of internal inductive assertions are required. A full description of compulsory assertions is given in Part 11, Chapter 1, and this information is also contained in the syntax charts. Section 4 outlines some of the basic constructs of the rule language. Rules defining concepts used in assertions must be written in the rule language. Part 11, Chapter 4 gives more details about rules and how the theorem prover uses them. Section 5 gives a number of examples illustrating the use of the verifier. The first few are quite simple and should be sufficient to enable the reader to run some simple examples of his own. The final example, on verifying a parser, illustrates formulation of rules from mathematical theories and the use of the verifier in debugging and improving specifications. At this point the reader is in a position to begin finding his own ways of making the verifier useful to himself. The methodology of using such systems is by no means fully explored. Further examples of verification experiments are given in the references at the end of Part 11. 2. The Verifier The verifier employs the inductive assertion method due to Floyd [7] for reasoning about programs. Floyd's method was developed into a logic of programs by Hoare [11] and others [3, 14]. The verifier constructs its proofs within this logic of programs. It requires as input a Pascal program together with documentation in the form of ENTRY and EXIT assertions and inductive assertions at crucial points in the program. Fig. 1 shows what happens when the programmer gives this input to the verifier. The input goes first to a verification condition generator which gives as output a set of purely logical conditions called Verification Conditions (VCs). There is a VC for each path in the program. If all of the VCs can be proved, the program satisfies its specification. The next step is to try to prove the VCs using various algebraic simplification and proof methods. Those VCs that are not proved are displayed for analysis by the programmer. If a VC is incorrect, this may reveal a bug in the program or insufficient documentation at some point. A modification is made to the input and the problem is rerun. If the unproven VCs are all correct this merely indicates that the proof procedures need more mathematical axioms. The programmer can state these in the rule language and input them. Ideally, the time for a complete cycle (Fig. 1) in a modern interactive computing environment should be of the order of a minute for a one page program. 3 Part I: Introduction to the Stanford Pascal Verifier Input 1 Verification i Program ► VCG » PROVER and 1 Condit i ons > Documentationon I S i mp lift ed VCs I Modified ANALYSIS OF « OUTPUT Problem I This contains a parser and a Verification Condition Generator (VCGEN). VCGEN uses axiomatic semantics of the programming language to generate VCs. We chose Pascal because at that time it was the only language for which such an axiomatic semantics within Hoare's logic of programs had been given [13]. VCGEN simply takes the place of the code generator in a compiler. The program together with inductive assertions is parsed for syntax and type compatibility (see Chapter 1 for details). The result is an internal tree representation from which the VCs are constructed by transforming the inductive assertions as a function of the code. The transformations correspond to axiomatic proof rules defining the meaning of the programming language constructs. The theory of VCGEN is presented in [14]. The important point is that if all of the VCs can be proved then there is a proof within the logic of programs that the given program satisfies its ENTRY/EXIT assertions and also that each subsection of the program satisfies its surrounding inductive assertions. Such a proof can be constructed by reversing the transformations that were applied by VCGEN. So, the VCs are sufficient conditions for correctness, but not always necessary ones. The truth of the VCs often depends on how completely the inductive assertions describe sections of the code. As a matter of practical convenience, the programmer should not be forced to supply documentation beyond what is necessary to understand the program. The transformations currently used by VCG are combinations of the axiomatic semantic rules of Pascal. The objective of such combinations is to reduce the number of situations in which the user has to repeat his assertions in trivial and tedious ways (this was a problem with earlier verifiers). The basic 4 V Part I: Introduction to the Stanford Pascal Verifier assertion requirements are that procedure and function declarations must have ENTRY/EXIT specifications, and loops within the body of the program must have invariant assertions. It is not necessary to place assertions at all GOTO labels. There are other required assertions (e.g., for global variables) and the details of these are in Chapter 1. It is easy to modify VCG for other languages that have axiomatic semantics formalizable within the logic of programs. No other component of the verifier depends on the input programming language. 2.2 The theorem prover This is the most complex component of the verifier. The major issue in its design is the trade-off between generality (i.e., logical completeness) of the prover and its average response time to given problems. If the theorem prover is very general, it takes too long to prove VCs and the user gives up waiting. If it is too restricted in its logical power and requires to be told too many trivial facts (e.g., x + I < y -* x <y) the user will give up trying to discover everything he must tell it. We have tried to solve this response time problem by using special purpose provers and by using algebraic simplification.
Recommended publications
  • Introduction to Programming in Lisp
    Introduction to Programming in Lisp Supplementary handout for 4th Year AI lectures · D W Murray · Hilary 1991 1 Background There are two widely used languages for AI, viz. Lisp and Prolog. The latter is the language for Logic Programming, but much of the remainder of the work is programmed in Lisp. Lisp is the general language for AI because it allows us to manipulate symbols and ideas in a commonsense manner. Lisp is an acronym for List Processing, a reference to the basic syntax of the language and aim of the language. The earliest list processing language was in fact IPL developed in the mid 1950’s by Simon, Newell and Shaw. Lisp itself was conceived by John McCarthy and students in the late 1950’s for use in the newly-named field of artificial intelligence. It caught on quickly in MIT’s AI Project, was implemented on the IBM 704 and by 1962 to spread through other AI groups. AI is still the largest application area for the language, but the removal of many of the flaws of early versions of the language have resulted in its gaining somewhat wider acceptance. One snag with Lisp is that although it started out as a very pure language based on mathematic logic, practical pressures mean that it has grown. There were many dialects which threaten the unity of the language, but recently there was a concerted effort to develop a more standard Lisp, viz. Common Lisp. Other Lisps you may hear of are FranzLisp, MacLisp, InterLisp, Cambridge Lisp, Le Lisp, ... Some good things about Lisp are: • Lisp is an early example of an interpreted language (though it can be compiled).
    [Show full text]
  • High-Level Language Features Not Found in Ordinary LISP. the GLISP
    DOCUMENT RESUME ED 232 860 SE 042 634 AUTHOR Novak, Gordon S., Jr. TITLE GLISP User's Manual. Revised. INSTITUTION Stanford Univ., Calif. Dept. of Computer Science. SPONS AGENCY Advanced Research Projects Agency (DOD), Washington, D.C.; National Science Foundation, Washington, D.C. PUB DATE 23 Nov 82 CONTRACT MDA-903-80-c-007 GRANT SED-7912803 NOTE 43p.; For related documents, see SE 042 630-635. PUB TYPE Guides General (050) Reference Materials General (130) EDRS PRICE MF01/PCO2 Plus Postage. DESCRIPTORS *Computer Programs; *Computer Science; Guides; *Programing; *Programing Languages; *Resource Materials IDENTIFIERS *GLISP Programing Language; National Science Foundation ABSTRACT GLISP is a LISP-based language which provides high-level language features not found in ordinary LISP. The GLISP language is implemented by means of a compiler which accepts GLISP as input and produces ordinary LISP as output. This output can be further compiled to machine code by the LISP compiler. GLISP is available for several ISP dialects, including Interlisp, Maclisp, UCI Lisp, ELISP, Franz Lisp, and Portable Standard Lisp. The goal of GLISP is to allow structured objects to be referenced in a convenient, succinct language and to allow the structures of objects to be changed without changing the code which references the objects. GLISP provides both PASCAL-like and English-like syntaxes; much of the power and brevity of GLISP derive from the compiler features necessary to support the relatively informal, English-like language constructs. Provided in this manual is the documentation necessary for using GLISP. The documentation is presented in the following sections: introduction; object descriptions; reference to objects; GLISP program syntax; messages; context rules and reference; GLISP and knowledge representation languages; obtaining and using GLISP; GLISP hacks (some ways of doing things in GLISP which might not be entirely obvious at first glance); and examples of GLISP object declarations and programs.
    [Show full text]
  • The Evolution of Lisp
    1 The Evolution of Lisp Guy L. Steele Jr. Richard P. Gabriel Thinking Machines Corporation Lucid, Inc. 245 First Street 707 Laurel Street Cambridge, Massachusetts 02142 Menlo Park, California 94025 Phone: (617) 234-2860 Phone: (415) 329-8400 FAX: (617) 243-4444 FAX: (415) 329-8480 E-mail: [email protected] E-mail: [email protected] Abstract Lisp is the world’s greatest programming language—or so its proponents think. The structure of Lisp makes it easy to extend the language or even to implement entirely new dialects without starting from scratch. Overall, the evolution of Lisp has been guided more by institutional rivalry, one-upsmanship, and the glee born of technical cleverness that is characteristic of the “hacker culture” than by sober assessments of technical requirements. Nevertheless this process has eventually produced both an industrial- strength programming language, messy but powerful, and a technically pure dialect, small but powerful, that is suitable for use by programming-language theoreticians. We pick up where McCarthy’s paper in the first HOPL conference left off. We trace the development chronologically from the era of the PDP-6, through the heyday of Interlisp and MacLisp, past the ascension and decline of special purpose Lisp machines, to the present era of standardization activities. We then examine the technical evolution of a few representative language features, including both some notable successes and some notable failures, that illuminate design issues that distinguish Lisp from other programming languages. We also discuss the use of Lisp as a laboratory for designing other programming languages. We conclude with some reflections on the forces that have driven the evolution of Lisp.
    [Show full text]
  • Allegro CL User Guide
    Allegro CL User Guide Volume 1 (of 2) version 4.3 March, 1996 Copyright and other notices: This is revision 6 of this manual. This manual has Franz Inc. document number D-U-00-000-01-60320-1-6. Copyright 1985-1996 by Franz Inc. All rights reserved. No part of this pub- lication may be reproduced, stored in a retrieval system, or transmitted, in any form or by any means electronic, mechanical, by photocopying or recording, or otherwise, without the prior and explicit written permission of Franz incorpo- rated. Restricted rights legend: Use, duplication, and disclosure by the United States Government are subject to Restricted Rights for Commercial Software devel- oped at private expense as specified in DOD FAR 52.227-7013 (c) (1) (ii). Allegro CL and Allegro Composer are registered trademarks of Franz Inc. Allegro Common Windows, Allegro Presto, Allegro Runtime, and Allegro Matrix are trademarks of Franz inc. Unix is a trademark of AT&T. The Allegro CL software as provided may contain material copyright Xerox Corp. and the Open Systems Foundation. All such material is used and distrib- uted with permission. Other, uncopyrighted material originally developed at MIT and at CMU is also included. Appendix B is a reproduction of chapters 5 and 6 of The Art of the Metaobject Protocol by G. Kiczales, J. des Rivieres, and D. Bobrow. All this material is used with permission and we thank the authors and their publishers for letting us reproduce their material. Contents Volume 1 Preface 1 Introduction 1.1 The language 1-1 1.2 History 1-1 1.3 Format
    [Show full text]
  • A Note on the Optimal Allocation of Spaces in MACLISP by Henry C
    MASSACHUSETTS INSTITUTE OF TECHNOLOGY ARTIFICIAL INTELLIGENCE LABORATORY Al Working Paper 142 March 16, 1977 A Note on the Optimal Allocation of Spaces in MACLISP by Henry C. Baker, Jr. This note describes a method for allocating storage among the various spaces in the MACLISP Implementation of LISP. The optimal strategy which minimizes garbage collector effort allocates free storage among the various spaces in snch a way that they all run out at the same time. In an equilibrium situation, this corresponds to allocating free storage to the spaces in proportion to their usage. Methods are investigated by which the rates of usage can be inferred, and a ge-daemon interrupt handler is developed which implements an approximately optimal strategy in MACLISP. Finally, the sensitivity of this method to rapidly varying differential rates of cell usage is discussed. Key Words and Phrases: garbage collection, list processing, virtual memory, storage management, storage allocation, LISP. CR Categories: 3.50, 3.60, 3.73, 3.80, 4.13, 422, 4.32, 4.33, 4.35, 4.49 This report describes research done at the Artificial Intelligence Laboratory of the Massachusetts Institute of Technology. Support for the laboratory's artificial intelligence research is provided in part by the Advanced Research Projects Agency of the Department of Defense under Office of Naval Research contract N00014-75-C-0522. Working Papers are informal papers intended for internal use. March 16, 1977 A Note on the Optimal Allocation of Spaces in MACLISP Henry C. Baker, Jr. MACLISP [11 unlike some other implementations of. LISP, allocates storage for different types of objects in non-contiguous areas called spaces.
    [Show full text]
  • Special Topics: Programming Languages
    Lecture #11 • 0 V22.0490.001 Special Topics: Programming Languages B. Mishra New York University. Lecture # 11 Programming Languages • MISHRA 2008 Lecture #11 • 1 —Slide 1— Common Lisp Language Survey 4 Functional Programming • Pure Functional Programming: Implicit Principle ◦ The value of an expression depends only on the values of its subexpressions, if any. – No side-effect. (No State—No assignment) – An expression has the same value, every time. – Implicit Storage Management: Allocation on Demand + Garbage Collection. – Functions are First Class Objects: 1) As value of an expression 2) As parameters 3) As data Objects. Programming Languages • MISHRA 2008 Lecture #11 • 2 —Slide 2— Common Lisp • LISP: LIst Processing Language Not— Lots of Insidious Sill Parentheses • Second oldest Programming Language (Af- ter Fortran) • Application Areas: 1. Theorem Proving 2. Symbolic Algebra 3. AI (Artificial Intelligence) (Natural Language Processing, Com- puter Vision, Robot Control Systems, Ex- pert Systems, Neural Networks, Automatic Programming) Programming Languages • MISHRA 2008 Lecture #11 • 3 —Slide 3— HISTORY • Developed at MIT AI Lab—1959. LISP 1.5 running on an IBM machine. • BBN LISP (PDP 1/SDS 940) became → INTERLISP (PDP 10) • MACLISP (MIT Project MAC) • LISP 1.6—A version of MACLISP ◦ UCI-LISP (Univ. of Cal. at Irvine) ◦ Standard Lisp (Univ. of Utah) • Lisp Machine Lisp Large Personal Lisp Machine built at MIT • FranzLISP for Vax/UNIX (UC Berkeley) • NIL for Vax/VMS (MIT) • Scheme at MIT • T Lisp at Yale Programming Languages • MISHRA 2008 Lecture #11 • 4 —Slide 4— Common Lisp • 1981/Carnegie-Mellon/Guy L. Steele • Clean Lisp Inconsistencies and illogical conventions were resolved • Transportable Programs written in Common Lisp and debugged in one implementation should run on another ma- chine/implementation without change.
    [Show full text]
  • History of the Lisp Language
    History of the Lisp Language History of the Lisp Language The following information is derived from the history section of dpANS Common Lisp. Lisp is a family of languages with a long history. Early key ideas in Lisp were developed by John McCarthy during the 1956 Dartmouth Summer Research Project on Artificial Intelligence. McCarthy’s motivation was to develop an algebraic list processing language for artificial intelligence work. Implementation efforts for early dialects of Lisp were undertaken on the IBM 704, the IBM 7090, the Digital Equipment Corporation (DEC) PDP−1, the DEC PDP−6, and the PDP−10. The primary dialect of Lisp between 1960 and 1965 was Lisp 1.5. By the early 1970’s there were two predominant dialects of Lisp, both arising from these early efforts: MacLisp and Interlisp. For further information about very early Lisp dialects, see The Anatomy of Lisp or Lisp 1.5 Programmer’s Manual. MacLisp improved on the Lisp 1.5 notion of special variables and error handling. MacLisp also introduced the concept of functions that could take a variable number of arguments, macros, arrays, non−local dynamic exits, fast arithmetic, the first good Lisp compiler, and an emphasis on execution speed. For further information about Maclisp, see Maclisp Reference Manual, Revision 0 or The Revised Maclisp Manual. Interlisp introduced many ideas into Lisp programming environments and methodology. One of the Interlisp ideas that influenced Common Lisp was an iteration construct implemented by Warren Teitelman that inspired the loop macro used both on the Lisp Machines and in MacLisp, and now in Common Lisp.
    [Show full text]
  • Report on Common Lisp to the Interlisp Community
    Masinter & vanMelle on CommonLisp, circa Dec 1981. Subject: Report on Common Lisp to the Interlisp Community Introduction What is Common Lisp? Common Lisp is a proposal for a new dialect of Lisp, intended be implemented on a broad class of machines. Common Lisp is an attempt to bring together the various implementors of the descendents of the MacLisp dialect of Lisp. The Common Lisp effort is apparently an outgrowth of the concern that there was a lack of coordination and concerted effort among the implementors of the descendents of MacLisp. Common Lisp's principal designers come from the implementors of Lisp Machine Lisp (at MIT and Syrnbolics), Spice Lisp (at CMU), NIL (both a VAX implementation at MIT and the S-1 implementation at Lawrence Livermore), and MacLisp (at MIT, of course.) Also contributing, but not strongly represented, are Standard Lisp (at Utah) and Interlisp (at PARC, BBN and ISI.) Programs written entirely in Common Lisp are supposed to be readily run on any machine supporting Common Lisp. The language is being designed with the intent first of creating a good language, and only secondarily to be as compatible as practical with existing dialects (principally Lisp Machine Lisp.) Common Lisp attempts to draw on the many years of experience with existing Lisp dialects; it tries to avoid constructs that are obviously machine-dependent, yet include constructs that have the possibility of efficient implementation on specific machines. Thus, there are several different goals of Common Lisp: (1)to profit from previous experience in Lisp systems, (2) to make efficient use of new and existing hardware, and (3) to be compatible with existing dialects.
    [Show full text]
  • Large-Scale System Development in Several Lisp Environments!
    LARGE-SCALE SYSTEM DEVELOPMENT IN SEVERAL LISP ENVIRONMENTS! Sanjal Naraln, David McArthur and Philip Klahr The Rand Corporation 1700 Main Street Santa Monica, California 90406 USA ABSTRACT The other main problem with the Maclisp implementation was that it resided on a DEC-20. This machine is proving increasingly ROSS |7] is an object-oriented language developed for building inadequate for large AI programs, because of its small 18-bit address knowledge-based simulations [4l. SWIRL |5, 6] is a program written space. in ROSS that embeds knowledge about defensive and offensive air battle strategies. Given an initial configuration of military forces, 2.2. Franrllsp on a VAX-11/780 [2] SWIRL simulates the resulting air battle. We have implemented ROSS and SWIRL in several different Lisp environments. We Because of Franzlisp's advertised compatibility with Maclisp, we report upon this experience by comparing the various environments thought it would be straightforward to convert our Maclisp versions in terms of cpu usage, real-time usage, and various user aids. of ROSS and SWIRL to work within the Franzlisp environment. This was almost the case. About two man-weeks of effort over a 1. INTRODUCTION one month period was required for the conversion process. We did notice certain inconsistencies between Franzlisp and Maclisp but Over the past six months we have been engaged in implementing they were fairly easy to fix. Although ROSS and SWIRL are large ROSS (an object-oriented, know ledge-based simulation language [7jj systems even when compiled (see Table 1), they ran acceptably fast and SWIRL (an air battle simulation [5, 6]) in five different Lisp within Franzlisp, even when running large simulations.
    [Show full text]
  • Evolution of Emacs Lisp
    Evolution of Emacs Lisp STEFAN MONNIER, Universit´ede Montr´eal,Canada MICHAEL SPERBER, Active Group GmbH, Germany While Emacs proponents largely agree that it is the world's greatest text editor, it is almost as much a Lisp machine disguised as an editor. Indeed, one of its chief appeals is that it is programmable via its own programming language, Elisp (or Emacs Lisp), a Lisp in the classic tradition. In this article, we present the history of this language over its more than 30 years of evolution. Its core has remained remarkably stable since its inception in 1985, in large part to preserve compatibility with the many third-party packages providing a multitude of extensions. Still, Elisp has evolved and continues to do so. Despite the fact that it is closely tied to a concrete editor, Elisp has spawned multiple implementations| in Emacs itself but also in variants of Emacs, such as XEmacs, Edwin, and even the window manager Sawfish. Through competing implementations as well as changes in maintainership, it has pickedup outside influences over the years, most notably from Common Lisp. Important aspects of Elisp have been shaped by concrete requirements of the editor it supports, such as the buffer-local variables that tie bindings to editing contexts, as well as implementation constraints. These requirements led to the choice of a Lisp dialect as Emacs's language in the first place, specifically its simplicity and dynamic nature: Loading additional Emacs packages or changing the ones in place occurs frequently, and having to restart the editor in order to re-compile or re-link the code would be unacceptable.
    [Show full text]
  • Common Lisp Objects for Xemacs Didier Verna
    CLOX: Common Lisp Objects for XEmacs Didier Verna To cite this version: Didier Verna. CLOX: Common Lisp Objects for XEmacs. ELS 2010 European Lisp Symposium 2010, May 2010, Lisbon, Portugal. hal-01543381 HAL Id: hal-01543381 https://hal.archives-ouvertes.fr/hal-01543381 Submitted on 26 Jun 2017 HAL is a multi-disciplinary open access L’archive ouverte pluridisciplinaire HAL, est archive for the deposit and dissemination of sci- destinée au dépôt et à la diffusion de documents entific research documents, whether they are pub- scientifiques de niveau recherche, publiés ou non, lished or not. The documents may come from émanant des établissements d’enseignement et de teaching and research institutions in France or recherche français ou étrangers, des laboratoires abroad, or from public or private research centers. publics ou privés. CLOX: Common Lisp Objects for XEmacs Didier Verna (Epita Research and Development Laboratory, Paris, France [email protected]) Abstract CLOX is an ongoing attempt to provide a full Emacs Lisp implementation of the Common Lisp Object System, including its underlying meta-object protocol, for XEmacs. This paper describes the early development stages of this project. CLOX currently consists in a port of Closette to Emacs Lisp, with some additional features, most notably, a deeper integration between types and classes and a comprehensive test suite. All these aspects are described in the paper, and we also provide a feature comparison with an alternative project called Eieio. Key Words: Lisp, Object Orientation, Meta-Object Protocol Category: D.1.5, D.3.3 1 Introduction Note: the author is one of the core maintainers of XEmacs.
    [Show full text]
  • COMMON LISP: a Gentle Introduction to Symbolic Computation COMMON LISP: a Gentle Introduction to Symbolic Computation
    COMMON LISP: A Gentle Introduction to Symbolic Computation COMMON LISP: A Gentle Introduction to Symbolic Computation David S. Touretzky Carnegie Mellon University The Benjamin/Cummings Publishing Company,Inc. Redwood City, California • Fort Collins, Colorado • Menlo Park, California Reading, Massachusetts• New York • Don Mill, Ontario • Workingham, U.K. Amsterdam • Bonn • Sydney • Singapore • Tokyo • Madrid • San Juan Sponsoring Editor: Alan Apt Developmental Editor: Mark McCormick Production Coordinator: John Walker Copy Editor: Steven Sorenson Text and Cover Designer: Michael Rogondino Cover image selected by David S. Touretzky Cover: La Grande Vitesse, sculpture by Alexander Calder Copyright (c) 1990 by Symbolic Technology, Ltd. Published by The Benjamin/Cummings Publishing Company, Inc. This document may be redistributed in hardcopy form only, and only for educational purposes at no charge to the recipient. Redistribution in electronic form, such as on a web page or CD-ROM disk, is prohibited. All other rights are reserved. Any other use of this material is prohibited without the written permission of the copyright holder. The programs presented in this book have been included for their instructional value. They have been tested with care but are not guaranteed for any particular purpose. The publisher does not offer any warranties or representations, nor does it accept any liabilities with respect to the programs. Library of Congress Cataloging-in-Publication Data Touretzky, David S. Common LISP : a gentle introduction to symbolic computation / David S. Touretzky p. cm. Includes index. ISBN 0-8053-0492-4 1. COMMON LISP (Computer program language) I. Title. QA76.73.C28T68 1989 005.13'3±dc20 89-15180 CIP ISBN 0-8053-0492-4 ABCDEFGHIJK - DO - 8932109 The Benjamin/Cummings Publishing Company, Inc.
    [Show full text]