像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

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

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