One of the most important concepts of the theory of computation is universality. A universal computer is usually defined as an abstract machine that can mimic the computations of any other abstract machine in a certain well-defined class. However, the significance of universality lies in the fact that universal computers, or at least good approximations to them, can actually be built, and can be used to compute not just each other’s behaviour but the behaviour of interesting physical and abstract entities. The fact that this is possible is part of the self-similarity of physical reality

