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.
Kurt Gödel is almost as famous—one might say “notorious”—for his extreme platonist views as he is famous for his mathematical theorems. Moreover his platonism is not a myth; it is well-documented in his writings. Here are two platonist declarations about set theory, the first from his paper about Bertrand Russell and the second from the revised version of his paper on the Continuum Hypotheses.
Classes and concepts may, however, also be conceived as real objects, namely classes as “pluralities of things” or as structures consisting of a plurality of things and concepts as the properties and relations of things existing independently of our definitions and constructions.
It seems to me that the assumption of such objects is quite as legitimate as the assumption of physical bodies and there is quite as much reason to believe in their existence.
But, despite their remoteness from sense experience, we do have something like a perception also of the objects of set theory, as is seen from the fact that the axioms force themselves upon us as being true. I don't see any reason why we should have less confidence in this kind of perception, i.e., in mathematical intuition, than in sense perception.
The first statement is a platonist declaration of a fairly standard sort concerning set theory. What is unusual in it is the inclusion of concepts among the objects of mathematics.
The year 2006 marked the centennial of Kurt Gödel, who was born on 28 April 1906. The importance of Gödel's work for nearly all areas of logic and foundations of mathematics hardly needs to be explained to our readers.
The year 2006 saw several centennial observances. In particular, the program committee for the 2006 Association for Symbolic Logic annual meeting, which took place on 17–21 May at the Université du Québec à Montréal, commissioned a subcommittee to arrange a portion of the program that would commemorate the Gödel centennial. The subcommittee arranged three one-hour lectures, by Jeremy Avigad, Sy-David Friedman, and Akihiro Kanamori. It also arranged a two-hour special session on Gödel's philosophy of mathematics, with lectures by Steve Awodey, John Burgess, and William Tait. All of the lectures have led to papers in this volume. The volume contains one other new paper, “The Gödel hierarchy and reverse mathematics,” by Stephen G. Simpson. Other papers included in the volume are reprinted, in all but one case from The Bulletin of Symbolic Logic. We have included the papers presented at the 2004 ASL annual meeting at Carnegie-Mellon University, in a special session organized by the editors of Gödel's Collected Works, by Martin Davis, John W. Dawson, Jr., Cheryl A. Dawson, Solomon Feferman, Warren Goldfarb, Donald A. Martin, Wilfried Sieg, and William Tait. These appeared in the June 2005 Bulletin. Also reprinted are papers by Mark van Atten and Juliette Kennedy and by Charles Parsons that appeared in earlier issues of the Bulletin, as well as a paper by Peter Koellner that appeared in Philosophia Mathematica.
We now turn our attention to theorems whose proofs use Π2 constructions. We begin, in Section 5.1, by stating lemmas that isolate combinatorial properties of Π2 constructions. We then implement Π2 constructions to prove the existence of a high computably enumerable degree in Section 5.2, the Sacks Jump Inversion Theorem in Section 5.3, the Minimal Pair Theorem in Section 5.4 and an embedding of the pentagon into the computably enumerable degrees in Section 5.5.
Π2 Constructions
Requirements such as the thickness requirements discussed in Chapter 2 act to construct functionals that are total on given oracles, so require the declaration of infinitely many axioms. Such requirements cannot be handled by level 1 constructions, as a node of T1 will generally have the responsibility to declare only finitely many axioms for such functionals. This will introduce a coordination problem, as nodes having the responsibility to declare axioms on the same argument will appear on incomparable paths through T1.
Some requirements of the form Φ(A) = W can be handled by level 2 constructions. These constructions capture what are traditionally called infinite injury constructions. For those familiar with infinite injury constructions, we describe how these constructions are simulated by level 2 constructions.
A typical infinite injury construction will assign requirements to nodes of a tree T2, that can always be taken to be a binary tree. The nodes of the tree are prioritized, using the lexicographical ordering of these nodes. A computation of the current path through T2 is made at each stage of the construction, and action is carried out for nodes that lie along the current path.
“I once asked Carnap with which philosopher of the past he felt a close kinship,” writes Abraham Kaplan in a memoir. “His reply was Leibniz” (Kaplan [1991], p. 40). This feeling of kinship with Leibniz was something Gödel and Carnap had in common, and it distinguished them from the other members of the Vienna Circle and its following, who had less rationalist inclinations. However, Carnap and Gödel were in good company when we look more widely at the founders of modern logic and scientifically-oriented philosophy. Frege, Cantor, and Russell, among others, would likely also have named Leibniz if asked the same question. One obvious source of fascination for all these thinkers was Leibniz's idea of a universal deductive system, a calculus philosophicus or characteristica universalis, to connect all knowledge in a single, uniform deductive structure. The various efforts during the Enlightenment to classify and codify the new knowledge, in competition with theological and traditional lore, had overlooked or forgotten Leibniz's proposal, as had the subsequent positivist tradition. It was only with the more powerful logical tools developed in the later nineteenth century that Leibniz's dreams once again became relevant.
Of course these latter-day admirers of Leibniz diverged widely in their attitude toward this universal logical program. They diverged, for instance, along the left-right scale or “schema of possible philosophical world-views” that Gödel set up in a lecture written around 1961:
I believe that the most fruitful principle for gaining a perspective on the range of possible world-views [Weltanschauungen] will be to divide them up according to the degree and the manner of their affinity to or departure from metaphysics (or religion). […]
I have traveled the length and breadth of this country and talked with the best people, and I can assure you that data processing is a fad that won't last out the year.
– editor in charge of business books for Prentice-Hall, 1957
The world runs on databases. The modern world relies on them and would be lost without them. Business depends on them, from storing employee and payroll data, to customer data, supplies, manufacturing, transportation, and inventory – you name it. It seems like everything these days is on the computer. In fact, if it's not on the computer, it's probably old and outdated. The key then, is being able to access these data, manipulate them, update them, search them, sort them, and make them work for you. That's where LINQ to SQL comes in. It's the connection between your VB program and a database. In this case, it's an Access file, but the same principles hold true for access to almost any type of database. You'll get the basics to connect to a database, view it, update it, and use it. It takes several programming classes and a couple of database classes to get good at it, but here you'll get a taste of it and some general principles to get you started.
Background
Databases come in several forms, but by far the most popular database management system (DBMS) is a relational database.
On two occasions I have been asked (by members of Parliament), “Pray, Mr. Babbage, if you put into the machine wrong figures, will the right answers come out?” I am not able rightly to apprehend the kind of confusion of ideas that could provoke such a question.
–Charles Babbage
By now you've come to realize that the real bottlenecks of your programs are input and output. Some of that is because users can only type and click so much and some of it is because input is repetitive. You've created useful output but have been unable to hang on to it. So far, every program run has meant starting from scratch with your data, entering it as needed, calculating the results, and then losing all of that work with a click of the Exit Button. No more. File input and output gives you the ability to store data and retrieve it as needed. File input takes data stored in a file and puts it into your program. File output stores the results in a file so you can use the data at a later date. This chapter covers the details of opening a data file, reading the data, processing the data, displaying the output, and writing the results to a file.
The Basics of File Input and Output
A data file, for our purposes, is a text file. Each line in the file is a record. A record consists for one or more fields.
But what is it good for? – an engineer at the Advanced Computing Systems Division of IBM, commenting on the microchip in 1968
Think of objects as tools. Better yet, think of them as building blocks. Imagine how hard a job would be if you had to create everything from scratch every time. Say you wanted to build a table. First, you'd need to make an axe to cut down the tree. Then you'd have to make a saw to cut the wood. You'd have to make your own nails to piece together the table, but that's only after you made your own hammer so you could pound the nails. Programming is like that sometimes – OK, usually. And it was certainly that way years ago. Everything was done from scratch and very little was reusable. However, there's been some progress since then. You saw reusable code when you learned procedures and functions. Objects and classes are that way, but on a grander scale. The controls in the Toolbox are objects, each specially created for a specific task. They're tools and, without them, development would be much tougher, and a whole lot less fun. Classes are code that defines an abstract data type – it's a thing, and the developer provides a description of it and determines how it can be used. This chapter shows you how to create objects with your code and how to define and use classes.
When several computers have to cooperate to achieve a certain task (i.e. distributed computing) we need 'recipes' (i.e. protocols) to tell them what to do. Unfortunately, human minds are not well suited to keeping track of what might happen given even a very simple protocol. In this book Dr Schoone shows how we can derive properties of those protocols that always hold (i.e. invariants), irrespective of what actually happens in an execution of the protocol. From these invariants the basic attributes of the protocols can be obtained. Each protocol is explained intuitively, proved correct using invariants, and analysed to establish the relation between parameter settings and its essential features. The protocols belong to a wide range of layers in the ISO reference model hierarchy, and include the following: a class of communication protocols that tolerate and correct message loss, duplication, and resequencing; protocols for determining and maintaining routing information, both in a static and a dynamic environment; connection-management protocols; and atomic commitment protocols for use in distributed database management.
Specialists learn more and more about less and less until they know everything about nothing. Generalists learn less and less about more and more until they know nothing about everything.
– Anonymous
We live in a world of specialization. Want a cup of coffee? There's a store that specializes in coffee, any way you like it. Need a doughnut to go with it? There's a company that makes and sells the best doughnuts. Need something to read while you're enjoying a bite? Pick from thousands of magazines or millions of books on any and all topics imaginable. Gone are the days of the local handyman – the resident “Mr. Fixit” – who could fix anything and get anything to work. Today's world has specialists. A mechanic specializes in car repair. The cable guy handles your TV problems. When the office copier is on the fritz, call the copier guy. Everyone's an expert.
Programming is the same way. Blocks of code are written for a particular purpose. Some do simple tasks, but do them often. It's easier to write a procedure once for a task and then call it multiple times as needed. Other blocks of code might do a complicated calculation or solve a particular problem. These provide a specific function. It's easier to write and store these functions and then use them when needed than it is to create them from scratch. That's the basis for procedures and functions.
There are 10 types of people in the world: those that understand binary and those that don't.
On a computer, memory is everything, or nearly so. Data are stored there and programs are loaded and run from memory. Memory is essential. Compared to what was available a few years ago, today's computers have a huge amount of memory. A few years ago that same comparison would have been true as well. Forty years ago we sent men to the moon with spaceships that had less memory than a good pocket calculator has today. All computers, old and new, have memory in common. Memory is where what the computer “knows” is stored. Much of programming comes down to allocating and managing memory. For the PCs of a generation ago, memory was a scarce and expensive commodity to be guarded closely and used judiciously. Programmers used it carefully and squeezed as much as they could from it. At the time, conserving memory gave you a leg up on development and helped make your programs faster and more efficient. And, today, while the amount of memory isn't as much of an issue, the management of memory is. When you work on your computer, you work with its “desktop.” These days, it's the size of a table. In the early days of programming, that “desktop” was the size of a postage stamp. Variables and constants are two important components of a computer program. Both are created in memory and are assigned values.
Computer science education cannot make anybody an expert programmer any more than studying brushes and pigment can make somebody an expert painter.
–Eric Raymond
“A picture is worth a thousand words,” or so said Frederick R. Barnard nearly ninety years ago. He was selling advertising for streetcars and couldn't have had computer graphics in mind. In fact, the first computer was still a generation away. But, he was pretty accurate because it just might take a thousand words of computer code to generate a good picture. Remember that the computer takes baby steps and every step has to be clearly described. The same is true with graphics. You can place pictures on your form and you can create graphics – beautiful graphics if you take the time – but you have to write some code to do it. Visual Basic can draw lines and shapes, it can work with text, and it's great with colors. It just takes a little work to create them and a little code to do it right. This chapter introduces the basics for graphics, sound, and multimedia. When it's over, you'll be able to play sound and video, create simple shapes, and draw and paint with the computer.
Graphic Basics
There are several ways to add graphics to a program. You've already worked with the PictureBox to add graphics. But there's so much more.
The function of good software is to make the complex appear to be simple.
– Grady Booch
Good software does just that. It's easy to use, “intuitive” is the buzzword used in the industry. It does what it should and people actually like using it. Developers must keep two things in mind: getting the program to do what it should and making it useable – the two go hand-in-hand. A cool interface means nothing if the software doesn't perform. And, no matter how solid the code is, a clunky program is nearly worthless. Always think of both form and function. On the one hand, a developer must write code that works. On the other, a developer must always consider the end user. Never forget, you can't have one without the other!
New Events
You're familiar with several events such as Click, Load, and Scroll, but there are more, many more. In fact, there are far too many to cover in anything short of the dreaded user's manual. Every event can trigger code and every user action raises an event, that is, every time the user does something, from a click of the mouse to a peck of a key, a program can respond. How it responds and what it does are key to good software.
KeyPress
When a key is pressed, it generates a KeyPress event and also several other key events.
[By the end of the 20th Century there will be a generation] to whom it will not be injurious to read a dozen quire of newspapers daily, to be constantly called to the telephone [and] to live half their time in a railway carriage or in a flying machine.
– Max Nordau in 1895
So far you have seen how a sequence of steps lets you build a program that will do your bidding. You've seen how decision structures give the computer the ability to make decisions. You've learned how to get the computer to repeat instructions, giving it the ability to do the same task over and over. And, you've taught it how to read and write. Well, it can't read and write, but it can access and store data in a file. All of these give the computer the ability to access and process data at remarkable speed. But, you've been limited to only a handful of names and numbers – only what you could hold in your hand and keep track of in your head. You've been forced to discard one thing in order to grab the next. It's as if the world was a full-screen movie and you're stuck looking at stills in the family photo album. Enter arrays. With an array you can grab an armful of data and process it as you wish. Instead of stills on Grandma's porch, you've got a DVD on HD and control of the remote.
It claims to be fully automatic, but actually you have to push this little button here.
–Gentleman John Killian
The more work you put into your programs, the less work they'll be for the user. A developer might not like that, but a good program might be used hundreds or thousands of times by millions of users. If you make it just a little easier for every one of them every time they use it – well, you get the idea. Your programs aren't quite there yet, but the basic principles are the same. Just develop an interface with the user in mind and spend a little more time getting the details right. The interface takes care of input and output and the developer worries about the details to handle the processing that comes in between. Good programs are fun and easy to use. They allow the user to concentrate on solving a problem rather than forcing them to figure out how to use the computer.
This chapter introduces new tools. Most of them make it easier for the user and more complicated for the developer. There are also a few other odds and ends to clean up your output.
RadioButtons
RadioButtons are used to select one option from a list of several options. Click on a RadioButton to select it. A black dot appears inside the circle to indicate it's selected. Click on another RadioButton to select it and deselect the original.
Who cares how it works, just as long as it gives the right answer?
–Jeff Scholnik
That's a rather cavalier approach for anyone to take, especially when computers are involved. Knowledge is power and the more you know, the greater your power. One book isn't enough to give you all-consuming power, especially over a tool as powerful as a computer. It is, however, enough to get you started. One book won't turn you into a nerd that looks at his own shoes when talking, lives on caffeine and stale snack cakes, and would rather hack on a computer than go out on a date. That's just a stereotype perpetuated by teen movies. While it does fit a few people, almost all of the ones I know are smart, articulate, funny, and just all-around bright and inquisitive people. Above all, they're curious. And the best are curious about nearly everything, not just computers. How does it work? What happens when I try this? What if…?
Programming is, above all else, about thinking and problem-solving. If for no other reason, it's useful because it makes you think about thinking and makes you describe how to solve a problem. For the computer to solve a problem, even simple tasks must be explained in great detail. For someone to explain the rules to a computer – in other words, to write a program – takes a great deal of thinking and understanding.