From fea65b24d5af65ee1b73997180d7cc7fe83adf4c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mika=C3=ABl=20Mayer?= <mikael.mayer@epfl.ch>
Date: Tue, 26 Apr 2016 15:46:29 +0200
Subject: [PATCH] Corrected typo in Focus.scala Corrected bug in isValue
 Corrected evaluation in Evaluator (partition already evaluated)

---
 src/main/scala/leon/evaluators/Evaluator.scala | 5 +++--
 src/main/scala/leon/purescala/ExprOps.scala    | 1 +
 src/main/scala/leon/repair/rules/Focus.scala   | 2 +-
 3 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/main/scala/leon/evaluators/Evaluator.scala b/src/main/scala/leon/evaluators/Evaluator.scala
index c924e8bb5..a4cb12831 100644
--- a/src/main/scala/leon/evaluators/Evaluator.scala
+++ b/src/main/scala/leon/evaluators/Evaluator.scala
@@ -75,8 +75,9 @@ trait DeterministicEvaluator extends Evaluator {
   /** From a not yet well evaluated context with dependencies between variables, returns a head where all exprs are values (as a Left())
    *  If this does not succeed, it provides an error message as Right()*/
   private def _evalEnv(mapping: Iterable[(Identifier, Expr)]): Either[Map[Identifier, Value], String] = {
-    var f= mapping.toSet
-    var mBuilder = collection.mutable.ListBuffer[(Identifier, Value)]()
+    val (evaled, nonevaled) = mapping.partition{ case (id, expr) => purescala.ExprOps.isValue(expr)}
+    var f= nonevaled.toSet
+    var mBuilder = collection.mutable.ListBuffer[(Identifier, Value)]() ++= evaled
     var changed = true
     while(f.nonEmpty && changed) {
       changed = false
diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala
index 1828709ef..f3a9a94ca 100644
--- a/src/main/scala/leon/purescala/ExprOps.scala
+++ b/src/main/scala/leon/purescala/ExprOps.scala
@@ -2177,6 +2177,7 @@ object ExprOps extends GenTreeOps[Expr] {
       case (FiniteLambda(mapping, default, tpe), exTpe@FunctionType(ins, out)) =>
         tpe == exTpe
       case (Lambda(valdefs, body), FunctionType(ins, out)) =>
+        variablesOf(e).isEmpty &&
         (valdefs zip ins forall (vdin => (vdin._1.getType == vdin._2) < s"${vdin._1.getType} is not equal to ${vdin._2}")) &&
         (body.getType == out) < s"${body.getType} is not equal to ${out}"
       case (FiniteBag(elements, fbtpe), BagType(tpe)) =>
diff --git a/src/main/scala/leon/repair/rules/Focus.scala b/src/main/scala/leon/repair/rules/Focus.scala
index cd0da333b..1645b7bcc 100644
--- a/src/main/scala/leon/repair/rules/Focus.scala
+++ b/src/main/scala/leon/repair/rules/Focus.scala
@@ -66,7 +66,7 @@ case object Focus extends PreprocessingRule("Focus") {
 
     def existsFailing(e: Expr, env: Map[Identifier, Expr], evaluator: DeterministicEvaluator): Boolean = {
       p.eb.invalids.exists { ex =>
-        evaluator.evalEnvExpr(e, env).result match {
+        evaluator.evalEnvExpr(e, (p.as zip ex.ins).toMap ++ env) match {
           case Some(BooleanLiteral(b)) => b
           case _ => true
         }
-- 
GitLab