¿Cómo evaluar expresiones MathML?

Dado un cierto contenido de MathML:

  c   a b   

y

 std::map cal; cal["a"] = 1.; cal["b"] = 2.; cal["c"] = 0; // does not matter what c is 

Deseo evaluar el MathML y ​​recuperar los resultados. ¿Hay alguna manera de hacer esto?

MathML tiene marcas semánticas y de presentación. Por lo tanto, un analizador MathML genérico para la evaluación no es posible.

No conozco una implementación real, un rápido Google no encontró ningún resultado razonable, pero básicamente se reduce a escribir su intérprete de expresión en polaco (ya que el ejemplo que dio está en notación polaca). Los pasos:

  1. obtener un analizador XML y leer en el documento
  2. caminar a través del árbol
  3. Si encuentra una operación o elemento conocido, colóquelo en una stack
  4. cuando se complete la subexpresión, analícela (o mejor: espere a que termine la expresión completa, busque la última operación, realice la cantidad de argumentos que su aridad prescribe y realice esto hasta que no quede ninguna operación)

Al final tendrás tu resultado en la stack.

Una forma es encontrar un sistema de álgebra computacional (CAS) que pueda importar mathml. Desafortunadamente, mientras una gran cantidad de software exporta mathml, casi ninguno lo lee. Aquí hay algunos enlaces relacionados para algunos sistemas cas:

CasADi (no es estrictamente un CAS, pero puede evaluar expresiones): https://sourceforge.net/apps/trac/casadi/ticket/149

sympy: http://code.google.com/p/sympy/issues/detail?id=2971

matlab / mupad: http://www.mathworks.nl/help/toolbox/mupad/generate/MathML.html