2010-06-04 96 views
6

鑑於一些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

回答

3

MathML具有語義和表示標記。所以用於評估的通用MathML解析器是不可能的。

我不知道一個實際的實現,有些快速谷歌搜索沒有找到任何合理的結果,但它基本上歸結爲寫你的波蘭語表達式解釋器(如你給的例子是用波蘭語表示)。步驟:

  1. 得到一個XML解析器,並通過樹
  2. 如果你遇到一個已知的操作或元素的文檔中讀取
  3. 散步,突然它一個堆棧
  4. 的子表達式完成時,解析它(或者更好:等待整個表達式完成,查找最後的操作,用它的arity規定的參數數量執行它並執行此操作直到沒有操作剩餘爲止)

最後你會在堆棧中得到你的結果。

0

一種方法是找到一個可以導入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