diff --git a/src/main/scala/leon/evaluators/AbstractEvaluator.scala b/src/main/scala/leon/evaluators/AbstractEvaluator.scala index f86f5389a79751524b9b61e60dd8b7b804df8ee1..23236cb7317ecc048271094f092109722a09f889 100644 --- a/src/main/scala/leon/evaluators/AbstractEvaluator.scala +++ b/src/main/scala/leon/evaluators/AbstractEvaluator.scala @@ -58,7 +58,7 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu case Some(Some((c, mappings))) => e(c.rhs)(rctx.withNewVars(mappings), gctx) case _ => - throw RuntimeError("MatchError: "+rscrut.asString+" did not match any of the cases :" + cases) + throw RuntimeError("MatchError(Abstract evaluation): "+rscrut.asString+" did not match any of the cases :\n" + cases.mkString("\n")) } case FunctionInvocation(tfd, args) => @@ -80,7 +80,11 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu (functionInvocation(tfd.fd, evArgsValues), functionInvocation(tfd.fd, evArgsOrigin)) } else { val body = tfd.body.getOrElse(rctx.mappings(tfd.id)) - e(body)(frame, gctx) + try { + e(body)(frame, gctx) + } catch { + case e: RuntimeError => (functionInvocation(tfd.fd, evArgsValues), functionInvocation(tfd.fd, evArgsOrigin)) + } } } callResult diff --git a/src/main/scala/leon/synthesis/ExamplesFinder.scala b/src/main/scala/leon/synthesis/ExamplesFinder.scala index fef98f7d79920b9edcca0e0375a84f253b2f79c6..1c562d887c4338e1db90fee5af8c98c0e011bac6 100644 --- a/src/main/scala/leon/synthesis/ExamplesFinder.scala +++ b/src/main/scala/leon/synthesis/ExamplesFinder.scala @@ -18,6 +18,8 @@ import solvers.z3._ class ExamplesFinder(ctx0: LeonContext, program: Program) { lazy val evaluator = new DefaultEvaluator(ctx, program) + + lazy val abstractEvaluator = new AbstractEvaluator(ctx, program) implicit val ctx = ctx0 @@ -160,6 +162,15 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) { consolidateTests(allTests) } + + private def expand(e: Expr): Expr= { + abstractEvaluator.eval(e) match { + case EvaluationResults.Successful((res, a)) => res + case _ => e + } + } + + private def expand(e: (Expr, Expr)): (Expr, Expr) = (expand(e._1), expand(e._2)) /** Processes ((in, out) passes { * cs[=>Case pattExpr if guard => outR]*/ @@ -177,7 +188,7 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) { // The pattern as expression (input expression)(may contain free variables) val (pattExpr, ieMap) = patternToExpression(cs.pattern, in.getType) val freeVars = variablesOf(pattExpr).toSeq - if (exists(_.isInstanceOf[NoTree])(pattExpr)) { + val res = if (exists(_.isInstanceOf[NoTree])(pattExpr)) { reporter.warning(cs.pattern.getPos, "Unapply patterns are not supported in IO-example extraction") Seq() } else if (freeVars.isEmpty) { @@ -194,8 +205,6 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) { None }) getOrElse { - // If the input contains free variables, it does not provide concrete examples. - // We will instantiate them according to a simple grammar to get them. if(this.keepAbstractExamples) { cs.optGuard match { case Some(BooleanLiteral(false)) => @@ -206,6 +215,8 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) { Seq((Require(pred, pattExpr), cs.rhs)) } } else { + // If the input contains free variables, it does not provide concrete examples. + // We will instantiate them according to a simple grammar to get them. val dataGen = new GrammarDataGen(evaluator) val theGuard = replace(Map(in -> pattExpr), cs.optGuard.getOrElse(BooleanLiteral(true))) @@ -219,6 +230,8 @@ class ExamplesFinder(ctx0: LeonContext, program: Program) { } } } + + if(this.keepAbstractExamples) res.map(expand) else res } }