Recursive Program Synthesis from Sketches and Mixed-Quantifier Properties
本文介绍了 Cataclyst,一种新型的反例引导枚举合成工具,它利用草图(sketching)、句法约束学习和预防性剪枝,成功地从混合量词一阶逻辑属性中合成递归程序,解决了 60 个基准测试中的 59 个,并显著优于现有方法。
原始论文采用 CC BY 4.0 许可(http://creativecommons.org/licenses/by/4.0/)。 这是对下方论文的AI生成解释。它不是由作者撰写或认可的。如需技术准确性,请参阅原始论文。 阅读完整免责声明
想象一个这样的世界:你可以准确地描述你想要计算机程序做的事情——比如“这个函数必须对列表进行排序,且不能删除任何数字”——然后机器会立即为你编写出完美的代码。这个梦想被称为程序合成(program synthesis),它处于计算机科学与逻辑学的交汇点。要理解它是如何工作的,可以把它想象成一场非常严格的“填词游戏(Mad Libs)”。你不是仅仅用随机的词语填充空格,而是得到一个部分的故事(称为草图/sketch),其中带有空白槽,以及一套最终故事必须遵守的规则(称为属性/properties)。计算机的任务是找出应该在空格中填入什么词,才能使故事通顺且符合规则。困难之处在于,填充这些空格的可能方式是无限的,就像试图在一片每次你转头时都会不断扩大的沙滩上寻找一颗特定的沙粒。如果计算机尝试逐一测试每一种可能性,将会耗费无穷的时间。这就是为什么研究人员一直在寻找更聪明的“剪枝(prune)”方法,帮助计算机在尝试错误想法之前就将其跳过。
这篇论文介绍了一种解决这一谜题的新颖且聪明的方法,特别针对那些会调用自身(递归程序)且具有涉及“对于所有(for all)”和“存在(there exists)”语句等复杂规则的程序。作者 Derek Egolf 和 Stavros Tripakis 构建了一个名为 CATACLYST 的工具,它扮演着一名超级聪明的侦探的角色。CATACLYST 并没有盲目地猜测每一种代码组合,而是使用了一种称为**反例引导合成(counterexample-guided synthesis)**的策略。过程是这样的:该工具选取一个候选程序并检查它是否有效。如果程序失败了,该工具不仅仅是说“错了”然后继续,它还会追问:“为什么会失败?”并从这次错误中吸取教训。它会创建一个规则,声明:“永远不要再犯这种特定的错误”,从而有效地切断了搜索树中的巨大分支,使计算机不再浪费时间在这些分支上。
论文提出了两种让这种学习过程变得极其高效的主要技巧。第一种是反例泛化(counterexample generalization)。想象一下,你试图搭建一座积木塔,但由于你在不稳固的底座上放了重物,塔倒塌了。一个简单的学习者可能会说:“不要把那个重物放在那里。”但一个聪明的学习者会说:“在这种特定的模式下,不要在任何不稳固的地方放置任何重物。”该工具通过分析程序失败的原因(例如,当函数接收到错误输入时的契约违规,或输出结果错误的属性违规)来生成一条广泛的规则,以阻止类似的失败。第二种技巧是预防性剪枝(prophylactic pruning)。这就像是在出门前检查你的着装。你不是穿好整套衣服,走到外面,然后才发现自己穿错了袜子;而是在穿衣服的过程中就在检查袜子。该工具在填充草图中的空格时就会检查规则,如果一个部分解已经注定失败,它会立即停止,而不是等到整个程序构建完成才去拒绝它。
该方法的结果非常令人印象深刻。作者在 60 个基准测试集(一组测试问题)上测试了 CATACLYST。当同时开启泛化和预防性剪枝这两项技巧时,该工具成功解决了 60 个中的 59 个,且每个问题的处理时间都不超过 2 分钟。当他们关闭泛化技巧时,该工具解决的问题减少了;而当他们关闭预防性剪枝时,解决的问题甚至更少。这表明这两种技术对于该工具的成功都是至关重要的。论文还指出,虽然存在另一个可以处理类似复杂规则的工具,但它不支持这里使用的“草图法(sketching)”,因此无法进行直接的正面交锋,但新工具在它能运行的基准测试中表现优于那个工具。最终,这篇论文表明,通过从错误中学习并及早检查错误,我们可以教计算机比以前更快地编写复杂的、具有自我纠错能力的程序。
您所在领域的论文太多了?
获取与您研究关键词匹配的最新论文每日摘要——附技术摘要,使用您的语言。