What Bugs Do Prolog Students Write? An Empirical Taxonomy and Data-Driven Mutation Framework
本文提出了 LogMorph,这是一个针对 Prolog 的数据驱动型变异框架,它利用包含 7,201 份学生提交作业的经验分类法来生成与实际课堂错误高度匹配的真实合成故障,从而提高逻辑编程教育中自动化反馈工具的有效性。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一下,你正在试图教一个机器人像人类侦探一样思考。你不能只告诉它“解决这桩罪案”;你必须教它那些让线索如何契合在一起的、特定且古怪的逻辑规则。这就是**逻辑编程(Logic Programming)**的世界——一种编写计算机代码的方式,在这里你描述的是“什么是真理”,而不是“如何一步步去做”。这就像是给了你一张城市地图,而不是一份转弯式的驾驶指南。但问题在于,人类是混乱的。当我们尝试学习这些规则时,我们会犯下非常具体且可预测的错误。我们可能会忘记一条规则,混淆两个线索,或者在错误的地方放了一个“停止标志”。
为了构建一个能够修复我们代码的有用的机器人导师,我们需要确切知道我们会犯什么样的错误。如果机器人的练习对象只是随机生成的、虚构的错误,那么当它遇到真正的学生时会感到困惑。这就像是一个驾驶教练只练习处理爆胎的汽车,结果却在学生忘记系安全带时感到措手不及。这篇论文深入探讨了学生错误的混乱现实,旨在为这些 AI 导师建立一个更好的训练场。
伟大的 Prolog 虫子大搜寻
在最近的一项研究中,研究人员决定扮演侦探,但他们寻找的不是罪犯,而是计算机代码中的漏洞(bugs)。他们查看了 265 名正在学习一种叫做 Prolog 的语言的本科生提交的 7,201 份代码。把 Prolog 看作是一种你编写事实和规则列表,然后由计算机得出答案的语言。学生们正在解决各种谜题,从简单的逻辑游戏到最后的项目——他们构建了一个复杂棋盘游戏“星战”(Star Battle)的求解器。
团队不仅统计了有多少程序失败了,他们还想知道为什么。他们挑选了 200 份学生已经修复了错误的提交样本,并手动将这些错误分类到一个“分类法”(taxonomy)中,这只是一个高级的说法,指的是一套详细的归档系统。他们发现,最常见的错误并不是复杂的逻辑错误,而仅仅是工作不完整。大约有 37.5% 的情况下,学生忘记写完整个谜题的一部分,就像故事中缺失了一个章节。接下来的常见错误是使用了错误的成分(20.5%)或将规则中的目标搞混了(13.0%)。有趣的是,他们发现学生很少犯下在其他语言中常见的那些“粗心”的拼写错误;他们的错误往往是对逻辑运作方式的深度误解。
构建“虫子工厂”(LOGMORPH)
了解学生犯了什么错误固然很好,但你如何教计算机去识别它们呢?研究人员构建了一个名为 LOGMORPH 的工具。想象一个工厂,它拿走一个完美的、可以运行的代码片段,并故意将其破坏。
旧的工厂试图随机地破坏东西,比如对着靶板投掷飞镖。它们假设每种类型的破坏都是同样可能的。但 LOGMORPH 不同。它是一个数据驱动型的工厂。它观察研究人员之前建立的真实学生错误“档案柜”,然后说:“好吧,既然学生有 37.5% 的时间会忘记完成他们的代码,那我们就以 37.5% 的频率以这种方式破坏代码。”
该工具分为四个步骤:
- 扫描(Scanning): 它读取完美的代码,并找到每一个可能发生错误的地方。
- 采样(Sampling): 它选择一个位置进行破坏,但它是根据真实的统计数据来选择的。如果“忘记子句”很常见,它就会频繁选择这一项。
- 注入(Injecting): 它实际破坏代码。有时这很简单,比如交换两个数字。有时,它需要发明一段新的代码来插入。为此,它使用一个智能“合成器”(一种类型的 AI)来生成符合规则的新行代码。
- 测试(Testing): 它检查被破坏的代码是否确实无法通过测试。如果“被破坏的”代码仍然能完美运行,它就会丢弃该代码并重新尝试。
结果:近乎完美的镜像
团队运行了这个工厂,创建了 16,000 个虚假的、带有 bug 的程序。然后,他们将这些虚假程序的“错误特征谱”与真实的统计数据进行了对比。结果令人惊讶地接近。对于大多数错误类别,虚假程序与真实数据的误差在 2 个百分点以内。这就像是在照镜子,看到自己的倒影也以完全相同的方式移动。
然而,这面镜子并不完美。研究人员注意到了两个主要的小故障:
- “切断”(Cut)问题: 在 Prolog 中,有一个特殊的符号叫做“切断”(写作
!),它告诉计算机停止寻找其他答案。学生经常在这里出错。但在虚假程序中,这些错误很少见。为什么?因为工厂的“测试”步骤太严格了。如果一个虚假的“切断”没有改变测试结果,工厂就会将其过滤掉。真实的学员可能会犯下一个“切断”错误,虽然这个错误不会导致测试失败,但仍会干扰逻辑,而工厂把这些都过滤掉了。 - “机器人”代码: 当工厂不得不发明新代码(例如添加一个随机的目标)时,“合成器”有时会写出一些技术上正确但听起来像废话的东西。例如,它可能会用数学符号来比较一个空列表和一个变量。没有任何人类学生会写出这样的东西;这看起来就像是一个机器人试图模仿人类说话。研究人员怀疑,如果他们将合成器更换为更先进的、经过学生写作训练的 AI,虚假代码听起来会更加自然。
这意味着什么
这篇论文并不声称已经解决了逻辑编程教学的所有问题。相反,它提供了一种全新的、更好的模拟学生错误的方法。通过使用真实数据来加权错误,LOGMORPH 创建了一个真实的训练场,用于自动化辅导系统。研究人员建议,在未来,将这种数据驱动的方法与更智能的 AI 语言模型相结合,可以使这些训练工具更加栩栩如生,帮助机器人不仅理解学生“错了”,而且理解他们为什么会犯下那个特定的、具有人类特征的错误。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。