Rubi is a Mathematica package that uses an extensive system of symbolic integration rules to find optimal antiderivatives for large classes of mathematical expressions. Also Rubi can show the rules and intermediate steps it uses to integrate an expression, making the system a great tool for both learning and doing mathematics.
Citation:
@article{Rich2018, title = {Rule-based integration: An extensive system of symbolic integration rules}, author = {Albert Rich and Patrick Scheibe and Nasser Abbasi}, doi = {10.21105/joss.01073}, date = {2018-12}, publisher = {The Open Journal}, volume = {3}, number = {32}, pages = {1073}, journal = {Journal of Open Source Software} }