But the latter is easier and more natural for us to use. So a front-end parser is provided, which parses your natural input and converts it to the internal representation. Other expressions may simply evaluate to themselves. Next, the expression resulting from this evaluation is simplified. Again, built-in expression types are programmed with ways to simplify themselves or their arguments.
Simplification is the most difficult and important step of a symbolic math system.
There are two basic approaches. This sort of hard-coded simplification is very efficient, which is one reason why Pythonica is so fast. But it is rather inflexible, difficult to extend, and may be prone to programming errors. The other approach to simplification is to provide tables of transformation rules. When a matching rule is found, it is applied, and the process repeats until no more mathes are found.