From ea7cbd6a5fb44de92bc5368bbfd901269e94aa33 Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Sat, 29 Oct 2016 15:00:01 +0200
Subject: [PATCH] Fix for unique lambda extractions from model

---
 .../scala/inox/solvers/unrolling/LambdaTemplates.scala |  2 +-
 .../scala/inox/solvers/unrolling/UnrollingSolver.scala | 10 +++++-----
 2 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala b/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala
index 8442624ba..ff0573a58 100644
--- a/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala
+++ b/src/main/scala/inox/solvers/unrolling/LambdaTemplates.scala
@@ -259,7 +259,7 @@ trait LambdaTemplates { self: Templates =>
     freeFunctions += ft -> (freeFunctions(ft) + (b -> f))
 
     lazy val gen = nextGeneration(currentGeneration)
-    for (app @ (_, App(caller, _, args, _)) <- applications(tpe)) {
+    for (app @ (_, App(caller, _, args, _)) <- applications(ft)) {
       val cond = mkAnd(b, mkEquals(f, caller))
       registerAppBlocker(gen, app, Right(f), cond, args)
     }
diff --git a/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala b/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala
index 915aa9edb..e49d71bac 100644
--- a/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala
+++ b/src/main/scala/inox/solvers/unrolling/UnrollingSolver.scala
@@ -318,11 +318,11 @@ trait AbstractUnrollingSolver extends Solver { self =>
             val lambda = FiniteLambda(params, mappings, dflt)
             // make sure `lambda` is not equal to any other distinct extracted first-class function
             val res = (funExtractions.collectFirst {
-              case (encoded, `lambda`) =>
-                Right(encoded)
-              case (e, img) if
-              wrapped.eval(templates.mkEquals(e, f), BooleanType) == Some(BooleanLiteral(true)) =>
-                Left(img)
+              case (encoded, `lambda`) => Right(encoded)
+              case (e, img) if (
+                bestRealType(img.getType) == bestRealType(lambda.getType) &&
+                wrapped.eval(templates.mkEquals(e, f), BooleanType) == Some(BooleanLiteral(true))
+              )=> Left(img)
             }) match {
               case Some(Right(enc)) => wrapped.eval(enc, tpe).get match {
                 case Lambda(_, Let(_, IntegerLiteral(n), _)) => uniquateClosure(n, lambda)
-- 
GitLab