Automata theory deals with the definitions and properties of
mathematical models of computation. These models play a role in
several areas of computer science. One model, called the *finite
automaton* is used in text processing, compilers and hardware
design. Another model, called the *context-free grammar* (which
is equivalent to *pushdown automaton*), is used in programming
languages and artificial intellegience. Yet another model, called
Turing machine, is used in formalizing the notion of
computability. The Church-Turing thesis states that the intuitive
notion of algorithms is equivalent to Turing machine algorithms,
which makes it possible to establish various undecidablity
results. For instance, it is to be presented in the course that
the halting problem is undecidable.

The course also studies various time complexity results on
algorithms, introducing two important classes of problems
*P* and *NP*.

Automata and Formal Language is an excellent place to begin the study of the theory of computation, allowing practice with mathematical formalism.