From e5649f3dfd6502c33a13a6a62517e7f58651f2b3 Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Fri, 2 Nov 2012 19:34:46 +0100 Subject: [PATCH] Reporter should be silent, as it fails on under-constrained expressions using selectors, lift solveSat to the level of Solvers --- src/main/scala/leon/solvers/Solver.scala | 11 +++++++++++ src/main/scala/leon/synthesis/Heuristics.scala | 4 ++-- src/main/scala/leon/synthesis/Rules.scala | 2 +- src/main/scala/leon/synthesis/SynthesisPhase.scala | 2 +- src/main/scala/leon/synthesis/Synthesizer.scala | 14 +------------- 5 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/scala/leon/solvers/Solver.scala b/src/main/scala/leon/solvers/Solver.scala index d99801323..69551967c 100644 --- a/src/main/scala/leon/solvers/Solver.scala +++ b/src/main/scala/leon/solvers/Solver.scala @@ -22,6 +22,17 @@ abstract class Solver(val reporter: Reporter) extends Extension(reporter) { def solveOrGetCounterexample(expression : Expr) : (Option[Boolean],Map[Identifier,Expr]) = (solve(expression), Map.empty) + def solveSAT(expression: Expr): (Option[Boolean], Map[Identifier, Expr]) = { + solveOrGetCounterexample(Not(expression)) match { + case (Some(true), _) => + (Some(false), Map()) + case (Some(false), model) => + (Some(true), model) + case (None, _) => + (None, Map()) + } + } + def isUnsat(expression: Expr) : Option[Boolean] = solve(negate(expression)) def superseeds : Seq[String] = Nil diff --git a/src/main/scala/leon/synthesis/Heuristics.scala b/src/main/scala/leon/synthesis/Heuristics.scala index 0e39e3f9c..7ad623ec0 100644 --- a/src/main/scala/leon/synthesis/Heuristics.scala +++ b/src/main/scala/leon/synthesis/Heuristics.scala @@ -33,13 +33,13 @@ class OptimisticGround(synth: Synthesizer) extends Rule("Optimistic Ground", syn while (result.isEmpty && i < maxTries) { val phi = And(p.phi +: predicates) - synth.solveSAT(phi) match { + synth.solver.solveSAT(phi) match { case (Some(true), satModel) => val satXsModel = satModel.filterKeys(xss) val newPhi = valuateWithModelIn(phi, xss, satModel) - synth.solveSAT(Not(newPhi)) match { + synth.solver.solveSAT(Not(newPhi)) match { case (Some(true), invalidModel) => // Found as such as the xs break, refine predicates predicates = valuateWithModelIn(phi, ass, invalidModel) +: predicates diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index 213793663..c6371a00e 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -88,7 +88,7 @@ class Ground(synth: Synthesizer) extends Rule("Ground", synth, 50, 0) { val tpe = TupleType(p.xs.map(_.getType)) - synth.solveSAT(p.phi) match { + synth.solver.solveSAT(p.phi) match { case (Some(true), model) => RuleSuccess(Solution(BooleanLiteral(true), Tuple(p.xs.map(valuateWithModel(model))).setType(tpe))) case (Some(false), model) => diff --git a/src/main/scala/leon/synthesis/SynthesisPhase.scala b/src/main/scala/leon/synthesis/SynthesisPhase.scala index f51749d82..2f8dc774e 100644 --- a/src/main/scala/leon/synthesis/SynthesisPhase.scala +++ b/src/main/scala/leon/synthesis/SynthesisPhase.scala @@ -22,7 +22,7 @@ object SynthesisPhase extends LeonPhase[Program, Program] { ) def run(ctx: LeonContext)(p: Program): Program = { - val reporter = new QuietReporter + val reporter = new SilentReporter val mainSolver = new FairZ3Solver(reporter) mainSolver.setProgram(p) diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index 895ec71c4..936862fd4 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -13,7 +13,7 @@ import java.io.File import collection.mutable.PriorityQueue class Synthesizer(val r: Reporter, - solver: Solver, + val solver: Solver, generateDerivationTrees: Boolean, filterFuns: Option[Set[String]], firstOnly: Boolean, @@ -70,18 +70,6 @@ class Synthesizer(val r: Reporter, bestSolutionSoFar() } - def solveSAT(phi: Expr): (Option[Boolean], Map[Identifier, Expr]) = { - solver.solveOrGetCounterexample(Not(phi)) match { - case (Some(true), _) => - (Some(false), Map()) - case (Some(false), model) => - (Some(true), model) - case (None, _) => - println("WOOPS: failure on "+phi) - (None, Map()) - } - } - val rules = Rules.all(this) ++ Heuristics.all(this) import purescala.Trees._ -- GitLab