2014-09-25 30 views

回答

0

您將需要一個計算機代數系統(CAS),才能真正測試兩個表達式是否相等。我唯一知道的JavaScript是javascript-cas,我不確定這是否能滿足您的需求。其他庫如math.js和提到的js-expression-eval可以解析表達式,但錯過邏輯來理解兩個表達式是否相等。

一個實用的方法可能是比較兩個表達式的結果對於x的許多不同值,並查看它們是否具有相同的結果。這並不總是奏效,例如0/x+1x-xx給出相同的結果,但它們並不完全相同。

+0

是否有可能通過優先級重新排序由js-expression-eval生成的AST並逐個比較元素?可能會有非常複雜的情況,但我認爲我只需要像「1 + x」==「x + 1」和「1 + 2 * x」==「x * 2 + 1」之類的東西。 – pablo 2014-09-26 05:43:00

+0

我不確定這是否可以用'js-expression-eval'實現,它似乎沒有給出一個節點樹。你可以用math.js做到這一點,例如:運行'math.parse('1 + 2 * x')'返回一個[nodes]的樹(https://github.com/josdejong/mathjs/tree/master/lib/expression/node),因此您可以遍歷所有節點並在需要時對參數進行排序。在這種情況下,根節點將是一個'OperatorNode',它的屬性是'op =='+'','fn =='add'','type ==「OperatorNode」',而'params'是一個包含兩個參數:一個OperatorNode'*'和一個ConstantNode 1,你可以按照類型命令這些參數。 – 2014-09-26 08:02:37

0

如果你需要知道的只是平等,那麼你可以做近似的比較:從表情

  • 你有x+11+x

    1. 提取變量名所以單個變量x

  • genere僞隨機或網格集va梅毒爲他們

    • 使用從-inf到+ INF一些規範點如x = {-1e-10,1E-9,.... 1E + 9,1e + 10}
    • 添加幾個隨機量
  • 解析與當前的變量的每一個表達設置

    • 所以採取第一x值
    • 計算表達式值爲它
    • ,如果它是不一樣的表達式還沒有被同一
  • 嘗試從genered數據的所有情況下被設

    • 如果全部通過,則表達式可能是相同的
    • 如果沒有(即使只是在一個通)則表達式是不一樣的
  • +0

    這會使我的情況變得複雜,並給出誤報。我正在尋找一個真正的比較。 – pablo 2014-09-26 05:43:55

    +0

    @pablo然後你必須從一個表達式中提取變量作爲'x = ???',替換爲另一個表達式,並簡化爲'0 = 0'或者不是......並且這太複雜了... btw你可以通過正確的數據集選擇來限制誤報(例如,如果找到(x-1),則在+1附近添加點...也可以通過第一個和第二個派生來幫助您 – Spektre 2014-09-26 06:59:33