At the completion of the course, you should be able to:
1. Convert between finite automata, regular grammars, and regular
expression representations of regular languages.
2. Apply the pumping lemma for regular languages to determine if a
language is regular.
3. Convert between grammars and push-down automata for context-free
languages.
4. Determine if a language is regular or context-free.
5. Demonstrate that a grammar is ambiguous.
6. Translate a context-free grammar from one form to another.
7. Produce simple programs for a Turing Machine.
8. Explain the concept of undecidability.
9. List examples of undecidable problems.