From 617aa98193eb2188aa76fb27aa12a4ddb8eac0d7 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Mon, 30 Mar 2015 14:31:28 +0200
Subject: [PATCH] Various fixes

---
 src/main/scala/leon/purescala/DefOps.scala    |  2 +-
 .../scala/leon/purescala/Definitions.scala    |  9 +++++++
 .../leon/solvers/smtlib/SMTLIBTarget.scala    |  2 --
 .../smtlib/SMTLIBUnrollingCVC4Target.scala    | 26 ++++++++++---------
 4 files changed, 24 insertions(+), 15 deletions(-)

diff --git a/src/main/scala/leon/purescala/DefOps.scala b/src/main/scala/leon/purescala/DefOps.scala
index 8edf77f51..6daf732ef 100644
--- a/src/main/scala/leon/purescala/DefOps.scala
+++ b/src/main/scala/leon/purescala/DefOps.scala
@@ -394,7 +394,7 @@ object DefOps {
     import leon.utils.SearchSpace.reachable
     reachable(
       sources,
-      (tfd: TypedFunDef) => functionCallsOf(tfd.fd.fullBody) map { _.tfd },
+      (tfd: TypedFunDef) => functionCallsOf(tfd.fullBody) map { _.tfd },
       limit
     )
   }
diff --git a/src/main/scala/leon/purescala/Definitions.scala b/src/main/scala/leon/purescala/Definitions.scala
index ee0f6a03c..fe162c455 100644
--- a/src/main/scala/leon/purescala/Definitions.scala
+++ b/src/main/scala/leon/purescala/Definitions.scala
@@ -498,6 +498,15 @@ object Definitions {
     private var trCache = Map[Expr, Expr]()
     private var postCache = Map[Expr, Expr]()
 
+    def fullBody = {
+      val fb = fd.fullBody
+      trCache.getOrElse(fb, {
+        val res = translated(fb)
+        trCache += fb -> res
+        res
+      })
+    }
+
     def body = fd.body.map { b =>
       trCache.getOrElse(b, {
         val res = translated(b)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
index 47cebfd05..43e1dd91c 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
@@ -52,7 +52,6 @@ trait SMTLIBTarget {
   val selectors    = new IncrementalBijection[(TypeTree, Int), SSymbol]()
   val testers      = new IncrementalBijection[TypeTree, SSymbol]()
   val variables    = new IncrementalBijection[Identifier, SSymbol]()
-  val classes      = new IncrementalBijection[CaseClassDef, SSymbol]()
   val sorts        = new IncrementalBijection[TypeTree, Sort]()
   val functions    = new IncrementalBijection[TypedFunDef, SSymbol]()
 
@@ -646,7 +645,6 @@ trait SMTLIBTarget {
       out.write("\n")
       out.flush()
     }
-
     interpreter.eval(cmd) match {
       case err@ErrorResponse(msg) if !interrupted =>
         reporter.fatalError("Unexpected error from smt-"+targetName+" solver: "+msg)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala
index 9fd5eeba2..0600de6cb 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala
@@ -26,7 +26,7 @@ trait SMTLIBUnrollingCVC4Target extends SMTLIBCVC4Target {
         )
       }
 
-      val (smtFunDecls, smtBodies) = funs.toSeq.collect {
+      val smtFunDecls = funs.toSeq.collect {
         case tfd if !functions.containsA(tfd) && tfd.params.nonEmpty =>
           val id = if (tfd.tps.isEmpty) {
             tfd.id
@@ -35,17 +35,19 @@ trait SMTLIBUnrollingCVC4Target extends SMTLIBCVC4Target {
           }
           val sym = id2sym(id)
           functions +=(tfd, sym)
-          (
-            FunDec(
-              sym,
-              tfd.params map { p => SortedVar(id2sym(p.id), declareSort(p.getType)) },
-              declareSort(tfd.returnType)
-            ),
-            toSMT(matchToIfThenElse(tfd.body.get))(tfd.params.map { p =>
-              (p.id, id2sym(p.id): Term)
-            }.toMap)
-            )
-      }.unzip
+          FunDec(
+            sym,
+            tfd.params map { p => SortedVar(id2sym(p.id), declareSort(p.getType)) },
+            declareSort(tfd.returnType)
+          )
+      }
+      val smtBodies = smtFunDecls map { case FunDec(sym, _, _) =>
+        val tfd = functions.toA(sym)
+        toSMT(matchToIfThenElse(tfd.body.get))(tfd.params.map { p =>
+          (p.id, id2sym(p.id): Term)
+        }.toMap
+      )
+      }
 
       if (smtFunDecls.nonEmpty) sendCommand(DefineFunsRec(smtFunDecls, smtBodies))
       functions.toB(tfd)
-- 
GitLab