From bd2a88b389e37f98a1fdc2e08ac9cc97d3c0f8f9 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Wed, 25 May 2016 15:12:49 +0200
Subject: [PATCH] Move MutableExpr to synthesis

---
 .../scala/leon/codegen/CodeGeneration.scala   |  2 +-
 .../leon/evaluators/RecursiveEvaluator.scala  |  2 +-
 .../leon/evaluators/StreamEvaluator.scala     |  2 +-
 .../scala/leon/purescala/Expressions.scala    | 14 -------------
 .../leon/solvers/smtlib/SMTLIBTarget.scala    |  2 +-
 .../leon/solvers/z3/AbstractZ3Solver.scala    |  2 +-
 .../leon/synthesis/rules/CEGISLike.scala      |  1 +
 .../leon/synthesis/utils/MutableExpr.scala    | 21 +++++++++++++++++++
 8 files changed, 27 insertions(+), 19 deletions(-)
 create mode 100644 src/main/scala/leon/synthesis/utils/MutableExpr.scala

diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala
index 47f6f3441..b37067de4 100644
--- a/src/main/scala/leon/codegen/CodeGeneration.scala
+++ b/src/main/scala/leon/codegen/CodeGeneration.scala
@@ -1195,7 +1195,7 @@ trait CodeGeneration {
         mkBranch(b, al, fl, ch, canDelegateToMkExpr = false)
         ch << Label(fl) << POP << Ldc(0) << Label(al)
 
-      case MutableExpr(e) =>
+      case synthesis.utils.MutableExpr(e) =>
         mkExpr(e, ch)
 
       case _ => throw CompilationException("Unsupported expr " + e + " : " + e.getClass)
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index 5fba0109e..933781bfb 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -831,7 +831,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, val bank: Eva
           throw RuntimeError("MatchError: "+rscrut.asString+" did not match any of the cases:\n"+cases)
       }
 
-    case MutableExpr(ex) =>
+    case synthesis.utils.MutableExpr(ex) =>
       e(ex)
 
     case gl: GenericValue => gl
diff --git a/src/main/scala/leon/evaluators/StreamEvaluator.scala b/src/main/scala/leon/evaluators/StreamEvaluator.scala
index c49e3941b..8caf0c9f4 100644
--- a/src/main/scala/leon/evaluators/StreamEvaluator.scala
+++ b/src/main/scala/leon/evaluators/StreamEvaluator.scala
@@ -287,7 +287,7 @@ class StreamEvaluator(ctx: LeonContext, prog: Program)
           Stream()
       }
 
-    case MutableExpr(ex) =>
+    case synthesis.utils.MutableExpr(ex) =>
       e(ex)
 
     case MatchExpr(scrut, cases) =>
diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala
index 7567132ea..65fbfb0dc 100644
--- a/src/main/scala/leon/purescala/Expressions.scala
+++ b/src/main/scala/leon/purescala/Expressions.scala
@@ -998,20 +998,6 @@ object Expressions {
     val getType = ArrayType(tpe).unveilUntyped
   }
 
-  case class MutableExpr(var underlying: Expr) extends Expr with Extractable with PrettyPrintable {
-    def getType = underlying.getType
-
-    def extract: Option[(Seq[Expr], (Seq[Expr]) => Expr)] = Some(
-      Seq(underlying),
-      { case Seq(e) => underlying = e; this }
-    )
-
-    override def printWith(implicit pctx: PrinterContext): Unit = {
-      import PrinterHelpers._
-      p"$underlying"
-    }
-  }
-
   /* Special trees for synthesis */
   /** $encodingof `choose(pred)`, the non-deterministic choice in Leon.
     *
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
index 77ed0a9c8..b37ffacf8 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
@@ -529,7 +529,7 @@ trait SMTLIBTarget extends Interruptible {
         val constructor = constructors.toB(tpe)
         FunctionApplication(constructor, Seq(toSMT(InfiniteIntegerLiteral(n))))
 
-      case MutableExpr(ex) =>
+      case synthesis.utils.MutableExpr(ex) =>
         toSMT(ex)
 
       /**
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index 99567a865..0fef7e87a 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -552,7 +552,7 @@ trait AbstractZ3Solver extends Z3Solver {
         val constructor = constructors.toB(tp)
         constructor(rec(InfiniteIntegerLiteral(id)))
 
-      case MutableExpr(ex) =>
+      case synthesis.utils.MutableExpr(ex) =>
         rec(ex)
 
       case other =>
diff --git a/src/main/scala/leon/synthesis/rules/CEGISLike.scala b/src/main/scala/leon/synthesis/rules/CEGISLike.scala
index f7ab39d9d..a737d78a6 100644
--- a/src/main/scala/leon/synthesis/rules/CEGISLike.scala
+++ b/src/main/scala/leon/synthesis/rules/CEGISLike.scala
@@ -13,6 +13,7 @@ import purescala.TypeOps.depth
 import purescala.DefOps._
 import purescala.Constructors._
 
+import utils.MutableExpr
 import solvers._
 import leon.grammars._
 import leon.grammars.aspects._
diff --git a/src/main/scala/leon/synthesis/utils/MutableExpr.scala b/src/main/scala/leon/synthesis/utils/MutableExpr.scala
new file mode 100644
index 000000000..f30fd8104
--- /dev/null
+++ b/src/main/scala/leon/synthesis/utils/MutableExpr.scala
@@ -0,0 +1,21 @@
+package leon
+package synthesis.utils
+
+import purescala.Expressions.Expr
+import purescala.Extractors.Extractable
+import purescala.{PrinterHelpers, PrinterContext, PrettyPrintable}
+
+/** A mutable expression box useful for CEGIS */
+case class MutableExpr(var underlying: Expr) extends Expr with Extractable with PrettyPrintable {
+  def getType = underlying.getType
+
+  def extract: Option[(Seq[Expr], (Seq[Expr]) => Expr)] = Some(
+    Seq(underlying),
+    { case Seq(e) => underlying = e; this }
+  )
+
+  override def printWith(implicit pctx: PrinterContext): Unit = {
+    import PrinterHelpers._
+    p"$underlying"
+  }
+}
\ No newline at end of file
-- 
GitLab