在使用Rosette实现程序合成器时,我遇到的最常见错误之一就是使用unlifted Racket constructs的方式不安全,导致合成器输出(unsat)
。
实际上,作为Rosette的初学者,很难仅查明可能引起问题的Racket构造。我认为DrRacket可能会有所帮助,例如,不显示从#lang rosette
线到未抬起的Racket结构(例如assv
)的箭头,但事实并非如此,也就是说,同时向未抬起的箭头(例如assv
)和抬起的运算符(例如first
)显示箭头。
我一直在使用两种策略:(i)在rosette/safe
中构建综合代码,然后我才可以切换到完整语言,这很不方便,因为我不能使用更新和更高级的Racker构造, (ii)略读我在代码中使用的结构,并检查它们是否由rosette/base/base.rkt
“提供”的,这很烦人。
经验丰富的Rosette程序员有何建议?
答案 0 :(得分:3)
一种方法是从rosette/safe
开始编程,然后根据需要从Racket显式地要求您所需的构造。然后,如果出现问题,则更容易找出发生错误的地点和时间。
例如,您的代码如下所示:
#lang rosette/safe
(require (only-in racket for assv))
随着代码库的增长,您还可以将所有这些导入收集到一个导出它们的模块中。然后,您的其余代码将需要该模块,该模块将用作您的rosette/safe
的自定义版本以及所需的最少数量的Racket构造。