如何评估MathML表达式?

问题描述:

鉴于一些MATHML内容:如何评估MathML表达式?

<apply> 
    <eq/> 
    <ci>c</ci> 
    <apply> 
    <plus/> 
    <ci>a</ci> 
    <ci>b</ci> 
    </apply> 
</apply> 

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

我希望评估的MathML和检索结果。有没有办法做到这一点?

+0

我在问这个,因为我不想重新发明轮子。我非常有信心自己编码。不需要的可能实现的建议。 – sep 2010-06-04 10:48:34

+0

无需演示。我只需要评估。 – sep 2010-06-04 10:50:11

+0

任何人都可以推荐一个C/C++数学评估库,即使它不处理MathML,我也可以使用它。 – sep 2010-06-06 08:55:56

MathML具有语义和表示标记。所以用于评估的通用MathML解析器是不可能的。

我不知道一个实际的实现,有些快速谷歌搜索没有找到任何合理的结果,但它基本上归结为写你的波兰语表达式解释器(如你给的例子是用波兰语表示)。步骤:

  1. 得到一个XML解析器,并通过树
  2. 如果你遇到一个已知的操作或元素的文档中读取
  3. 散步,突然它一个堆栈
  4. 的子表达式完成时,解析它(或者更好:等待整个表达式完成,查找最后的操作,用它的arity规定的参数数量执行它并执行此操作直到没有操作剩余为止)

最后你会在堆栈中得到你的结果。

一种方法是找到一个可以导入mathml的计算机代数系统(CAS)。不幸的是,尽管很多软件导出了mathml,但它几乎没有一个读取它。下面是一些CAS系统的一些相关链接:

CasADi(不是严格意义上的CAS,但可以计算表达式): 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