Math 我应该在数学游戏中使用表达式解析器吗?

Math 我应该在数学游戏中使用表达式解析器吗?,math,expression-trees,evaluation,Math,Expression Trees,Evaluation,我正在为班级编写一些儿童数学教育软件 我将尝试以有趣的方式向不同技能水平的学生展示随机生成的不同类型的数学问题 使用基于计算机的数学软件的挫折之一是它的刚性。如果有人上过在线数学课,你就会知道参加在线测验并给出正确答案的挫折感,因为你的问题的格式不正确,或者存在一些奇怪的间距问题 所以,最初我想,“我知道!我会在答案框上使用表达式解析器,这样我就可以计算他们输入的任何内容,即使它们的形式不同,我也可以检查它们是否是相同的答案。”所以我启动IDE并开始实现 这将解决它不取最小形式分数的问题和其他问

我正在为班级编写一些儿童数学教育软件

我将尝试以有趣的方式向不同技能水平的学生展示随机生成的不同类型的数学问题

使用基于计算机的数学软件的挫折之一是它的刚性。如果有人上过在线数学课,你就会知道参加在线测验并给出正确答案的挫折感,因为你的问题的格式不正确,或者存在一些奇怪的间距问题

所以,最初我想,“我知道!我会在答案框上使用表达式解析器,这样我就可以计算他们输入的任何内容,即使它们的形式不同,我也可以检查它们是否是相同的答案。”所以我启动IDE并开始实现

这将解决它不取最小形式分数的问题和其他问题

然而,我突然想到,一个狡猾的学生只需将大部分问题输入答案框,我的表达式解析器就会尽职尽责地解析并计算出正确的答案


那么,我不应该在这个实例中使用表达式解析器吗?我真的需要生成单一形式的答案并进行字符串比较吗?

一种可能的解决方案是,记录表达式计算器计算问题原始表达式的步骤,并将其与最佳答案进行比较。如果差异太大,那么问题没有得到足够的解决,你可以建议学生继续学习


不过,如果学生给出的答案比你自己对“最优”的定义更好,不要感到惊讶!我是几个班级的助教/评分员,最聪明的学生在他们的习题集上的答案通常优于教授提供的答案。

对于需要精确答案的简单问题,删除空白并进行字符串比较是合理的

对于更高级的问题,您可以使用调车场算法(或类似算法),但也可以将其参数化,以便打开/关闭减少,以防止棘手的学生。您会注意到“简单”答案仍然可以使用解析器,但是您会禁用所有的缩减


例如,在除法问题上,您可以禁用“/”减法。

这是一个很好的问题

如果您正在编写一个表达式系统和一个求值/转换/等价引擎(在某个地方没有可用的吗?我几乎100%确定在某个地方有一个开源引擎),这更像是一个教育/代数问题:学生的答案在代数上更接近原始表达式还是预期表达式


我不知道如何回答这个问题,但只是一个想法(不一定实用):也许您的评估引擎可以计算到等价的转换步骤。如果答案达到预期的步骤比达到原始答案的步骤要少,那么答案可能是正确的。如果太接近原始表达式,则不是。

您可以使用表达式解析器,但对答案中允许的表达式的复杂性施加限制

例如,如果目标是减少(4/5)*(1/2),并且您希望允许(2/5)或(4/10),则可以将允许的答案集限制为树的形式为(x/y)且计算结果也正确的表达式。也许您还允许使用“0.4”,即(x)形式的表达式,其计算结果为正确的数字


这正是你想要的(暗示的)如果你手动给问题评分,你将寻找一个正确的答案,但也属于可接受的类别。

在数学评估软件中,通常的做法是允许问题设定者指定正确答案中不允许的表达式/字符串


如果您碰巧对现有软件感兴趣,可以使用开源软件栈(或各种商业选项,如MapleTA)。我怀疑您将遇到的大多数问题都是Stack遇到的,因此即使您不想使用它,查看它是如何处理问题的也可能是有教育意义的

多好的问题啊!一定要让我们知道你最后做了什么——我很好奇。你能举一个同样可以作为答案的问题的例子吗?@Greg:他说的是“500/2的价值是多少?”正确的答案是250,但一个有进取心的学生只需在复制粘贴中输入“500/2”即可,表达式计算器将接受它。但可能很难确定何时禁用/减少。例如,如果问题为“1/2+1/4=”则用户可以输入“3/4”