2014-04-17 87 views
1

對這個問題的模糊性抱歉,也許我想要一個不同的交流?不確定。無論如何,在這裏:如何確定兩個數學表達式是否「相同」?

我想能夠確定兩個數學表達式是否'相同'。我不需要完整的等價測試,我知道這是不可能的。基本上,我想做出類似如下的功能:

areTheSame(表達式1,表達式2,[測試方法])

其中[測試方法]可能包括:「精確」,「允許可交換」 「允許分配」,...

  • 「精確」會很容易:表達式==表達式2,如果他們的字符串 正好等於
  • 「允許交換性」會比較困難。例如,如果 表達式1是y = 3 * x且表達式2是y = x * 3,那麼在'允許 交換性'下,它們將是相同的。這裏同樣是'y = x'和'x = y'。
  • 'allow distribution'將允許'y = 2 *(x-3)'等於 'y = 2 * x-6'。
  • 其他?

理想情況下,我想懶惰!我很想找到

  1. 支持從乳膠表示解析表達式一些庫(或MATHML,這是XML已經,也許它更容易解析)
  2. 支持等價一些標誌或東西, 管理測試如上所述,比較應該如何精確。
  3. 是用c或C++(或Objective-C - 這是iOS項目)編寫的
  4. 不是GPL。

4規則出SymbolicC++和GiNaC afaik。 Mathomatic是LGPL,我不確定在蘋果的應用程序商店(我真的不想放棄目標文件)的背景下

任何想法?謝謝!

回答

1

這可能不是答案,但評論太長。 :)

我的第一個想法:這不是一個簡單或常見的問題,所以你可能沒有太多的運氣找到一個圖書館來爲你做。另一方面,尋找一個能夠完成一些非關鍵部分的圖書館應該不困難。

你可能想要做的就是解析表達式來創建一個abstract syntax tree(你可能會找到很多庫),然後遞歸地分析AST來測試你所追求的同一性的定義。

在iOS中,使用NSExpressionNSPredicate可能是一個體面的開始(可怕的ab)。這些構造函數方法解析字符串並返回表達式和謂詞對象的結構。

遞歸地走那個結構。對於每個謂詞,請檢查predicateOperatorType是否匹配...如果沒有,謂詞不一樣。如果是,請查看左側的謂詞leftExpression和右側的謂詞leftExpression。每個表達式都有一個function,告訴你它的操作符是什麼(加,減等)。如果它們不匹配,則表達式不一樣。 (對另一側進行同樣的檢查。)如果他們這樣做,遞歸:查看每個表達式的子表達式,並執行類似的檢查,等等,直到獲得常量值或變量的表達式。

這是關於如何查看兩個謂詞(及其包含的表達式)「匹配」的粗略草圖。對於「排序相同」,只需放鬆每次檢查時遞歸地走樹和/或添加更多檢查;例如如果遇到函數爲add的表達式,請通過將其子表達式與其他謂詞中的相應表達式進行比較來檢查交換性。 (另外,可能還有其他庫可以解析基本的數學表達式,併爲您提供AST,無論您喜歡,您都可以走路。)

這仍然不會讓您獲得一切 - 「允許分配」獲取你進入了全面的CAS軟件領域。也許看看Wolfram Alpha是否有Web服務API?

相關問題