From cabb2c2a253bd3ac5509c367f532f9a4b29080cb Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Wed, 31 Oct 2012 13:33:05 +0100 Subject: [PATCH] Remove unused binders --- src/main/scala/leon/purescala/TreeOps.scala | 30 ++++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala index 8baa7e8dc..802d72ed9 100644 --- a/src/main/scala/leon/purescala/TreeOps.scala +++ b/src/main/scala/leon/purescala/TreeOps.scala @@ -962,26 +962,26 @@ object TreeOps { val (newExpr, newC) = expr match { case t: Terminal => - (expr, ctx) + (expr, cIn) case UnaryOperator(e, builder) => val (e1, c) = rec(e, ctx) val newE = builder(e1) - (newE, combiner(newE, ctx, Seq(c))) + (newE, combiner(newE, cIn, Seq(c))) case BinaryOperator(e1, e2, builder) => val (ne1, c1) = rec(e1, ctx) val (ne2, c2) = rec(e2, ctx) val newE = builder(ne1, ne2) - (newE, combiner(newE, ctx, Seq(c1, c2))) + (newE, combiner(newE, cIn, Seq(c1, c2))) case NAryOperator(es, builder) => - val (nes, cs) = es.map(e => rec(e, ctx)).unzip + val (nes, cs) = es.map{ rec(_, ctx)}.unzip val newE = builder(nes) - (newE, combiner(newE, ctx, cs)) + (newE, combiner(newE, cIn, cs)) case e => sys.error("Expression "+e+" ["+e.getClass+"] is not extractable") @@ -1011,7 +1011,7 @@ object TreeOps { def simplePostTransform(post: Expr => Expr)(expr: Expr) = { val newPost = (e: Expr, c: Unit) => (post(e), ()) - genericTransform[Unit]((_, _), newPost, noCombiner)(())(expr)._1 + genericTransform[Unit]((e,c) => (e, None), newPost, noCombiner)(())(expr)._1 } def toDNF(e: Expr): Expr = { @@ -1176,7 +1176,23 @@ object TreeOps { // "CC(a)" by "d" and not by "CC(b)" val newThen = searchAndReplace(substMap.get)(then) - MatchExpr(scrutinee, Seq(SimpleCase(pattern, newThen), SimpleCase(WildcardPattern(None), elze))) + // Remove unused binders + val vars = variablesOf(newThen) + + def simplerBinder(oid: Option[Identifier]) = oid.filter(vars(_)) + + def simplifyPattern(p: Pattern): Pattern = p match { + case CaseClassPattern(ob, cd, subpatterns) => + CaseClassPattern(simplerBinder(ob), cd, subpatterns map simplifyPattern) + case WildcardPattern(ob) => + WildcardPattern(simplerBinder(ob)) + case TuplePattern(ob, patterns) => + TuplePattern(simplerBinder(ob), patterns map simplifyPattern) + case _ => + p + } + + MatchExpr(scrutinee, Seq(SimpleCase(simplifyPattern(pattern), newThen), SimpleCase(WildcardPattern(None), elze))) } else { e } -- GitLab