This course is intended as an upper-level undergraduate or graduate introduction to theory of computation.
In studying this subject we seek to determine what can and cannot be computed,how quickly, with how much memory, and on which type of computational model. It can be divided into roughly four parts: automata and languages, computability theory, complexity theory, and machine learning theory.