It is amazing that people manage to cope with all the ambiguities in the English language. Here are some sentences that illustrate the issue:
- “You may have cake, or you may have ice cream.”
- “If pigs can fly, then you can understand the Chebyshev bound.”
- “If you can solve any problem we come up with, then you get an \(A\) for the course.”
- “Every American has a dream.”
What precisely do these sentences mean? Can you have both cake and ice cream or must you choose just one dessert? Pigs can’t fly, so does the second sentence say anything about your understanding the Chebyshev bound? If you can solve some problems we come up with, can you get an \(A\) for the course? And if you can’t solve a single one of the problems, does it mean you can’t get an \(A\)? Finally, does the last sentence imply that all Americans have the same dream—say of owning a house—or might different Americans have different dreams—say, Eric dreams of designing a killer software application, Tom of being a tennis champion, Albert of being able to sing?
Some uncertainty is tolerable in normal conversation. But when we need to formulate ideas precisely—as in mathematics and programming—the ambiguities inherent in everyday language can be a real problem. We can’t hope to make an exact argument if we’re not sure exactly what the statements mean. So before we start into mathematics, we need to investigate the problem of how to talk about mathematics.
To get around the ambiguity of English, mathematicians have devised a special language for talking about logical relationships. This language mostly uses ordinary English words and phrases such as “or,” “implies,” and “for all.” But mathematicians give these words precise and unambiguous definitions.
Surprisingly, in the midst of learning the language of logic, we’ll come across the most important open problem in computer science—a problem whose solution could change the world.