2014-09-25 58 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