diff --git a/src/main/scala/leon/repair/Repairman.scala b/src/main/scala/leon/repair/Repairman.scala index b8214d456ea8e6259e5df7fc4c24e3fc2d7fbed2..43349bffc42ed8c43010db6d249178cb0ecdbbdc 100644 --- a/src/main/scala/leon/repair/Repairman.scala +++ b/src/main/scala/leon/repair/Repairman.scala @@ -65,10 +65,7 @@ class Repairman(ctx: LeonContext, initProgram: Program, fd: FunDef, verifTimeout try { reporter.info(ASCIIHelpers.title("3. Synthesizing repair")) - val (search, solutions) = synth.validate(synth.synthesize()) match { - case (search, sols) => - (search, sols.collect { case (s, true) => s }) - } + val (search, solutions) = synth.validate(synth.synthesize(), allowPartial = false) if (synth.settings.generateDerivationTrees) { val dot = new DotGenerator(search.g) @@ -80,8 +77,8 @@ class Repairman(ctx: LeonContext, initProgram: Program, fd: FunDef, verifTimeout } else { reporter.info(ASCIIHelpers.title("Repair successful:")) - for ((sol, i) <- solutions.zipWithIndex) { - reporter.info(ASCIIHelpers.subTitle("Solution "+(i+1)+":")) + for ( ((sol, isTrusted), i) <- solutions.zipWithIndex) { + reporter.info(ASCIIHelpers.subTitle("Solution "+(i+1)+ (if(isTrusted) "" else " (untrusted)" ) + ":")) val expr = sol.toSimplifiedExpr(ctx, synth.program) reporter.info(expr.asString(ctx)) } @@ -139,7 +136,7 @@ class Repairman(ctx: LeonContext, initProgram: Program, fd: FunDef, verifTimeout val timeoutMs = verifTimeoutMs.getOrElse(3000L) val solverf = SolverFactory.getFromSettings(ctx, program).withTimeout(timeoutMs) val vctx = VerificationContext(ctx, program, solverf, reporter) - val vcs = AnalysisPhase.generateVCs(vctx, Some(Seq(fd.id.name))) + val vcs = AnalysisPhase.generateVCs(vctx, Seq(fd)) try { val report = AnalysisPhase.checkVCs( diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala index 25824923d24572f531395ea6519764a4b491eb7a..717adee7429e629f4f7b4768b380b1a635dcde29 100644 --- a/src/main/scala/leon/synthesis/SynthesisPhase.scala +++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala @@ -77,7 +77,7 @@ object SynthesisPhase extends LeonPhase[Program, Program] { chooses.foreach { ci => val synthesizer = new Synthesizer(ctx, p, ci, options) - val (search, solutions) = synthesizer.validate(synthesizer.synthesize()) + val (search, solutions) = synthesizer.validate(synthesizer.synthesize(), true) try { val fd = ci.fd diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index b5b908394ccd3eaa6b67d5a74dcc97a644927549..dd8e41851dcdf19d38ea79006990781afa68893b 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -48,7 +48,7 @@ class Synthesizer(val context : LeonContext, (s, sols) } - def validate(results: (Search, Stream[Solution])): (Search, Stream[(Solution, Boolean)]) = { + def validate(results: (Search, Stream[Solution]), allowPartial: Boolean): (Search, Stream[(Solution, Boolean)]) = { val (s, sols) = results val result = sols.map { @@ -58,7 +58,7 @@ class Synthesizer(val context : LeonContext, validateSolution(s, sol, 5.seconds) } - (s, if (result.isEmpty) { + (s, if (result.isEmpty && allowPartial) { List((new PartialSolution(s.g, true).getSolution, false)).toStream } else { result @@ -77,7 +77,7 @@ class Synthesizer(val context : LeonContext, try { val vctx = VerificationContext(context, npr, solverf, context.reporter) - val vcs = generateVCs(vctx, Some(fds.map(_.id.name))) + val vcs = generateVCs(vctx, fds) val vcreport = checkVCs(vctx, vcs) if (vcreport.totalValid == vcreport.totalConditions) { diff --git a/src/main/scala/leon/verification/AnalysisPhase.scala b/src/main/scala/leon/verification/AnalysisPhase.scala index 92ae2308d2da1fd33c5e6065b6d2bddc44d94c02..3fbc3671e7b47bfe24392da109f51c3b0b3152e8 100644 --- a/src/main/scala/leon/verification/AnalysisPhase.scala +++ b/src/main/scala/leon/verification/AnalysisPhase.scala @@ -36,25 +36,6 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] { reporter.debug("Generating Verification Conditions...") - try { - val vcs = generateVCs(vctx, filterFuns) - - reporter.debug("Checking Verification Conditions...") - - checkVCs(vctx, vcs) - } finally { - solverF.shutdown() - } - } - - def generateVCs(vctx: VerificationContext, filterFuns: Option[Seq[String]]): Seq[VC] = { - - import vctx.reporter - import vctx.program - - val defaultTactic = new DefaultTactic(vctx) - val inductionTactic = new InductionTactic(vctx) - def excludeByDefault(fd: FunDef): Boolean = fd.annotations contains "library" val fdFilter = { @@ -65,11 +46,29 @@ object AnalysisPhase extends LeonPhase[Program,VerificationReport] { val toVerify = program.definedFunctions.filter(fdFilter).sortWith((fd1, fd2) => fd1.getPos < fd2.getPos) - val vcs = for(funDef <- toVerify) yield { + for(funDef <- toVerify) { if (excludeByDefault(funDef)) { - reporter.warning("Forcing verification of "+funDef.id.name+" which was assumed verified") + reporter.warning("Forcing verification of " + funDef.id.name + " which was assumed verified") } + } + + + try { + val vcs = generateVCs(vctx, toVerify) + + reporter.debug("Checking Verification Conditions...") + + checkVCs(vctx, vcs) + } finally { + solverF.shutdown() + } + } + def generateVCs(vctx: VerificationContext, toVerify: Seq[FunDef]): Seq[VC] = { + val defaultTactic = new DefaultTactic(vctx) + val inductionTactic = new InductionTactic(vctx) + + val vcs = for(funDef <- toVerify) yield { val tactic: Tactic = if (funDef.annotations.contains("induct")) { inductionTactic