"Introduction to Languages and the Theory of Computation" is an introduction to the theory of computation that emphasizes formal languages, automata and abstract models of computation, and computability; it also includes an introduction to computational complexity and NP-completeness. Through the study of these topics, students encounter profound computational questions and are introduced to topics that will have an ongoing impact in computer science. Once students have seen some of the many diverse technologies contributing to computer science, they can also begin to appreciate the field as a coherent discipline. A distinctive feature of this text is its gentle and gradual introduction of the necessary mathematical tools in the context in which they are used. Martin takes advantage of the clarity and precision of mathematical language, but also provides discussion and examples that make the language intelligible to those just learning to read and speak it. The material is designed to be accessible to students who do not have a strong background in discrete mathematics, but it is also appropriate for students who have had some exposure to discrete math, but whose skills in this area need to be consolidated and sharpened.
I Mathematical Notation and Techniques 1 Basic Mathematical Objects 2 Mathematical Induction and Recursive Definitions II Regular Languages and Finite Automata 3 Regular Expressions and Finite Automata 4 Nondeterminism and Kleene's Theorem 5 Regular and Nonregular Languages III Context-Free Languages and Pushdown Automata 6 Context-Free Grammars 7 Pushdown Automata 8 Context-Free and Non-Context-Free Languages IV Turing Machines and Their Languages 9 Turing Machines 10 Recursively Enumerable Languages V Unsolvable Problems and Computable Functions 11 Unsolvable Problems 12 Computable Functions VI Introduction to Computational Complexity 13 Measuring and Classifying Complexity 14 Tractable and Intractable Problems