Calculating Solutions of PA Formulas
Project: extend the synthesis algorithm from last time to generate solution enumerators (that are as efficient as possible).
Exercise: Suppose we have a precondition of a function and we wish to test the function for values that satisfy a precondition. We can add some bounds to the precondition and then obtain precondition formula that has finitely many solutions.
As an example, write a compact and efficient enumerator for this constraint:
10x + 6y = a && x >= 0 && y >= 0
where a is a parameter.
A Kaplan program:
for ((p,q) <- ((x,y) => 10x + 6y = a && x >= 0 && y >= 0).findAll) println(p + ", " + q)
It would be good to compile it to something like this code, which is guaranteed top produce a constant amount of work to find each next solution. The question is also whether such compilation is always possible.
if(a % 2 == 0) {
val ap = a/2
val lower = ...
val upper = ...
var k = lower
while (k <= upper)
val p = -5*ap + 3*k
val q = 2*ap - 5*k
println(p + ", " + q)
k = k + 1
}
}
See also the work on UDITA for automated generation of tests the work on Regular Synthesis.