This course introduces formal models of computation including finite automata, regular languages, context-free grammars, and Turing machines. These models provide a mathematical basis for the study of computability - the study of what problems can be solved and what problems cannot be solved. Applications to compiler design and program verification will also be covered.We all have problems. Some problems are easier to solve than others; some are unsolvable. But what is a problem? And what is a solution? In this course, we will develop models of computation that make rigorous the idea of problem and solution. In other words, we will provide a language to describe computation so we can reason about it formally. The models we will develop are easy to describe (think flow charts for toasters and elevators), yet computationally very powerful (we can, for example, use them to find the minimal mileage route for the Williamstown snowplow fleet). The rewarding part is understanding the limitations and power of each model.
Ten homework assignments each worth 5% of your grade. I'll drop the lowest score expecting this covers all extenuating circumstances such as illness and natural disasters. Six pop quizzes (lowest score dropped), each contributing 1% to your grade; a take-home midterm worth 25% of your grade and a 24-hour, cumulative final worth another 25% of your grade.Some points of clarification:
- 5: The solution is clear and correct. This solution would easily find a home in a research article.
- 4: The solution contains a few mistakes, but they are mostly arithmetic or of little significance to the overall argument.
- 3: The solution hits on the main points, but has at least one logical gap.
- 2: The solution contains several logical mistakes, but parts of it are salvageable.
- 1: The solution is just plain wrong.
- 0: No attempt is made at solving the problem.