Mutation
replace_symbol traverses an expression and substitutes one exact identifier with another. It preserves all operators and constants and returns a new expression tree.
No random mutation rate, subtree replacement, constant perturbation, or semantic-validity filter is implemented by this utility.