One of the most common bugs I make while implementing a program synthesizer with Rosette is using unlifted Racket constructs in an unsafe way that makes synthesizer to output (unsat)
.
In fact, as a beginner Rosette programmer, it is difficult to just pinpoint the unlifted Racket constructs that could be causing problems. I thought DrRacket may be able to help, for example, by not showing the arrows from the #lang rosette
line to the unlifted Racket constructs such as assv
, but it wasn't the case, i.e., it was displaying the arrows to both unlifted (e.g., assv
) and lifted operators (e.g., first
).
I've been using two strategies, (i) building synthesis code in rosette/safe
as far as I can then switch to the full language, which is inconvenient since I can't use newer & fancier Racker constructs, and (ii) skim the constructs I use in my code and check whether they are "provided" by rosette/base/base.rkt
, which is tiresome.
Any suggestions from seasoned Rosette programmers?