我正在寻找一种简单的方法来为数学表达式分配一个数字,例如 0 到 1 之间的数字,以表达该表达式的简化程度(1 表示完全简化)。例如:
eval('x+1')
应返回 1。eval('1+x+1+x+x-5')
应该返回一些小于 1 的值,因为它远非简单>(即可以进一步简化)。
eval()
的参数可以是字符串或抽象语法树 (AST)。
我想到的一个简单的想法是计算运算符的数量(?)
编辑:让简化相当于系统与问题解决方案的接近程度。例如,给定一个代数问题(即极限、导数、积分等),它应该分配一个数字来告诉它与解的接近程度。
我能想到的最接近的比喻是数学教授如何看待一个不完整的问题并对其进行心理评估,以判断学生与解决方案的接近程度。就像数学考试一样,如果学生没有完成一道20分的题,但教授在20分中分配了8分。为什么他会得出8/20,我们可以编写这样的东西吗?
最佳答案
我将打破堆栈溢出规则并将其作为答案而不是评论发布,因为我不仅非常确定答案是你不能(至少,不是你想象的那样),还因为我相信它在一定程度上可以具有教育意义。
假设可以建立一个简单性标准(类似于 normal form )。在我看来,您非常接近于尝试解决类似于 entscheidungsproblem 的问题。 或 halting problem 。我怀疑在典型代数所需的复杂规则系统中,您是否可以找到一种方法,对一系列项约简的步数给出正确且明确的答案(事实上/em> 任意长度的计算)但没有实际执行。这样的答案意味着提前知道这样的计算是否可以终止,因此与以下事实相矛盾:对于任何能够表示算术的足够强大的逻辑,自动定理证明是undecidable problem .
在给定的示例中,教师实际上要么在心里执行计算(一步一步进行,应用他自己的规则序列),要么根据他的经验给出估计。但是,没有通用算法可以保证他的步骤序列是最简单的,也没有他的结果表达式是最简单的(除了琐碎的表达式),因此任何对“距离”的量化都是解决方案没有意义。
这一切难道不是真的吗,你的问题很简单:你知道步数,你知道到目前为止你已经走了多少步,你用后者除以前者;-)
现在,回到简单的标准,我还建议您take a look上Hilbert's 24th problem ,专门寻找“简单性标准,或某些证明的最大简单性的证明。”,以及稍微相关的 proof compression 。如果您在哲学上倾向于进一步理解这些主题,我建议您阅读经典Gödel, Escher, Bach .
进一步说明:要了解原因,请考虑一个名为 Mandelbrot fractal set 的著名数学制品。 。每个像素颜色的计算方法是确定任何特定 c
的方程 z(n+1) = z(n)^2 + c
的解是否有界,即是,“复数 c
是 Mandelbrot 集合的一部分,如果以 z(0) = 0
开始并重复应用迭代时,绝对值无论 n
变得多么大,z(n)
的值仍然有界。” 尽管方程非常简单(你知道,对一个数求平方并对一个常数求和),绝对没有办法知道它是否会保持有界,如果没有实际执行无限次迭代或直到找到一个循环(忽略复杂的启发式)。从这个意义上说,每个分形都有一个粗略近似,通常使用逃逸时间算法作为启发式,以提供有根据的猜测是否解是否有界。
关于math - 如何定量测量数学表达式的简化程度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25437779/