whole_func_string: function(expr, context, subIntegral) {
        if(expr.type === 'OperatorNode' && expr.op === '^') {
          if(expr.args[0].type === 'OperatorNode' && expr.args[0].op === '^') {
            return subIntegral(new OperatorNode('^', 'pow', [
              expr.args[0].args[0],
              new OperatorNode('*', 'multiply', [
                expr.args[0].args[1],
                expr.args[1]
              ])
            ]), context, 'removing double exponential');
          }
        }
      }
func_code_string: function(expr, context, subIntegral) {
        if(expr.type === 'OperatorNode' && expr.op === '^') {
          if(expr.args[0].type === 'OperatorNode' && expr.args[0].op === '^') {
            return subIntegral(new OperatorNode('^', 'pow', [
              expr.args[0].args[0],
              new OperatorNode('*', 'multiply', [
                expr.args[0].args[1],
                expr.args[1]
              ])
            ]), context, 'removing double exponential');
          }
        }
      }
func_documentation_string: integral((f(x) ^ g(x)) ^ h(x), x) = integral(f(x) ^ (g(x) * h(x)), x)