像Wolfram Alpha或Mathematica这样的系统是如何解方程的?

我正在开发一种受Prolog和Haskell启发的基于网络的编程语言(别笑)。

它已经具备了相当多的功能,你可以在http://www.lastcalc.com/查看原型。你可以在这里查看源代码这里,并在这里阅读关于架构的说明这里。请记住,这只是一个原型。

目前,LastCalc无法简化表达式或解方程。我不想在Java中硬编码这些功能,而是希望增强基本语言,使其能够仅使用语言本身就扩展到执行这些操作(就像Prolog一样)。与Prolog不同,LastCalc具有更强大的搜索算法,Prolog是“带回溯的深度优先搜索”,而LastCalc目前使用的是启发式最佳优先搜索。

在深入研究这个问题之前,我想更多地了解其他系统是如何解决这个问题的,特别是Mathematica / Wolfram Alpha。

我假设,至少在一般情况下,做法是给系统提供一组用于操作方程的规则(例如a*(b+c) = a*b + a+c),指定目标(例如隔离变量x),然后让系统自由运行。

所以,我的疑问是:

  • 我的假设正确吗?
  • 应用规则的搜索策略是什么?例如深度优先、广度优先、带迭代加深的深度优先,还是某种最佳优先?
  • 如果是“最佳优先”,使用什么启发式来判断应用特定规则是否更接近我们的目标?

我也很乐意接受其他建议(除了“放弃”——我经常忽略这个建议,这样做对我很有帮助 😉 )。


回答:

我之前也处理过类似的问题。后来我找到了这份文档,关于表达式的简化。该文档标题为《基于规则的表达式简化》,展示了Mupad中简化的某些细节,Mupad后来成为了Matlab的一部分。

根据这份文档,你的假设是正确的。有一组用于操作表达式的规则。简化时使用了一个启发式质量指标作为目标函数。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注