> 1\. Mathematical functions such as exp and sin. We need the deep embedding to > do simplifications like exp(ln(x)) = x but that limits us to the functions > hardcoded in the code. Or perhaps we could use something like this to let the > user define their own types along with a seq of simplification rules. Let's > say someone created a library with a lot of functions this way for the > symbolic library. Could the end-user then import the function-library and use > the function-kinds defined there along with the default ones? Say someone > writes a library with Bessel functions and they want to use them along with > the sin and cos that comes by default.
This is a simplification pass in a compiler. You take the AST and if it matches a simplification that the compiler recognized you merge the nodes.