在使用完整的 Rosette 语言时,有哪些方法可以识别未提升的 Racket 结构?

What are the ways to identify unlifted Racket constructs while using the full Rosette language?

我在使用 Rosette is using unlifted Racket constructs 以不安全的方式实现程序合成器时犯下的最常见错误之一,使合成器输出 (unsat)

事实上,作为 Rosette 程序员的初学者,很难确定可能导致问题的未提升的 Racket 构造。我认为 DrRacket 可能会有所帮助,例如,通过不显示从 #lang rosette 行到未提升的 Racket 结构(例如 assv)的箭头,但事实并非如此,即它是向未提升的(例如 assv)和提升的运算符(例如 first)显示箭头。

我一直在使用两种策略,(i) 在 rosette/safe 中构建综合代码,然后我可以切换到完整的语言,这很不方便,因为我不能使用更新和更高级的 Racker构造,以及 (ii) 浏览我在代码中使用的构造并检查它们是否是 rosette/base/base.rkt 的 "provided",这很烦人。

经验丰富的 Rosette 程序员有什么建议吗?

一种方法是在 rosette/safe 中开始编程,然后根据需要从 Racket 中明确要求您需要的结构。然后,如果出现问题,就可以更容易地找出他们在何时何地发生的事情。

因此,例如,您的代码将如下所示:

   #lang rosette/safe

   (require (only-in racket for assv))

随着代码库的增长,您还可以将所有这些导入收集到一个导出它们的模块中。然后,您的其余代码将需要该模块,它将充当您的自定义版本 rosette/safe 加上您需要的最少量 Racket 构造。