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 no-reply@cambridge.org
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.
The only prerequisite to be able to read this book is familiarity with the basic notations of sets and functions, and the basic ideas of mathematical reasoning. Here we shall review these matters, and explain the notation and terminology that we shall use. This is mostly standard; so for the reader who prefers to move straight to chapter 1 and refer back to this prologue only as necessary, we point out that we shall use the word function to mean a partial function in general. We discuss this more fully below.
Sets
Generally we shall use capital letters A, B, C,… to denote sets. We write x ∈ A to mean that x is a member of A, and we write x ∉ A to mean that x is not a member of A. The notation {x: … x…} where … x … is some statement involving x means the set of all objects x for which … x … is true. Thus {x : x is an even natural number} is the set {0,2,4,6,…}.
If A, B are sets, we write A ⊆ B to mean that A is contained in B (or A is a subset of B); we use the notation A ⊂ B to mean that A ⊆ B but A ≠ B (i.e. A is a proper subset of B). The union of the sets A, B is the set {x : x ∈ A or x ∈ B (or both)}, and is denoted by A ∪ B; the intersection of A, B is the set {x: x ∈ A and x ∈ B} and is denoted by A ∩ B. The difference (or relative complement) of the sets A, B is the set {x : x ∈ A and x ∉ B} and is denoted by A \B.
In the real world of computing, the critical question about a function f is not Is f computable?, but rather Is f computable in practical terms? In other words, Is there a program for f that will compute f in the time (or space) we have available? The answer depends partly on our skill in writing programs and the sophistication of our computers; but intuitively we feel that there is an additional factor which can be described as the ‘intrinsic complexity’ of the function f itself. The theory of computational complexity, which we introduce in this chapter, has been developed in order to be able to discuss such questions and to aid the study of the more practical aspects of computability.
Using the URM approach, we can measure the time taken to compute each value of a function f by a particular program, on the assumption that each step of a URM computation is performed in unit time. The time of computation thus defined is an example of a computational complexity measure that reflects the complexity or efficiency of the program being used. (Later we shall mention other complexity measures.)
With a notion of complexity of computation made precise, it is possible to pursue questions such as How intrinsically complex is a computable function f? and Is it possible to find a ‘best’ program for computing f?
The theory of computational complexity is a relatively new field of research; we shall present a small sample of results that have a bearing on the questions raised above. At the end of the chapter we shall provide suggestions for the reader wishing to pursue this topic further.
We begin in § 1 by defining some notation; after some discussion we proceed to show that there are arbitrarily complex computable functions. Section 2 is devoted to the surprising and curious Speed-up theorem of M. Blum, which shows in particular that there are computable functions having no ‘best’ program.
The emergence of the concept of a computable function over fifty years ago marked the birth of a new branch of mathematics: its importance may be judged from the fact that it has had applications and implications in fields as diverse as computer science, philosophy and the foundations of mathematics, as well as in many other areas of mathematics itself. This book is designed to be an introduction to the basic ideas and results of computability theory (or recursion theory, as it is traditionally known among mathematicians).
The initial purpose of computability theory is to make precise the intuitive idea of a computable function; that is, a function whose values can be calculated in some kind of automatic or effective way. Thereby we can gain a clearer understanding of this intuitive idea; and only thereby can we begin to explore in a mathematical way the concept of computability as well as the many related ideas such as decidability and effective enumerability. A rich theory then arises, having both positive and negative aspects (here we are thinking of non-computability and undecidability results), which it is the aim of this book to introduce.
We could describe computability theory, from the viewpoint of computer science, as beginning with the question What can computers do in principle (without restrictions of space, time or money)? – and, by implication – What are their inherent theoretical limitations? Thus this book is not about real computers and their hardware, nor is it about programming languages and techniques. Nevertheless, our subject matter is part of the theoretical background to the real world of computers and their use, and should be of interest to the computing community.
For the basic definition of computability we have used the ‘idealised computer’ or register machine approach; we have found that this is readily grasped by students, most of whom are aware of the idea of a computer.
Our basic study of computability has been designed so that it could serve as a stepping stone to more advanced or more detailed study in any of several directions. In this brief postlude, we shall mention some of the areas in which further study could be pursued, and we offer some suggestions for further reading. The divisions below are not hard and fast, and there are many interrelations between the various areas we mention.
Computability Further study of the theoretical notion of computability (the starting point of this book) could be pursued in two directions: (a) more detailed examination of other equivalent approaches to computability (which we surveyed in chapter 3); (b) examination of more restricted notions of effective computability, involving, for instance, finite automata and similar devices.
Some references (several historical) for (a) were given in chapter 3. For both (a) and (b) we suggest the books of Minsky [1967] (a very comprehensive treatment), Arbib [1969], or Engeler [1973].
Recursion theory We use this traditional title under which to mention more advanced ideas arising out of the notion of computability on ℕ, such as we began to pursue in chapters 7, and 9 to 11. Specific areas include:
Hierarchies: there are various ways to extend the sequence beginning ‘recursive, r.e., …’ to obtain a hierarchy of kinds of set, each kind of set having more difficult decision problem than the preceding one. Among the important hierarchies that have been studied are the arithmetic hierarchy, the hyperarithmetic hierarchy, and the analytical hierarchy.
Reducibilities and degrees: between ≤m and ≤T there is a spectrum of reducibilities that could be investigated. For the student wishing to delve further into Turing reducibility, the next step would be to master a proof of the Friedberg-Muchnik solution to Post's problem, before proceeding to further results and proofs in this area, some of which we mentioned in chapter 9.
The main purpose of this edition and commentary is to enable the learner to read and enjoy Plato's Symposium in Greek, to understand its arguments and to appreciate its artistry. The secondary purpose is to improve the learner's knowledge of Greek in order that he may find it easier to read other texts. In an edition which is meant to be brief and relatively inexpensive, these two purposes compete for space, and the need to increase the reader's speed by telling him the meanings of words rather than making him seek them all in the lexicon is also a claim on space.
My information about the text of the Symposium is derived from the text and apparatus criticus of Burnet's Oxford Classical Text and of Robin's Budé edition, supplemented by some further data helpfully communicated to me by Dr W. S. McD. Nicoll. I have not collated any Plato manuscripts myself, but I have exercised my own judgement throughout in editing the text on the evidence available to me. Textual problems are not discussed in the commentary, nor are variants and emendations recorded in the apparatus, except where they are important. Users of this or any edition are warned that the textual variants presented by citations from Plato in later literature are not yet as fully investigated as is desirable.
The Symposium, like most of what Plato wrote, is about how life should be lived; not just the life of an ancient Athenian, but your life and mine. Since he is a highly original thinker and a writer of remarkable imagination, skill, dramatic power and sensitivity in the use of language, what he says is worth reading, and the minimum requirement of any commentary on any work of his is that it should ask in respect of each passage: what does he mean? why does he say it? does it follow? and is it true? His distinctive values, attitudes, assumptions, cravings and passions are not mine, and for that reason I do not find his philosophical arguments even marginally persuasive. Much that is written about him is marked, in my view, by an uncritical enthusiasm for the abstract and immutable, as if such an enthusiasm always and necessarily afforded better access to the truth about man, nature and divinity than is afforded by a love of the particular, material and perishable.
‘The outbreak of the Second Punic War’, says Eduard Meyer, ‘was the consequence of a deliberate decision by Hannibal; that of the Seven Years War, of a decision by Frederick the Great; and that of the War of 1866, of a decision by Bismarck. All of them might have decided differently, and different personalities would…have decided differently; the consequence would have been that the course of history would have been different.’ In footnote 2 he adds, ‘This is neither to affirm nor to deny that in such a case the wars in question would never have occurred: that is a completely unanswerable and so an idle question.’ Leaving aside the awkward relationship between the second sentence and Meyer's previously discussed account of the relationship between ‘freedom’ and ‘necessity’ in history, what is most debatable in this passage is the view that questions to which no answer, or no certain answer, can be given are, for that reason alone, ‘idle’ questions. Things would be in a bad way even in empirical science if those deep questions to which it gives no answer were never to be raised. To be sure, we are not concerned here with such ‘Ultimate’ problems: rather, it is a case of a question which, on the one hand, has been ‘overtaken’ by events and, on the other, cannot receive a clear positive answer in the state of our actual and possible knowledge.