Abstraction
Abstraction in Theory of Computation

The concept of Abstraction comes into play in the theory of computation, which is a key element in the study of what computations may be physically carried out.

Abstraction in this context involves removing unnecessary detail to focus on the problem at hand, helping to simplify large, complex problems.

This provides a way to classify computational problems by their level of difficulty and the amount of resources they require.
Levels of Abstraction in Theory of Computation

The machine model level of abstraction emphasises the specific, fundamental operations a computer can perform, such as the Turing Machine. It does not take into account higher level language constructs or conventions.

The programming language level of abstraction focuses on the rules, syntax, and semantics of formal languages that describe calculations. Examples include lambda calculus and logic programming.

The problem abstraction level focuses on the definition of the problem itself, disregarding how the solution is found or implemented. This involves mathematical models generated for computational problems, such as decision problems, function problems, and counting problems.
Importance of Abstraction in Theory of Computation

Abstraction highlights the key problem elements. It simplifies the problem to its most critical parts, filtering out unnecessary detail, making it easier to understand.

Provides a systemwide perspective. This high level view allows for better design decisions when it comes to architecture and system interaction.

Aids in modularity and reuse. Abstraction at the code level promotes reuse and componentisation which are key aspects for software development.
Use of Abstraction in Practice

Understanding computational models: Abstraction is crucial in understanding models like Turing machines, finite automata, and pushdown automata.

Algorithm Design: Abstraction aids in conceptualizing and designing efficient algorithms by focusing on the problem instead of the mechanics of solution implementation.

Software Engineering: Architecting systems involves the abstraction of individual components allowing greater system understanding.
Understanding the principles of abstraction and its use within Theory of Computation is key to navigating complexities of computation and to develop software systems effectively.