Preface to the First Edition Preface to the Second Edition Introduction 1 Sets, Relations, and Languages 1.1 Sets 1.2 Relations and functions 1.3 Special types of binary relations 1.4 Finite and infinite sets 1.5 Three fundamental proof techniques 1.6 Closures and algorithms 1.7 Alphabets and languages 1.8 Finite representations of languages References
2 Finite Automata 2.1 Deterministic finite automata 2.2 Nondeterministic finite automata 2.3 Finite automata and regular expressions 2.4 Languages that are aJnd are not regular 2.5 State minimization 2.6 Algorithmic aspects of finite automata References
3 Cootext-free Languages 3.1 Context-free grammars 3.2 Parse trees 3.3 Pushdown automata 3.4 Pushdown automata and context-free grammars 3.5 Languages that are and are not context-free 3.6 Algorithms for context-free grammars 3.7 Determinism and parsing References
4 Turing machines 4.1 The definition of Turing machines 4.2 Computing with Turing machines 4.3 Extensions of Turing machines 4.4 Random access Turing machines 4.5 Nondeterministic Turing machines 4.6 Grammars 4.7 Numerical functions References
5 Undecidability 5.1 The Church-Turing thesis 5.2 Universal Turing machines 5.3 The halting problem 5.4 Unsolvable problems about Turing machines 5.5 Unsolvable problems about grammars 5.6 An unsolvable tiling problem 5.7 Properties of recursive languages References
6 Computational Complexity 6.1 The class P 6.2 Problems, problems 6.3 Boolean satisfiability 6.4 The class NP References
7 NP-completeness 7.1 Polynomial-time reductions 7.2 Cook's Theorem 7.3 More NP-complete problems 7.4 Coping with NP-comp1eteness References Index