diff --git a/src/main/scala/leon/evaluators/AbstractEvaluator.scala b/src/main/scala/leon/evaluators/AbstractEvaluator.scala index 2e0a7a2bb1959f720e62ab47f4c6783436e4d28b..b528045476adbee75a8e49d0c526c810df49b4b7 100644 --- a/src/main/scala/leon/evaluators/AbstractEvaluator.scala +++ b/src/main/scala/leon/evaluators/AbstractEvaluator.scala @@ -59,16 +59,14 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu /** True if CaseClassSelector(...CaseClass(...)) have to be simplified. */ var evaluateCaseClassSelector = true + /** True if Application(Lambda(), ...) have to be simplified. */ + var evaluateApplications = true protected def e(expr: Expr)(implicit rctx: RC, gctx: GC): (Expr, Expr) = { implicit def aToC: AbstractEvaluator.this.underlying.RC = DefaultRecContext(rctx.mappings.filter{ case (k, v) => ExprOps.isValue(v) }) expr match { case Variable(id) => (rctx.mappings.get(id), rctx.mappingsAbstract.get(id)) match { - case (Some(v), None) if v != expr => // We further evaluate v to make sure it is a value - e(v) - case (Some(v), Some(va)) if v != expr => - (e(v)._1, va) case (Some(v), Some(va)) => (v, va) case _ => @@ -131,15 +129,17 @@ class AbstractEvaluator(ctx: LeonContext, prog: Program) extends ContextualEvalu val (ecaller, tcaller) = e(caller) val nargs = args map e val (eargs, targs) = nargs.unzip - val abs_value = Application(tcaller, targs) - if (ExprOps.isValue(ecaller) && (eargs forall ExprOps.isValue)) { - (underlying.e(Application(ecaller, eargs)), abs_value) - } else ecaller match { - case l @ Lambda(params, body) => + ecaller match { + case l @ Lambda(params, body) if evaluateApplications => val mapping = (params map (_.id) zip nargs).toMap e(body)(rctx.withNewVars2(mapping), gctx) case _ => - (Application(ecaller, eargs), abs_value) + val abs_value = Application(tcaller, targs) + if (ExprOps.isValue(ecaller) && (eargs forall ExprOps.isValue)) { + (underlying.e(Application(ecaller, eargs)), abs_value) + } else { + (Application(ecaller, eargs), abs_value) + } } case Operator(es, builder) =>