Table of Contents
Sections marked with * are optional, in the sense that later material does not depend on them.
| PREFACE | xiii | ||
| ACKNOWLEDGEMENTS | xvii | ||
| CREDITS | xix | ||
| PART I: INTRODUCTION | 1 | ||
| 1 | Why Study the Theory of Computation? | 2 | |
| 1.1 | The Shelf Life of Programming Tools | 2 | |
| 1.2 | Applications of the Theory Are Everywhere | 5 | |
| 2 | Languages and Strings | 8 | |
| 2.1 | Strings | 8 | |
| 2.2 | Languages | 10 | |
| Exercises | 19 | ||
| 3 | The Big Picture: A Language Hierarchy | 21 | |
| 3.1 | Defining the Task: Language Recognition | 21 | |
| 3.2 | The Power of Encoding | 22 | |
| 3.3 | A Machine-Based Hierarchy of Language Classes | 28 | |
| 3.4 | A Tractability Hierarchy of Language Classes | 34 | |
| Exercises | 34 | ||
| 4 | Computation | 36 | |
| 4.1 | Decision Procedures | 36 | |
| 4.2 | Determinism and Nondeterminism | 41 | |
| 4.3 | Functions on Languages and Programs | 48 | |
| Exercises | 52 | ||
| PART II: FINITE STATE MACHINES AND REGULAR LANGUAGES | 53 | ||
| 5 | Finite State Machines | 54 | |
| 5.1 | Deterministic Finite State Machines | 56 | |
| 5.2 | The Regular Languages | 60 | |
| 5.3 | Designing Deterministic Finite State Machines | 63 | |
| 5.4 | NondeterministicFSMs | 66 | |
| 5.5 | From FSMs to Operational Systems | 79 | |
| 5.6 | Simulators for FSMs* | 80 | |
| 5.7 | Minimizing FSMs * | 82 | |
| 5.8 | A Canonical Form for Regular Languages | 94 | |
| 5.9 | Finite State Transducers * | 96 | |
| 5.10 | Bidirectional Transducers * | 98 | |
| 5.11 | Stochastic Finite Automata: Markov Models and HMMs * | 101 | |
| 5.12 | Finite Automata, Infinite Strings: Büchi Automata * | 115 | |
| Exercises | 121 | ||
| 6 | Regular Expressions | 127 | |
| 6.1 | What is a Regular Expression? | 128 | |
| 6.2 | Kleene's Theorem | 133 | |
| 6.3 | Applications of Regular Expressions | 147 | |
| 6.4 | Manipulating and Simplifying Regular Expressions | 149 | |
| Exercises | 151 | ||
| 7 | Regular Grammars * | 155 | |
| 7.1 | Definition of a Regular Grammar | 155 | |
| 7.2 | Regular Grammars and Regular Languages | 157 | |
| Exercises | 161 | ||
| 8 | Regular and Nonregular Languages | 162 | |
| 8.1 | How Many Regular Languages Are There? | 162 | |
| 8.2 | Showing That a Language Is Regular | 163 | |
| 8.3 | Some Important Closure Properties of Regular Languages | 165 | |
| 8.4 | Showing That a Language is Not Regular | 169 | |
| 8.5 | Exploiting Problem-Specific Knowledge | 178 | |
| 8.6 | Functions on Regular Languages | 179 | |
| Exercises | 182 | ||
| 9 | Algorithms and Decision Procedures for Regular Languages | 187 | |
| 9.1 | Fundamental Decision Procedures | 187 | |
| 9.2 | Summary of Algorithms and Decision Procedures | 194 | |
| Exercises | 196 | ||
| 10 | Summary and References | 198 | |
| PART III: CONTEXT-FREE LANGUAGES AND PUSHDOWN AUTOMATA | 201 | ||
| 11 | Context-Free Grammars | 203 | |
| 11.1 | Introduction to Rewrite Systems and Grammars | 203 | |
| 11.2 | Context-Free Grammars and Languages | 207 | |
| 11.3 | Designing Context-Free Grammars | 212 | |
| 11.4 | Simplifying Context-Free Grammars * | 212 | |
| 11.5 | Proving That a Grammar is Correct * | 215 | |
| 11.6 | Derivations and Parse Trees | 218 | |
| 11.7 | Ambiguity | 220 | |
| 11.8 | Normal Forms * | 232 | |
| 11.9 | Island Grammars * | 241 | |
| 11.10 | Stochastic Context-Free Grammars * | 243 | |
| Exercises | 245 | ||
| 12 | Pushdown Automata | 249 | |
| 12.1 | Definition of a (Nondeterministic) PDA | 249 | |
| 12.2 | Deterministic and Nondeterministic PDAs | 254 | |
| 12.3 | Equivalence of Context-Free Grammars and PDAs | 260 | |
| 12.4 | Nondeterminism and Halting | 274 | |
| 12.5 | Alternative Equivalent Definitions of a PDA * | 275 | |
| 12.6 | Alternatives that are Not Equivalent to the PDA * | 277 | |
| Exercises | 277 | ||
| 13 | Context-Free and Noncontext-Free Languages | 279 | |
| 13.1 | Where Do the Context-Free Languages Fit in the Big Picture? | 279 | |
| 13.2 | Showing That a Language is Context-Free | 280 | |
| 13.3 | The Pumping Theorem for Context-Free Languages | 281 | |
| 13.4 | Some Important Closure Properties of the Context-Free Languages | 288 | |
| 13.5 | Deterministic Context-Free Languages * | 295 | |
| 13.6 | Ogden's Lemma * | 303 | |
| 13.7 | Parikh's Theorem * | 306 | |
| 13.8 | Functions on Context-Free Languages * | 308 | |
| Exercises | 310 | ||
| 14 | Algorithms and Decision Procedures for Context-Free Languages | 314 | |
| 14.1 | The Decidable Questions | 314 | |
| 14.2 | The Undecidable Questions | 320 | |
| 14.3 | Summary of Algorithms and Decision Procedures | 320 | |
| Exercises | 322 | ||
| 15 | Context-Free Parsing* | 323 | |
| 15.1 | Lexical Analysis | 325 | |
| 15.2 | Top-Down Parsing | 327 | |
| 15.3 | Bottom-Up Parsing | 340 | |
| 15.4 | Parsing Natural Languages | 350 | |
| Exercises | 358 | ||
| 16 | Summary and References | 360 | |
| PART IV: TURING MACHINES AND UNDECIDABILITY | 363 | ||
| 17 | Turing Machines | 364 | |
| 17.1 | Definition, Notation and Examples | 364 | |
| 17.2 | Computing With Turing Machines | 375 | |
| 17.3 | Adding Multiple Tapes and Nondeterminism | 382 | |
| 17.4 | Simulating a “Real” Computer * | 393 | |
| 17.5 | Alternative Turing Machine Definitions | 396 | |
| 17.6 | Encoding Turing Machines as Strings | 400 | |
| 17.7 | The Universal Turing Machine | 404 | |
| Exercises | 407 | ||
| 18 | The Church-Turing Thesis | 411 | |
| 18.1 | The Thesis | 411 | |
| 18.2 | Examples of Equivalent Formalisms * | 414 | |
| Exercises | 424 | ||
| 19 | The Unsolvability of the Halting Problem | 426 | |
| 19.1 | The Language H is Semidecidable but Not Decidable | 428 | |
| 19.2 | Some Implications of the Undecidability of H | 431 | |
| 19.3 | Back to Turing, Church, and the Entscheidungsproblem | 432 | |
| Exercises | 433 | ||
| 20 | Decidable and Semidecidable Languages | 435 | |
| 20.1 | D: The Big Picture | 435 | |
| 20.2 | SD: The Big Picture | 435 | |
| 20.3 | Subset Relationships between D and SD | 437 | |
| 20.4 | The Classes D and SD Under Complement | 438 | |
| 20.5 | Enumerating a Language | 440 | |
| 20.6 | Summary | 444 | |
| Exercises | 445 | ||
| 21 | Decidability and Undecidability Proofs | 448 | |
| 21.1 | Reduction | 449 | |
| 21.2 | Using Reduction to Show that a Language is Not Decidable | 452 | |
| 21.3 | Are All Questions About Turing Machines Undecidable? | 466 | |
| 21.4 | Rice's Theorem * | 468 | |
| 21.5 | Undecidable Questions About Real Programs | 472 | |
| 21.6 | Showing That a Language is Not Semidecidable | 474 | |
| 21.7 | Summary of D, SD/D and ØSD Languages | 482 | |
| Exercises | 483 | ||
| 22 | Decidability of Languages That Do Not (Obviously) Ask Questions about Turing Machines* | 487 | |
| 22.1 | Diophantine Equations and Hilbert's 10th Problem | 488 | |
| 22.2 | Post Correspondence Problem | 489 | |
| 22.3 | Tiling Problems | 492 | |
| 22.4 | Logical Theories | 495 | |
| 22.5 | Undecidable Problems about Context-Free Languages | 499 | |
| Exercises | 508 | ||
| 23 | Unrestricted Grammars* | 510 | |
| 23.1 | Definition and Examples | 510 | |
| 23.2 | Equivalence of Unrestricted Grammars and Turing Machines | 516 | |
| 23.3 | Grammars Compute Functions | 518 | |
| 23.4 | Undecidable Problems About Unrestricted Grammars | 521 | |
| 23.5 | The Word Problem for Semi-Thue Systems | 522 | |
| Exercises | 524 | ||
| 24 | The Chomsky Hierarchy and Beyond* | 526 | |
| 24.1 | The Context-Sensitive Languages | 526 | |
| 24.2 | The Chomsky Hierarchy | 539 | |
| 24.3 | Unification Grammars | 540 | |
| 24.4 | Lindenmayer Systems | 544 | |
| Exercises | 553 | ||
| 25 | Computable Functions* | 555 | |
| 25.1 | What is a Computable Function? | 555 | |
| 25.2 | Recursive Function Theory | 565 | |
| 25.3 | The Recursion Theorem and its Use | 573 | |
| Exercises | 580 | ||
| 26 | Summary and References | 581 | |
| PART V: COMPLEXITY | 585 | ||
| 27 | Introduction to the Analysis of Complexity | 586 | |
| 27.1 | The Traveling Salesman Problem | 586 | |
| 27.2 | The Complexity Zoo | 589 | |
| 27.3 | Characterizing Problems | 590 | |
| 27.4 | Measuring Time and Space Complexity | 593 | |
| 27.5 | Growth Rates of Functions | 597 | |
| 27.6 | Asymptotic Dominance | 598 | |
| 27.7 | Algorithmic Gaps | 604 | |
| 27.8 | Examples * | 605 | |
| Exercises | 617 | ||
| 28 | Time Complexity Classes | 621 | |
| 28.1 | The Language Class P | 621 | |
| 28.2 | The Language Class NP | 633 | |
| 28.3 | Does P = NP? | 642 | |
| 28.4 | Using Reduction in Complexity Proofs | 644 | |
| 28.5 | NP-Completeness and the Cook-Levin Theorem | 647 | |
| 28.6 | Other NP-Complete Problems | 656 | |
| 28.7 | The Relationship between P and NP-Complete | 672 | |
| 28.8 | The Language Class Co-NP | 679 | |
| 28.9 | The Time Hierarchy Theorems, EXPTIME, and Beyond | 681 | |
| 28.10 | The Problem Classes FP and FNP | 689 | |
| Exercises | 690 | ||
| 29 | Space Complexity Classes | 695 | |
| 29.1 | Analyzing Space Complexity | 695 | |
| 29.2 | PSPACE, NPSPACE, and Savitch's Theorem | 699 | |
| 29.3 | PSPACE Completeness | 704 | |
| 29.4 | Sublinear Space Complexity | 713 | |
| 29.5 | The Closure of Space Complexity Classes Under Complement | 718 | |
| 29.6 | The Space Hierarchy Theorems | 719 | |
| Exercises | 720 | ||
| 30 | Practical Solutions for Hard Problems | 721 | |
| 30.1 | Approaches | 721 | |
| 30.2 | Randomized Algorithms and the Problem Classes BPP, RP, ZPP | 723 | |
| 30.3 | Heuristic Search | 731 | |
| Exercises | 740 | ||
| 31 | Summary and References | 742 | |
| APPENDICES | 745 | ||
| A | Review of Mathematical Background: Logic, Sets, Relations, Functions, and Proof Techniques | 745 | |
| A.1 | Logic | 745 | |
| A.2 | Sets | 753 | |
| A.3 | Relations | 756 | |
| A.4 | Functions | 769 | |
| A.5 | Closures | 776 | |
| A.6 | Proof Techniques | 779 | |
| A.7 | Reasoning about Programs | 792 | |
| A.8 | A General Definition of Closure * | 800 | |
| Exercises | 804 | ||
| B | The Theory: Working with Logical Formulas | 808 | |
| B.1 | Working with Boolean Formulas | 808 | |
| B.2 | Working with First-Order Formulas: Clause Form and Resolution | 820 | |
| B.3 | Exercises | 833 | |
| C | The Theory: Finite State Machines and Regular Languages | 835 | |
| D | The Theory: Context-Free Languages and PDAs | 839 | |
| D.1 | Proof of the Greibach Normal Form Theorem | 839 | |
| D.2 | Proof that the DCFLs are Closed Under Complement | 846 | |
| D.3 | Proof of Parikh's Theorem | 852 | |
| E | The Theory: Turing Machines and Undecidability | 856 | |
| E.1 | Proof that Nondeterminism Does Not Add Power to Turing Machines | 856 | |
| E.2 | An Analysis of Iterative Deepening | 861 | |
| E.3 | The Power of Reduction | 862 | |
| E.4 | The Undecidability of the Post Correspondence Problem | 864 | |
| F | The Theory: Complexity | 869 | |
| F.1 | Asymptotic Dominance | 869 | |
| F.2 | The Linear Speedup Theorem | 875 | |
| G | Applications: Programming Languages and Compilers | 880 | |
| G.1 | Defining the Syntax of Programming Languages | 880 | |
| G.2 | Are Programming Languages Context-Free? | 883 | |
| G.3 | Designing Programming Languages and Their Grammars | 885 | |
| G.4 | Compilers for Programming Languages | 887 | |
| G.5 | Functional Programming and the Lambda Calculus | 890 | |
| H | Applications: Tools for Programming, Databases and Software Engineering | 899 | |
| H.1 | Proving Correctness Properties of Programs and Hardware | 899 | |
| H.2 | Statecharts: A Technique for Specifying Complex Systems | 910 | |
| H.3 | Model-Based Test Case Generation | 913 | |
| H.4 | Reverse Engineering | 914 | |
| H.5 | Normal Forms for Data and for Querying Relational Data Bases | 916 | |
| I | Applications: Networks | 918 | |
| I.1 | Network Protocols | 918 | |
| I.2 | Modeling Networks as Graphs | 927 | |
| I.3 | Exploiting Knowledge: The Semantic Web | 929 | |
| J | Applications: Security | 948 | |
| J.1 | Physical Security Systems as FSMs | 948 | |
| J.2 | Computer System Safety | 949 | |
| J.3 | Cryptography | 955 | |
| J.4 | Hackers and Viruses | 959 | |
| K | Applications: Computational Biology | 962 | |
| K.1 | A (Very) Short Introduction to Molecular Biology and Genetics | 962 | |
| K.2 | The Sequence Matching Problem | 968 | |
| K.3 | DNA and Protein Sequence Matching Using the Tools of Regular Languages | 970 | |
| K.4 | RNA Sequence Matching and Secondary Structure Prediction Using the Tools of Context-Free Languages | 975 | |
| K.5 | Complexity of the Algorithms Used in Computational Biology | 977 | |
| L | Applications: Natural Language Processing | 978 | |
| L.1 | Morphological Analysis | 978 | |
| L.2 | Part of Speech Tagging | 981 | |
| L.3 | The Grammar of English | 983 | |
| L.4 | Building a Complete NL System | 998 | |
| L.5 | Speech Understanding Systems | 999 | |
| M | Applications: Artificial Intelligence and Computational Reasoning 1004 | ||
| M.1 | The Role of Search | 1006 | |
| M.2 | A Logical Foundation for Artificial Intelligence | 1007 | |
| M.3 | A Rule-Based Foundation for Artificial Intelligence and Cognition | 1022 | |
| N | Applications: Entertainment: Music and Games | 1028 | |
| N.1 | Music 1028 | ||
| N.2 | Classic Games and Puzzles | 1034 | |
| N.3 | Interactive Video Games | 1046 | |
| O | Applications: Using Regular Expressions | 1050 | |
| P | Using Finite State Machines and Transducers | 1054 | |
| P.1 | Finite State Machines Predate Computers | 1054 | |
| P.2 | The Towers of Hanoi: Regular Doesn't Always Mean Tractable | 1058 | |
| P.3 | The Arithmetic Logic Unit (ALU) | 1060 | |
| P.4 | Controlling a Soccer-Playing Robot | 1062 | |
| Q | Applications: Using Grammars | 1065 | |
| Q.1 | Describing Artificial Languages Designed for Person/Machine Interaction | 1066 | |
| Q.2 | Describing Naturally Occurring Phenomena | 1071 | |
| REFERENCES | 1073 | ||
| INDEX | 1085 | ||