Introduction into the Theory of Computation: A Register Machine Approach