我什么时候应该使用 Rosette 的浅嵌入和深度嵌入来进行程序合成?

When should I use Rosette's shallow vs. deep embedding for program synthesis?

Rosette introduce program synthesis using shallow embedding and others using deep embedding 的一些教程。

阅读 Torlak et Bodik 的 "Growing Solver-Aided Languages with ROSETTE" 后,似乎浅嵌入有利于快速原型制作(因为它不需要定义 DSL 和解释器),而深嵌入有利于进行具有更强正确性保证的查询.这是决定使用哪种嵌入的良好经验法则吗?

使用 Rosette 的浅嵌入与深度嵌入进行程序合成的充分理由是什么?

作为一般经验法则,浅嵌入最适合使用求解器搜索程序处理的值的应用程序,这是程序验证和天使执行的典型情况。

如果您正在进行程序综合和搜索(代表的值)代码,那么深度嵌入是最佳选择。

如果您的应用程序仅搜索常量,浅嵌入可能是程序综合的不错选择。但是,如果您要搜索更复杂的内容(例如,表达式或语句),深度嵌入是可行的方法。

使用浅嵌入,您对 Rosette 将搜索的 space 程序的控制有限。基本上,您只能使用 Rosette 的基于宏的草图构造进行编码的任何内容。这些允许您定义基本搜索 space 并编写快速原型,但如果您想构建一个可扩展的工具,您将需要严格控制搜索 space。

通过深度嵌入,您可以完全控制 space 将要搜索的程序。本质上,您可以编写任意 Rosette / Racket 函数来生成代表所有要搜索的具体程序的符号程序。然后,您还可以完全控制最后一步,即代码生成。一旦 Rosette returns 表示深度嵌入中程序的值(例如,AST),您就可以根据需要生成代码来处理它。对于浅嵌入,您只能使用 Rosette 的内置代码生成器。

因此,总而言之,如果您正在或计划进行综合,请使用深度嵌入。对于其他一切(验证和天使执行),浅嵌入会更容易和更快。