我正在开发一种受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的一部分。
根据这份文档,你的假设是正确的。有一组用于操作表达式的规则。简化时使用了一个启发式质量指标作为目标函数。