We use cookies to distinguish you from other users and to provide you with a better experience on our websites. Close this message to accept cookies or find out how to manage your cookie settings.
To save content items to your account,
please confirm that you agree to abide by our usage policies.
If this is the first time you use this feature, you will be asked to authorise Cambridge Core to connect with your account.
Find out more about saving content to .
To save content items to your Kindle, first ensure [email protected]
is added to your Approved Personal Document E-mail List under your Personal Document Settings
on the Manage Your Content and Devices page of your Amazon account. Then enter the ‘name’ part
of your Kindle email address below.
Find out more about saving to your Kindle.
Note you can select to save to either the @free.kindle.com or @kindle.com variations.
‘@free.kindle.com’ emails are free but can only be saved to your device when it is connected to wi-fi.
‘@kindle.com’ emails can be delivered even when you are not connected to wi-fi, but note that service fees apply.
In 1990, when the Journal of Functional Programming (JFP) was in the stages of being planned, I was asked by the then editors, Simon Peyton Jones and Philip Wadler, to contribute a regular column to be called Functional Pearls. The idea they had in mind was to emulate the very successful series of essays that Jon Bentley had written in the 1980s under the title “Programming Pearls” in the Communications of the ACM. Bentley wrote about his pearls:
Just as natural pearls grow from grains of sand that have irritated oysters, these programming pearls have grown from real problems that have irritated programmers. The programs are fun, and they teach important programming techniques and fundamental design principles.
I think the editors had asked me because I was interested in the specific task of taking a clear but inefficient functional program, a program that acted as a specification of the problem in hand, and using equational reasoning to calculate a more efficient one. One factor that stimulated growing interest in functional languages in the 1990s was that such languages were good for equational reasoning. Indeed, the functional language GOFER, invented by Mark Jones, captured this thought as an acronym. GOFER was one of the languages that contributed to the development of Haskell, the language on which this book is based. Equational reasoning dominates everything in this book.
The idea of ranking the elements of a list crops up frequently. An element x is assigned rank r if there are exactly r elements of the list less than x. For example, rank [51, 38, 29, 51, 63, 38] = [3, 1, 0, 3, 5, 1]. This scheme ranks from 0 and from lowest to highest, but one can also rank from 1 and from highest to lowest, as when ranking candidates by their marks in an examination. Rankings are distinct if and only if the list does not contain duplicates, in which case rank xs is a permutation of [0 .. length xs − 1].
In this pearl we consider the problem of ranking the suffixes of a list rather than the list itself. It takes Θ(n log n) steps to rank a list of length n, assuming a test x < y takes constant time. Since in the worst case it takes Θ(n) such tests to make one lexicographic comparison between two suffixes of a list of length n, it seems that ranking the suffixes of a list should require Θ(n2 log n) basic comparisons. The point of this pearl is to show that only Θ(n log n) steps are necessary. Asymptotically speaking, it takes no more time to rank the suffixes of a list than it does to rank the list itself. Surprising but true.
Gilles Kahn was one of the most influential figures in the development of computer science and information technology, not only in Europe but throughout the world. This volume of articles by several leading computer scientists serves as a fitting memorial to Kahn's achievements and reflects the broad range of subjects to which he contributed through his scientific research and his work at INRIA, the French National Institute for Research in Computer Science and Control. The authors also reflect upon the future of computing: how it will develop as a subject in itself and how it will affect other disciplines, from biology and medical informatics, to web and networks in general. Its breadth of coverage, topicality, originality and depth of contribution, make this book a stimulating read for all those interested in the future development of information technology.
This book presents a unifying framework for using priority arguments to prove theorems in computability. Priority arguments provide the most powerful theorem-proving technique in the field, but most of the applications of this technique are ad hoc, masking the unifying principles used in the proofs. The proposed framework presented isolates many of these unifying combinatorial principles and uses them to give shorter and easier-to-follow proofs of computability-theoretic theorems. Standard theorems of priority levels 1, 2, and 3 are chosen to demonstrate the framework's use, with all proofs following the same pattern. The last section features a new example requiring priority at all finite levels. The book will serve as a resource and reference for researchers in logic and computability, helping them to prove theorems in a shorter and more transparent manner.
This 1991 volume contains the proceedings of the first international workshop on Logical Frameworks. The contributions are concerned with the application of logical reasoning and proof theory in computer science and its relevance to automatic theorem proving, and consequently topics such as artificial intelligence. It is the only source for much of this material and will be a necessary purchase for mathematicians and computer scientists undertaking research at the interface of logic and software engineering.
Kurt Gödel (1906–1978) did groundbreaking work that transformed logic and other important aspects of our understanding of mathematics, especially his proof of the incompleteness of formalized arithmetic. This book on different aspects of his work and on subjects in which his ideas have contemporary resonance includes papers from a May 2006 symposium celebrating Gödel's centennial as well as papers from a 2004 symposium. Proof theory, set theory, philosophy of mathematics, and the editing of Gödel's writings are among the topics covered. Several chapters discuss his intellectual development and his relation to predecessors and contemporaries such as Hilbert, Carnap, and Herbrand. Others consider his views on justification in set theory in light of more recent work and contemporary echoes of his incompleteness theorems and the concept of constructible sets.
This book was first published in 1993. Computing systems are becoming highly complex, harder to understand, and therefore more prone to failure. Where such systems control aircraft for example, system failure could have disastrous consequences. It is important therefore that we are able to employ mathematical techniques to specify the behaviour or safety critical systems. This thesis uses the theory of Communicating Sequential Processes (CSP) to show how a real-lime system may be specified. Included is a case study in which a local area network protocol is described at two levels of abstraction, and a general method 14 structuring CSP descriptions of layered protocols is given.
Programming frequently requires that problems are broken down into subproblems and then each subproblem solved independently. These solutions may then be combined to provide a solution to the original problem. Partial evaluation is a serious attempt to tackle this issue, allowing the programmer to write programs in a highly interpretive style without paying the price in efficiency. This thesis covers the theory and practice behind practical evaluation.
Michael McMillan provides a complete presentation of the object-oriented features of the Visual Basic .NET language for advanced Visual Basic programmers. Beginning with an introduction to abstract data types and their initial implementation using structures, he explains standard OOP topics including class design, inheritance, access modifiers and scoping issues, abstract classes, design and implemention of interfaces and design patterns, and refactoring in VB.NET. More advanced OOP topics are included as well, such as reflection, object persistence, and serialization. To tie everything together, McMillan demonstrates sound OOP design and implementation principles through practical examples of standard Windows applications, database applications using ADO.NET, Web-based applications using ASP.NET, and Windows service applications.
Description logics are embodied in several knowledge-based systems and are used to develop various real-life applications. Now in paperback, The Description Logic Handbook provides a thorough account of the subject, covering all aspects of research in this field, namely: theory, implementation, and applications. Its appeal will be broad, ranging from more theoretically oriented readers, to those with more practically oriented interests who need a sound and modern understanding of knowledge representation systems based on description logics. As well as general revision throughout the book, this new edition presents a new chapter on ontology languages for the semantic web, an area of great importance for the future development of the web. In sum, the book will serve as a unique resource for the subject, and can also be used for self-study or as a reference for knowledge representation and artificial intelligence courses.
More Java Gems presents the best articles and columns published in Java Report between 1997 and 1999. Dwight Deugo, Editor of Java Report, has carefully selected each article to be independent of any specific version of Java. The material relies mainly on those classes that are now part of the standard Java class library and APIs. Also, each article and column discusses Java topics and implementations that are not readily available in a single book. The book serves as an excellent reference to anyone involved with Java. The reader can learn more about the language, perform analysis, design and modeling, work on specific implementations, check performance, and perform testing. This book presents the good ideas of people who have used Java for 'real' applications.