Theory of computation : a problem-solving approach (Wiley, 2015)