From ce3c5dfdf093800b3a162455f140186ab8b02ef7 Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Thu, 25 Feb 2016 18:24:25 +0100 Subject: [PATCH] Remove Waypoint --- library/lang/xlang/package.scala | 3 -- .../leon/frontends/scalac/ASTExtractors.scala | 10 ------ .../frontends/scalac/CodeExtraction.scala | 5 --- .../leon/solvers/z3/AbstractZ3Solver.scala | 35 ++++++------------- src/main/scala/leon/xlang/Expressions.scala | 12 ------- .../leon/xlang/NoXLangFeaturesChecking.scala | 2 -- 6 files changed, 10 insertions(+), 57 deletions(-) diff --git a/library/lang/xlang/package.scala b/library/lang/xlang/package.scala index 6f29c5d33..75efd0103 100644 --- a/library/lang/xlang/package.scala +++ b/library/lang/xlang/package.scala @@ -5,9 +5,6 @@ package leon.lang import leon.annotation._ package object xlang { - @ignore - def waypoint[A](i: Int, expr: A): A = expr - @ignore def epsilon[A](pred: (A) => Boolean): A = throw new RuntimeException("Implementation not supported") } diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala index f8509be9c..b0885825c 100644 --- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala +++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala @@ -602,16 +602,6 @@ trait ASTExtractors { } } - object ExWaypointExpression { - def unapply(tree: Apply) : Option[(Tree, Tree, Tree)] = tree match { - case Apply( - TypeApply(ExSymbol("leon", "lang", "xlang", "waypoint"), typeTree :: Nil), - List(i, expr)) => - Some((typeTree, i, expr)) - case _ => None - } - } - object ExErrorExpression { def unapply(tree: Apply) : Option[(String, Tree)] = tree match { case a @ Apply(TypeApply(ExSymbol("leon", "lang", "error"), List(tpe)), List(lit : Literal)) => diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index 0451b4c08..4b3c577ad 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -1267,11 +1267,6 @@ trait CodeExtraction extends ASTExtractors { } Epsilon(c1, pstpe) - case ExWaypointExpression(tpt, i, tree) => - val pstpe = extractType(tpt) - val IntLiteral(ri) = extractTree(i) - Waypoint(ri, extractTree(tree), pstpe) - case update @ ExUpdate(lhs, index, newValue) => val lhsRec = extractTree(lhs) lhsRec match { diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index 7ad5c222b..84715bb73 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -13,7 +13,6 @@ import purescala.Constructors._ import purescala.Extractors._ import purescala.Expressions._ import purescala.TypeOps._ -import xlang.Expressions._ import purescala.ExprOps._ import purescala.Types._ @@ -271,7 +270,7 @@ trait AbstractZ3Solver extends Solver { def rec(ex: Expr): Z3AST = ex match { // TODO: Leave that as a specialization? - case LetTuple(ids, e, b) => { + case LetTuple(ids, e, b) => z3Vars = z3Vars ++ ids.zipWithIndex.map { case (id, ix) => val entry = id -> rec(tupleSelect(e, ix + 1, ids.size)) entry @@ -279,7 +278,6 @@ trait AbstractZ3Solver extends Solver { val rb = rec(b) z3Vars = z3Vars -- ids rb - } case p @ Passes(_, _, _) => rec(p.asConstraint) @@ -287,40 +285,30 @@ trait AbstractZ3Solver extends Solver { case me @ MatchExpr(s, cs) => rec(matchToIfThenElse(me)) - case Let(i, e, b) => { + case Let(i, e, b) => val re = rec(e) z3Vars = z3Vars + (i -> re) val rb = rec(b) z3Vars = z3Vars - i rb - } - case Waypoint(_, e, _) => rec(e) case a @ Assert(cond, err, body) => rec(IfExpr(cond, body, Error(a.getType, err.getOrElse("Assertion failed")).setPos(a.getPos)).setPos(a.getPos)) - case e @ Error(tpe, _) => { + case e @ Error(tpe, _) => val newAST = z3.mkFreshConst("errorValue", typeToSort(tpe)) // Might introduce dupplicates (e), but no worries here variables += (e -> newAST) newAST - } - case v @ Variable(id) => z3Vars.get(id) match { - case Some(ast) => - ast - case None => { - variables.getB(v) match { - case Some(ast) => - ast - - case None => + + case v @ Variable(id) => z3Vars.getOrElse(id, + variables.getB(v).getOrElse { val newAST = z3.mkFreshConst(id.uniqueName, typeToSort(v.getType)) z3Vars = z3Vars + (id -> newAST) variables += (v -> newAST) newAST } - } - } + ) case ite @ IfExpr(c, t, e) => z3.mkITE(rec(c), rec(t), rec(e)) case And(exs) => z3.mkAnd(exs.map(rec): _*) @@ -337,7 +325,7 @@ trait AbstractZ3Solver extends Solver { case Plus(l, r) => z3.mkAdd(rec(l), rec(r)) case Minus(l, r) => z3.mkSub(rec(l), rec(r)) case Times(l, r) => z3.mkMul(rec(l), rec(r)) - case Division(l, r) => { + case Division(l, r) => val rl = rec(l) val rr = rec(r) z3.mkITE( @@ -345,14 +333,11 @@ trait AbstractZ3Solver extends Solver { z3.mkDiv(rl, rr), z3.mkUnaryMinus(z3.mkDiv(z3.mkUnaryMinus(rl), rr)) ) - } - case Remainder(l, r) => { + case Remainder(l, r) => val q = rec(Division(l, r)) z3.mkSub(rec(l), z3.mkMul(rec(r), q)) - } - case Modulo(l, r) => { + case Modulo(l, r) => z3.mkMod(rec(l), rec(r)) - } case UMinus(e) => z3.mkUnaryMinus(rec(e)) case RealPlus(l, r) => z3.mkAdd(rec(l), rec(r)) diff --git a/src/main/scala/leon/xlang/Expressions.scala b/src/main/scala/leon/xlang/Expressions.scala index 98214ee64..0f1dd6b98 100644 --- a/src/main/scala/leon/xlang/Expressions.scala +++ b/src/main/scala/leon/xlang/Expressions.scala @@ -119,18 +119,6 @@ object Expressions { override def isSimpleExpr = false } - case class Waypoint(i: Int, expr: Expr, tpe: TypeTree) extends XLangExpr with Extractable with PrettyPrintable{ - def extract: Option[(Seq[Expr], Seq[Expr]=>Expr)] = { - Some((Seq(expr), (es: Seq[Expr]) => Waypoint(i, es.head, tpe))) - } - - def printWith(implicit pctx: PrinterContext) { - p"waypoint_$i($expr)" - } - - val getType = tpe - } - case class ArrayUpdate(array: Expr, index: Expr, newValue: Expr) extends XLangExpr with Extractable with PrettyPrintable { val getType = UnitType diff --git a/src/main/scala/leon/xlang/NoXLangFeaturesChecking.scala b/src/main/scala/leon/xlang/NoXLangFeaturesChecking.scala index d054887e9..9c4330ca7 100644 --- a/src/main/scala/leon/xlang/NoXLangFeaturesChecking.scala +++ b/src/main/scala/leon/xlang/NoXLangFeaturesChecking.scala @@ -29,8 +29,6 @@ object NoXLangFeaturesChecking extends UnitPhase[Program] { Set((e.getPos, "Usage of epsilons requires xlang desugaring")) case (e: LetVar) => Set((e.getPos, "Mutable variables (e.g. 'var x' instead of 'val x') require xlang desugaring")) - case (e: Waypoint) => - Set((e.getPos, "Usage of waypoints requires xlang desugaring")) case (e: ArrayUpdate) => Set((e.getPos, "In-place updates of arrays require xlang desugaring")) case _ => -- GitLab