如何以编程方式获取公式的派生形式?
How can I get derivative forms of formula programmatically?
例如,如果我有 I = V / R 作为输入,我希望 V = I * R 和 R = V / I 作为输出。我知道这可能是一个广泛的问题,但我应该如何开始呢?我应该像构建后缀 notation/interpreter 时那样使用 stack/tree 吗?
您需要能够用符号表示公式,并应用代数规则来操纵这些公式。
最简单的方法是定义一个语法来接受您的公式;最好明确定义为 BNF。有了它,您就可以为此类公式构建解析器;如果处理得当,您的解析器可以构建表示公式的抽象语法树。您可以使用 lex 和 yacc 或 ANTLR 等工具。这是我关于如何使用自定义递归下降解析器执行此操作的建议:Is there an alternative for flex/bison that is usable on 8-bit embedded systems?.
一旦你有了编码公式的树,你就可以根据代数定律实施程序来修改树,例如:
X=Y/Z => X*Z = Y if Z ~= 0
现在您可以通过编写爬过树的程序代码来实现这样的规则,找到模式的匹配项,然后粉碎树以产生结果。这是非常简单的编译器技术。如果您有热情,您可能很快就能编写出半打代数定律。您会发现执行此操作的代码非常糟糕,包括在树上爬上爬下、匹配节点以及粉碎节点之间的链接以产生结果。
另一种方法是使用程序转换系统,让您
- 直接为您的公式定义语法,
- 直接根据您的语法定义(树)重写规则(例如,基本上您直接提供上面的代数规则),
- 根据需要为您应用重写规则
- 从 AST 重新生成符号公式
我公司的DMS Software Reengineering Toolkit can do this. You can see a fully worked example (too large to copy here) of algebra and calculus at Algebra Defined By Transformation Rules
例如,如果我有 I = V / R 作为输入,我希望 V = I * R 和 R = V / I 作为输出。我知道这可能是一个广泛的问题,但我应该如何开始呢?我应该像构建后缀 notation/interpreter 时那样使用 stack/tree 吗?
您需要能够用符号表示公式,并应用代数规则来操纵这些公式。
最简单的方法是定义一个语法来接受您的公式;最好明确定义为 BNF。有了它,您就可以为此类公式构建解析器;如果处理得当,您的解析器可以构建表示公式的抽象语法树。您可以使用 lex 和 yacc 或 ANTLR 等工具。这是我关于如何使用自定义递归下降解析器执行此操作的建议:Is there an alternative for flex/bison that is usable on 8-bit embedded systems?.
一旦你有了编码公式的树,你就可以根据代数定律实施程序来修改树,例如:
X=Y/Z => X*Z = Y if Z ~= 0
现在您可以通过编写爬过树的程序代码来实现这样的规则,找到模式的匹配项,然后粉碎树以产生结果。这是非常简单的编译器技术。如果您有热情,您可能很快就能编写出半打代数定律。您会发现执行此操作的代码非常糟糕,包括在树上爬上爬下、匹配节点以及粉碎节点之间的链接以产生结果。
另一种方法是使用程序转换系统,让您
- 直接为您的公式定义语法,
- 直接根据您的语法定义(树)重写规则(例如,基本上您直接提供上面的代数规则),
- 根据需要为您应用重写规则
- 从 AST 重新生成符号公式
我公司的DMS Software Reengineering Toolkit can do this. You can see a fully worked example (too large to copy here) of algebra and calculus at Algebra Defined By Transformation Rules