This is a text for a first undergraduate theory course in Computer Science. It covers Turing machines and the definition of computability, unsolvable problems including the Halting problem, languages and grammars, Finite State machines, and computational complexity including the P versus NP question.
The approach is mathematical, with formal definitions and proofs. But the pedagogy is liberal, emphasizing naturalness and making connections with other subjects, which encourages students to be active learners and to reflect on the results.
There are more than eight hundred exercises, many illustrations, and many links for further reading. It is supported by a complete Answers to Exercises and classroom projection slides.