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