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

时间:2018-12-10 03:18:23

标签: racket rosette

在使用Rosette实现程序合成器时,我遇到的最常见错误之一就是使用unlifted Racket constructs的方式不安全,导致合成器输出(unsat)

实际上,作为Rosette的初学者,很难仅查明可能引起问题的Racket构造。我认为DrRacket可能会有所帮助,例如,不显示从#lang rosette线到未抬起的Racket结构(例如assv)的箭头,但事实并非如此,也就是说,同时向未抬起的箭头(例如assv)和抬起的运算符(例如first)显示箭头。

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

经验丰富的Rosette程序员有何建议?

1 个答案:

答案 0 :(得分:3)

一种方法是从rosette/safe开始编程,然后根据需要从Racket显式地要求您所需的构造。然后,如果出现问题,则更容易找出发生错误的地点和时间。

例如,您的代码如下所示:

   #lang rosette/safe

   (require (only-in racket for assv))

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