Rewriting is done through rulebases of rewrite rules that are user extensible.
An example predefined rule is:
factor; X*Y + X*Z => X*(Y+Z).
Rules are predefined, but essentially nothing is fixed in the system.
Rules are predefined and are loaded on demand.
For example:
a*b+a*c with factor.would both load the factor rulebase and factor the expression.
Properties of operators can be (re)declared (commutativity, associativity, and operator commuting diagrams).