diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala index e1de9e64c26b540869648f849008808ea6dcad0b..8858fbf3b65f67d4fe51cad9fd52ee020e526129 100644 --- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala +++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala @@ -109,7 +109,6 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int case en@Ensuring(body, post) => if ( exists{ case Hole(_,_) => true - case Gives(_,_) => true case _ => false }(en)) e(convertHoles(en, ctx, true)) @@ -493,8 +492,6 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int case gv: GenericValue => gv - case g : Gives => - e(convertHoles(g, ctx, true)) case p : Passes => e(p.asConstraint) diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index 408cdfe167df64eae4f30d0b411b25b57d740dba..03f1d1778f8c2927a2de91f98fd77acdd08a3ac0 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -1124,11 +1124,6 @@ trait CodeExtraction extends ASTExtractors { } passes(ine, oute, rc) - case ExGives(sel, cses) => - val rs = extractTree(sel) - val rc = cses.map(extractMatchCase) - gives(rs, rc) - case ExArrayLiteral(tpe, args) => finiteArray(args.map(extractTree), None, extractType(tpe)(dctx, current.pos)) diff --git a/src/main/scala/leon/purescala/Constructors.scala b/src/main/scala/leon/purescala/Constructors.scala index 98b46fb1f3eb9c27287b33c516e27b3533fb2129..0bc69cb3b74c4018dbf63f0a055697a2f1d8bf74 100644 --- a/src/main/scala/leon/purescala/Constructors.scala +++ b/src/main/scala/leon/purescala/Constructors.scala @@ -105,9 +105,6 @@ object Constructors { } } - def gives(scrutinee : Expr, cases : Seq[MatchCase]) : Gives = - Gives(scrutinee, filterCases(scrutinee.getType, None, cases)) - def passes(in : Expr, out : Expr, cases : Seq[MatchCase]): Expr = { val resultingCases = filterCases(in.getType, Some(out.getType), cases) if (resultingCases.nonEmpty) { diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala index 894a77a855959fb0f245494b12aa9e9e63134617..0d56b84ac940c58fb19e36ef02d6fe0175d8e613 100644 --- a/src/main/scala/leon/purescala/ExprOps.scala +++ b/src/main/scala/leon/purescala/ExprOps.scala @@ -355,7 +355,7 @@ object ExprOps { case Variable(i) => subvs + i case LetDef(fd,_) => subvs -- fd.params.map(_.id) case Let(i,_,_) => subvs - i - case MatchLike(_, cses, _) => subvs -- cses.map(_.pattern.binders).foldLeft(Set[Identifier]())((a, b) => a ++ b) + case MatchExpr(_, cses) => subvs -- cses.map(_.pattern.binders).foldLeft(Set[Identifier]())((a, b) => a ++ b) case Passes(_, _ , cses) => subvs -- cses.map(_.pattern.binders).foldLeft(Set[Identifier]())((a, b) => a ++ b) case Lambda(args, body) => subvs -- args.map(_.id) case Forall(args, body) => subvs -- args.map(_.id) @@ -432,8 +432,8 @@ object ExprOps { postMap({ - case m @ MatchLike(s, cses, builder) => - Some(builder(s, cses.map(freshenCase)).copiedFrom(m)) + case m @ MatchExpr(s, cses) => + Some(matchExpr(s, cses.map(freshenCase)).copiedFrom(m)) case p @ Passes(in, out, cses) => Some(Passes(in, out, cses.map(freshenCase)).copiedFrom(p)) @@ -621,7 +621,7 @@ object ExprOps { case v @ Variable(id) if s.isDefinedAt(id) => rec(s(id), s) case l @ Let(i,e,b) => rec(b, s + (i -> rec(e, s))) case i @ IfExpr(t1,t2,t3) => IfExpr(rec(t1, s),rec(t2, s),rec(t3, s)) - case m @ MatchLike(scrut,cses,builder) => builder(rec(scrut, s), cses.map(inCase(_, s))).setPos(m) + case m @ MatchExpr(scrut, cses) => matchExpr(rec(scrut, s), cses.map(inCase(_, s))).setPos(m) case p @ Passes(in, out, cses) => Passes(rec(in, s), rec(out,s), cses.map(inCase(_, s))).setPos(p) case n @ NAryOperator(args, recons) => { var change = false @@ -852,10 +852,6 @@ object ExprOps { // This introduces a MatchExpr Some(p.asConstraint) - case g: Gives => - // This introduces a MatchExpr - Some(g.asMatch) - case _ => None } @@ -1236,7 +1232,7 @@ object ExprOps { case t: Terminal => 1 - case ml: MatchLike => + case ml: MatchExpr => ml.cases.foldLeft(formulaSize(ml.scrutinee)) { case (s, MatchCase(p, og, rhs)) => s + formulaSize(rhs) + og.map(formulaSize).getOrElse(0) + patternSize(p) @@ -1262,7 +1258,6 @@ object ExprOps { case Hole(_, _) => return false //@EK FIXME: do we need it? //case Error(_, _) => return false - case Gives(_,_) => return false case _ => }(e) true @@ -1496,7 +1491,7 @@ object ExprOps { fdHomo(fd1, fd2) && isHomo(e1, e2)(map + (fd1.id -> fd2.id)) - case Same(MatchLike(s1, cs1, _), MatchLike(s2, cs2, _)) => + case (MatchExpr(s1, cs1), MatchExpr(s2, cs2)) => cs1.size == cs2.size && isHomo(s1, s2) && casesMatch(cs1,cs2) case (Passes(in1, out1, cs1), Passes(in2, out2, cs2)) => diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala index 2f793f5b17b2d14f127739308718e2a1d3c40742..596ddc2df4264294c2793a1065bf9a927762f65c 100644 --- a/src/main/scala/leon/purescala/Expressions.scala +++ b/src/main/scala/leon/purescala/Expressions.scala @@ -155,27 +155,11 @@ object Expressions { } } - abstract sealed class MatchLike extends Expr { - val scrutinee : Expr - val cases : Seq[MatchCase] - val getType = leastUpperBound(cases.map(_.rhs.getType)).getOrElse(Untyped).unveilUntyped - } - - case class MatchExpr(scrutinee: Expr, cases: Seq[MatchCase]) extends MatchLike { + case class MatchExpr(scrutinee: Expr, cases: Seq[MatchCase]) extends Expr { require(cases.nonEmpty) + val getType = leastUpperBound(cases.map(_.rhs.getType)).getOrElse(Untyped).unveilUntyped } - case class Gives(scrutinee: Expr, cases : Seq[MatchCase]) extends MatchLike { - def asMatchWithHole = { - val theHole = SimpleCase(WildcardPattern(None), Hole(this.getType, Seq())) - MatchExpr(scrutinee, cases :+ theHole) - } - - def asMatch = { - matchExpr(scrutinee, cases) - } - } - case class Passes(in: Expr, out : Expr, cases : Seq[MatchCase]) extends Expr { require(cases.nonEmpty) diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala index 1059f1be6015340e03d14050ffc5cd13c9f9339f..d3186cde0176c0e7e24c5e81886879e22b16365f 100644 --- a/src/main/scala/leon/purescala/Extractors.scala +++ b/src/main/scala/leon/purescala/Extractors.scala @@ -142,7 +142,7 @@ object Extractors { Seq(cond, thenn, elze), (as: Seq[Expr]) => IfExpr(as(0), as(1), as(2)) )) - case MatchLike(scrut, cases, builder) => Some(( + case MatchExpr(scrut, cases) => Some(( scrut +: cases.flatMap { case SimpleCase(_, e) => Seq(e) case GuardedCase(_, e1, e2) => Seq(e1, e2) @@ -154,7 +154,7 @@ object Extractors { case GuardedCase(b, _, _) => i+=2; GuardedCase(b, es(i-2), es(i-1)) } - builder(es(0), newcases) + matchExpr(es(0), newcases) } )) case Passes(in, out, cases) => Some(( @@ -303,17 +303,6 @@ object Extractors { None } } - - object MatchLike { - def unapply(m : MatchLike) : Option[(Expr, Seq[MatchCase], (Expr, Seq[MatchCase]) => Expr)] = { - Option(m) map { m => - (m.scrutinee, m.cases, m match { - case _ : MatchExpr => matchExpr - case _ : Gives => gives - }) - } - } - } object SimpleCase { def apply(p : Pattern, rhs : Expr) = MatchCase(p, None, rhs) diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala index 44d4e90bfc6880d1683ddbcadc90f1e05afe793f..c312ad18fe6000ab5f583ab131ebe26de5ecb5d5 100644 --- a/src/main/scala/leon/purescala/PrettyPrinter.scala +++ b/src/main/scala/leon/purescala/PrettyPrinter.scala @@ -206,13 +206,6 @@ class PrettyPrinter(opts: PrinterOptions, val sb: StringBuffer = new StringBuffe | $post |}""" - case Gives(s, tests) => - optP { - p"""|$s gives { - | ${nary(tests, "\n")} - |}""" - } - case p@Passes(in, out, tests) => optP { p"""|($in, $out) passes { @@ -749,7 +742,7 @@ class PrettyPrinter(opts: PrinterOptions, val sb: StringBuffer = new StringBuffe case (BinaryMethodCall(_, _, _), Some(_: FunctionInvocation)) => true case (_, Some(_: FunctionInvocation)) => false case (ie: IfExpr, _) => true - case (me: MatchLike, _ ) => true + case (me: MatchExpr, _ ) => true case (e1: Expr, Some(e2: Expr)) if precedence(e1) > precedence(e2) => false case (_, _) => true } diff --git a/src/main/scala/leon/solvers/templates/TemplateGenerator.scala b/src/main/scala/leon/solvers/templates/TemplateGenerator.scala index 958fcaac4f909f5e6d37ad43c43b2bf7b04c7587..3781cb3e536928eb3f4a0fc4a3edc3d5dd6d1821 100644 --- a/src/main/scala/leon/solvers/templates/TemplateGenerator.scala +++ b/src/main/scala/leon/solvers/templates/TemplateGenerator.scala @@ -202,7 +202,6 @@ class TemplateGenerator[T](val encoder: TemplateEncoder[T]) { */ case m : MatchExpr => sys.error("'MatchExpr's should have been eliminated before generating templates.") case p : Passes => sys.error("'Passes's should have been eliminated before generating templates.") - case g : Gives => sys.error("'Gives' should have been eliminated before generating templates.") case i @ Implies(lhs, rhs) => implies(rec(pathVar, lhs), rec(pathVar, rhs)) diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index d0d02f9faa096f299f64ea59015653278d40ae4d..f2303d6997c26ddd59a6ffac08e1fc07c6fc2fc2 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -514,9 +514,6 @@ trait AbstractZ3Solver case me @ MatchExpr(s, cs) => rec(matchToIfThenElse(me)) - - case g @ Gives(scrut, tests) => - rec(g.asMatch) case tu @ Tuple(args) => typeToSort(tu.getType) // Make sure we generate sort & meta info diff --git a/src/main/scala/leon/synthesis/ConvertHoles.scala b/src/main/scala/leon/synthesis/ConvertHoles.scala index de1e5d2721041d6883e94ed6632493e243dc7bc2..96c3118b52febb9817e9fd75b9bd83ffd185c225 100644 --- a/src/main/scala/leon/synthesis/ConvertHoles.scala +++ b/src/main/scala/leon/synthesis/ConvertHoles.scala @@ -54,8 +54,6 @@ object ConvertHoles extends LeonPhase[Program, Program] { var holes = List[Identifier]() val withoutHoles = preMap { - case p : Gives if treatGives => - Some(p.asMatchWithHole) case h : Hole => val (expr, ids) = toExpr(h)