diff --git a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala index 953afc7b275df4a4aa5cb3f10f106bf8abd34591..d25db6600047ae1f607b7023bf26735a51cb5783 100644 --- a/src/main/scala/leon/synthesis/rules/OptimisticGround.scala +++ b/src/main/scala/leon/synthesis/rules/OptimisticGround.scala @@ -10,57 +10,62 @@ import purescala.Extractors._ case object OptimisticGround extends Rule("Optimistic Ground") { def instantiateOn(sctx: SynthesisContext, p: Problem): Traversable[RuleInstantiation] = { if (!p.as.isEmpty && !p.xs.isEmpty) { - val xss = p.xs.toSet - val ass = p.as.toSet + val res = new RuleInstantiation(p, this, SolutionBuilder.none) { + def apply(sctx: SynthesisContext) = { + val xss = p.xs.toSet + val ass = p.as.toSet - val tpe = TupleType(p.xs.map(_.getType)) + val tpe = TupleType(p.xs.map(_.getType)) - var i = 0; - var maxTries = 3; + var i = 0; + var maxTries = 3; - var result: Option[RuleInstantiation] = None - var continue = true - var predicates: Seq[Expr] = Seq() + var result: Option[RuleApplicationResult] = None + var continue = true + var predicates: Seq[Expr] = Seq() - while (result.isEmpty && i < maxTries && continue) { - val phi = And(p.pc +: p.phi +: predicates) - //println("SOLVING " + phi + " ...") - sctx.solver.solveSAT(phi) match { - case (Some(true), satModel) => - val satXsModel = satModel.filterKeys(xss) + while (result.isEmpty && i < maxTries && continue) { + val phi = And(p.pc +: p.phi +: predicates) + //println("SOLVING " + phi + " ...") + sctx.solver.solveSAT(phi) match { + case (Some(true), satModel) => + val satXsModel = satModel.filterKeys(xss) - val newPhi = valuateWithModelIn(phi, xss, satModel) + val newPhi = valuateWithModelIn(phi, xss, satModel) - //println("REFUTING " + Not(newPhi) + "...") - sctx.solver.solveSAT(Not(newPhi)) match { - case (Some(true), invalidModel) => - // Found as such as the xs break, refine predicates - predicates = valuateWithModelIn(phi, ass, invalidModel) +: predicates + //println("REFUTING " + Not(newPhi) + "...") + sctx.solver.solveSAT(Not(newPhi)) match { + case (Some(true), invalidModel) => + // Found as such as the xs break, refine predicates + predicates = valuateWithModelIn(phi, ass, invalidModel) +: predicates - case (Some(false), _) => - result = Some(RuleInstantiation.immediateSuccess(p, this, Solution(BooleanLiteral(true), Set(), Tuple(p.xs.map(valuateWithModel(satModel))).setType(tpe)))) + case (Some(false), _) => + result = Some(RuleSuccess(Solution(BooleanLiteral(true), Set(), Tuple(p.xs.map(valuateWithModel(satModel))).setType(tpe)))) + + case _ => + continue = false + result = None + } + case (Some(false), _) => + if (predicates.isEmpty) { + result = Some(RuleSuccess(Solution(BooleanLiteral(false), Set(), Error(p.phi+" is UNSAT!").setType(tpe)))) + } else { + continue = false + result = None + } case _ => continue = false result = None } - case (Some(false), _) => - if (predicates.isEmpty) { - result = Some(RuleInstantiation.immediateSuccess(p, this, Solution(BooleanLiteral(false), Set(), Error(p.phi+" is UNSAT!").setType(tpe)))) - } else { - continue = false - result = None - } - case _ => - continue = false - result = None - } + i += 1 + } - i += 1 + result.getOrElse(RuleApplicationImpossible) + } } - - result + List(res) } else { Nil }