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), 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.
Here is the breakdown:
Some points of clarification:
I will reward insightful commentary on your thought process. This includes describing what is blocking your progress on a problem you cannot solve. In other words, telling me why and how you got stuck may earn you 1-3 points. Please do this!
- 5: The solution is clear and correct. This solution would easily find a home in a research paper.
- 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.
A few notes on the midterm: