Fundamentals of Computation Theory