From 1721a8652e7b6eaf916daa92b26448ef1f0a0eb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com> Date: Thu, 13 Dec 2012 13:59:30 +0100 Subject: [PATCH] remove usage of FunctionType and AnonymousFunction --- src/main/scala/leon/Evaluator.scala | 12 ------- src/main/scala/leon/FunctionTemplate.scala | 4 --- .../scala/leon/plugin/CodeExtraction.scala | 11 ------- .../scala/leon/purescala/Extractors.scala | 1 - .../scala/leon/purescala/PrettyPrinter.scala | 29 ---------------- .../scala/leon/purescala/ScalaPrinter.scala | 25 -------------- src/main/scala/leon/purescala/TreeOps.scala | 3 -- src/main/scala/leon/purescala/Trees.scala | 4 --- src/main/scala/leon/purescala/TypeTrees.scala | 11 ------- .../scala/leon/solvers/RandomSolver.scala | 1 - .../leon/solvers/z3/AbstractZ3Solver.scala | 33 ------------------- 11 files changed, 134 deletions(-) diff --git a/src/main/scala/leon/Evaluator.scala b/src/main/scala/leon/Evaluator.scala index 27ecd4a6a..5792b973c 100644 --- a/src/main/scala/leon/Evaluator.scala +++ b/src/main/scala/leon/Evaluator.scala @@ -319,18 +319,6 @@ object Evaluator { case (FiniteMap(ss), e) => BooleanLiteral(ss.exists(_.from == e)) case (l, r) => throw TypeErrorEx(TypeError(l, m.getType)) } - case AnonymousFunctionInvocation(i,as) => { - val fun = ctx(i) - fun match { - case AnonymousFunction(es, ev) => { - es.find(_._1 == as) match { - case Some(res) => res._2 - case None => ev - } - } - case _ => scala.sys.error("function id has non-function interpretation") - } - } case Distinct(args) => { val newArgs = args.map(rec(ctx, _)) BooleanLiteral(newArgs.distinct.size == newArgs.size) diff --git a/src/main/scala/leon/FunctionTemplate.scala b/src/main/scala/leon/FunctionTemplate.scala index c7dac3029..3f3494524 100644 --- a/src/main/scala/leon/FunctionTemplate.scala +++ b/src/main/scala/leon/FunctionTemplate.scala @@ -161,10 +161,6 @@ object FunctionTemplate { case b @ BinaryOperator(a1, a2, r) => r(rec(pathVar, pathPol, a1), rec(pathVar, pathPol, a2)).setType(b.getType) case u @ UnaryOperator(a, r) => r(rec(pathVar, pathPol, a)).setType(u.getType) case t : Terminal => t - case a : AnonymousFunction => { - Settings.reporter.warning("AnonymousFunction literal showed up in the construction of a FunctionTemplate.") - a - } } } diff --git a/src/main/scala/leon/plugin/CodeExtraction.scala b/src/main/scala/leon/plugin/CodeExtraction.scala index 0c42d24f7..8807b8761 100644 --- a/src/main/scala/leon/plugin/CodeExtraction.scala +++ b/src/main/scala/leon/plugin/CodeExtraction.scala @@ -901,16 +901,6 @@ trait CodeExtraction extends Extractors { case MapType(_,tt) => assert(rargs.size == 1) MapGet(rlhs, rargs.head).setType(tt).setPosInfo(app.pos.line, app.pos.column) - case FunctionType(fts, tt) => { - rlhs match { - case Variable(id) => - AnonymousFunctionInvocation(id, rargs).setType(tt) - case _ => { - if (!silent) unit.error(tree.pos, "apply on non-variable or non-map expression") - throw ImpureCodeEncounteredException(tree) - } - } - } case ArrayType(bt) => { assert(rargs.size == 1) ArraySelect(rlhs, rargs.head).setType(bt).setPosInfo(app.pos.line, app.pos.column) @@ -1065,7 +1055,6 @@ trait CodeExtraction extends Extractors { case TypeRef(_, sym, List(t1,t2,t3)) if isTuple3(sym) => TupleType(Seq(rec(t1),rec(t2),rec(t3))) case TypeRef(_, sym, List(t1,t2,t3,t4)) if isTuple4(sym) => TupleType(Seq(rec(t1),rec(t2),rec(t3),rec(t4))) case TypeRef(_, sym, List(t1,t2,t3,t4,t5)) if isTuple5(sym) => TupleType(Seq(rec(t1),rec(t2),rec(t3),rec(t4),rec(t5))) - case TypeRef(_, sym, ftt :: ttt :: Nil) if isFunction1TraitSym(sym) => FunctionType(List(rec(ftt)), rec(ttt)) case TypeRef(_, sym, btt :: Nil) if isArrayClassSym(sym) => ArrayType(rec(btt)) case TypeRef(_, sym, Nil) if classesToClasses.keySet.contains(sym) => classDefToClassType(classesToClasses(sym)) case _ => { diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala index ce64bbadb..b5a349bb1 100644 --- a/src/main/scala/leon/purescala/Extractors.scala +++ b/src/main/scala/leon/purescala/Extractors.scala @@ -84,7 +84,6 @@ object Extractors { object NAryOperator { def unapply(expr: Expr) : Option[(Seq[Expr],(Seq[Expr])=>Expr)] = expr match { case fi @ FunctionInvocation(fd, args) => Some((args, (as => FunctionInvocation(fd, as).setPosInfo(fi)))) - case AnonymousFunctionInvocation(id, args) => Some((args, (as => AnonymousFunctionInvocation(id, as)))) case CaseClass(cd, args) => Some((args, CaseClass(cd, _))) case And(args) => Some((args, And.apply)) case Or(args) => Some((args, Or.apply)) diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala index 27d1b6e74..7ab1b3c2f 100644 --- a/src/main/scala/leon/purescala/PrettyPrinter.scala +++ b/src/main/scala/leon/purescala/PrettyPrinter.scala @@ -143,26 +143,6 @@ object PrettyPrinter { nsb = ppNary(nsb, args, "(", ", ", ")", lvl) nsb } - case AnonymousFunction(es, ev) => { - var nsb = sb - nsb.append("{") - es.foreach { - case (as, res) => - nsb = ppNary(nsb, as, "", " ", "", lvl) - nsb.append(" -> ") - nsb = pp(res, nsb, lvl) - nsb.append(", ") - } - nsb.append("else -> ") - nsb = pp(ev, nsb, lvl) - nsb.append("}") - } - case AnonymousFunctionInvocation(id, args) => { - var nsb = sb - nsb.append(id) - nsb = ppNary(nsb, args, "(", ", ", ")", lvl) - nsb - } case Plus(l,r) => ppBinary(sb, l, r, " + ", lvl) case Minus(l,r) => ppBinary(sb, l, r, " - ", lvl) case Times(l,r) => ppBinary(sb, l, r, " * ", lvl) @@ -388,15 +368,6 @@ object PrettyPrinter { case MapType(ft,tt) => pp(tt, pp(ft, sb.append("Map["), lvl).append(","), lvl).append("]") case MultisetType(bt) => pp(bt, sb.append("Multiset["), lvl).append("]") case OptionType(bt) => pp(bt, sb.append("Option["), lvl).append("]") - case FunctionType(fts, tt) => { - var nsb = sb - if (fts.size > 1) - nsb = ppNaryType(nsb, fts, "(", ", ", ")", lvl) - else if (fts.size == 1) - nsb = pp(fts.head, nsb, lvl) - nsb.append(" => ") - pp(tt, nsb, lvl) - } case TupleType(tpes) => ppNaryType(sb, tpes, "(", ", ", ")", lvl) case c: ClassType => sb.append(c.classDef.id) case _ => sb.append("Type?") diff --git a/src/main/scala/leon/purescala/ScalaPrinter.scala b/src/main/scala/leon/purescala/ScalaPrinter.scala index d2059302c..b1cec54c5 100644 --- a/src/main/scala/leon/purescala/ScalaPrinter.scala +++ b/src/main/scala/leon/purescala/ScalaPrinter.scala @@ -137,23 +137,6 @@ object ScalaPrinter { sb.append(fd.id) ppNary(sb, args, "(", ", ", ")", lvl) } - case AnonymousFunction(es, ev) => { - sb.append("{") - es.foreach { - case (as, res) => - ppNary(sb, as, "", " ", "", lvl) - sb.append(" -> ") - pp(res, sb, lvl) - sb.append(", ") - } - sb.append("else -> ") - pp(ev, sb, lvl) - sb.append("}") - } - case AnonymousFunctionInvocation(id, args) => { - sb.append(id) - ppNary(sb, args, "(", ", ", ")", lvl) - } case Plus(l,r) => ppBinary(sb, l, r, " + ", lvl) case Minus(l,r) => ppBinary(sb, l, r, " - ", lvl) case Times(l,r) => ppBinary(sb, l, r, " * ", lvl) @@ -388,14 +371,6 @@ object ScalaPrinter { sb.append("Option[") pp(bt, sb, lvl) sb.append("]") - case FunctionType(fts, tt) => { - if (fts.size > 1) - ppNaryType(sb, fts, "(", ", ", ")", lvl) - else if (fts.size == 1) - pp(fts.head, sb, lvl) - sb.append(" => ") - pp(tt, sb, lvl) - } case TupleType(tpes) => ppNaryType(sb, tpes, "(", ", ", ")", lvl) case c: ClassType => sb.append(c.classDef.id) case _ => sb.append("Type?") diff --git a/src/main/scala/leon/purescala/TreeOps.scala b/src/main/scala/leon/purescala/TreeOps.scala index a38c557ae..10a74488f 100644 --- a/src/main/scala/leon/purescala/TreeOps.scala +++ b/src/main/scala/leon/purescala/TreeOps.scala @@ -331,7 +331,6 @@ object TreeOps { case u @ UnaryOperator(a,_) => compute(u, rec(a)) case i @ IfExpr(a1,a2,a3) => compute(i, combine(combine(rec(a1), rec(a2)), rec(a3))) case m @ MatchExpr(scrut, cses) => compute(m, (scrut +: cses.flatMap(_.expressions)).map(rec(_)).reduceLeft(combine)) - case a @ AnonymousFunction(es, ev) => compute(a, (es.flatMap(e => e._1 ++ Seq(e._2)) ++ Seq(ev)).map(rec(_)).reduceLeft(combine)) case c @ Choose(args, body) => compute(c, rec(body)) case t: Terminal => compute(t, convert(t)) case unhandled => scala.sys.error("Non-terminal case should be handled in treeCatamorphism: " + unhandled) @@ -362,7 +361,6 @@ object TreeOps { def compute(t: Expr, s: Set[Identifier]) = t match { case Let(i,_,_) => s -- Set(i) case MatchExpr(_, cses) => s -- (cses.map(_.pattern.binders).foldLeft(Set[Identifier]())((a, b) => a ++ b)) - case AnonymousFunctionInvocation(i,_) => s ++ Set[Identifier](i) case _ => s } treeCatamorphism(convert, combine, compute, expr) @@ -826,7 +824,6 @@ object TreeOps { CaseClass(ccd, fields.map(f => simplestValue(f.getType))) case SetType(baseType) => EmptySet(baseType).setType(tpe) case MapType(fromType, toType) => EmptyMap(fromType, toType).setType(tpe) - case FunctionType(fromTypes, toType) => AnonymousFunction(Seq.empty, simplestValue(toType)).setType(tpe) case _ => throw new Exception("I can't choose simplest value for type " + tpe) } diff --git a/src/main/scala/leon/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala index d69931e75..e8516fc9a 100644 --- a/src/main/scala/leon/purescala/Trees.scala +++ b/src/main/scala/leon/purescala/Trees.scala @@ -457,10 +457,6 @@ object Trees { case class Concat(list1: Expr, list2: Expr) extends Expr case class ListAt(list: Expr, index: Expr) extends Expr - /* Function operations */ - case class AnonymousFunction(entries: Seq[(Seq[Expr],Expr)], elseValue: Expr) extends Expr - case class AnonymousFunctionInvocation(id: Identifier, args: Seq[Expr]) extends Expr - /* Constraint programming */ case class Distinct(exprs: Seq[Expr]) extends Expr with FixedType { val fixedType = BooleanType diff --git a/src/main/scala/leon/purescala/TypeTrees.scala b/src/main/scala/leon/purescala/TypeTrees.scala index 7f3f20c29..3e834e0b0 100644 --- a/src/main/scala/leon/purescala/TypeTrees.scala +++ b/src/main/scala/leon/purescala/TypeTrees.scala @@ -146,16 +146,6 @@ object TypeTrees { case InfiniteSize => InfiniteSize case FiniteSize(n) => FiniteSize(n+1) } - case FunctionType(fts, tt) => { - val fromSizes = fts map domainSize - val toSize = domainSize(tt) - if (fromSizes.exists(_ == InfiniteSize) || toSize == InfiniteSize) - InfiniteSize - else { - val n = toSize.asInstanceOf[FiniteSize].size - FiniteSize(scala.math.pow(n, fromSizes.foldLeft(1)((acc, s) => acc * s.asInstanceOf[FiniteSize].size)).toInt) - } - } case c: ClassType => InfiniteSize } @@ -198,7 +188,6 @@ object TypeTrees { case class MultisetType(base: TypeTree) extends TypeTree case class MapType(from: TypeTree, to: TypeTree) extends TypeTree case class OptionType(base: TypeTree) extends TypeTree - case class FunctionType(from: List[TypeTree], to: TypeTree) extends TypeTree case class ArrayType(base: TypeTree) extends TypeTree sealed abstract class ClassType extends TypeTree { diff --git a/src/main/scala/leon/solvers/RandomSolver.scala b/src/main/scala/leon/solvers/RandomSolver.scala index f7c8ee3e9..da6731a73 100644 --- a/src/main/scala/leon/solvers/RandomSolver.scala +++ b/src/main/scala/leon/solvers/RandomSolver.scala @@ -76,7 +76,6 @@ class RandomSolver(context: LeonContext, val nbTrial: Option[Int] = None) extend case TupleType(bases) => sys.error("I don't know what to do") case MapType(from, to) => sys.error("I don't know what to do") case OptionType(base) => sys.error("I don't know what to do") - case f: FunctionType => sys.error("I don't know what to do") case _ => sys.error("Unexpected type: " + t) } diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index 759b9d749..7628c6acb 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -315,19 +315,6 @@ trait AbstractZ3Solver extends solvers.IncrementalSolverBuilder { arrayTupleSort } } - case ft @ FunctionType(fts, tt) => funSorts.get(ft) match { - case Some(s) => s - case None => { - val fss = fts map typeToSort - val ts = typeToSort(tt) - val (tupleSort, consFuncDecl, projFuncDecls) = z3.mkTupleSort(fts.map(_.toString).mkString("(",", ", ")"), fss: _*) - val funSort = z3.mkArraySort(tupleSort, ts) - funSorts += (ft -> funSort) - funDomainConstructors += (ft -> consFuncDecl) - funDomainSelectors += (ft -> projFuncDecls) - funSort - } - } case tt @ TupleType(tpes) => tupleSorts.get(tt) match { case Some(s) => s case None => { @@ -544,16 +531,6 @@ trait AbstractZ3Solver extends solvers.IncrementalSolverBuilder { val res = getLength(ar) res } - case AnonymousFunctionInvocation(id, args) => id.getType match { - case ft @ FunctionType(fts, tt) => { - val consFD = funDomainConstructors(ft) - val rid = rec(Variable(id)) - val rargs = args map rec - z3.mkSelect(rid, consFD(rargs: _*)) - } - case errorType => scala.sys.error("Unexpected type for function: " + (ex, errorType)) - } - case Distinct(exs) => z3.mkDistinct(exs.map(rec(_)): _*) case _ => { @@ -583,16 +560,6 @@ trait AbstractZ3Solver extends solvers.IncrementalSolverBuilder { } (if (singletons.isEmpty) EmptyMap(kt, vt) else FiniteMap(singletons.toSeq)).setType(expType.get) } - case funType @ Some(FunctionType(fts, tt)) => - model.getArrayValue(t) match { - case None => throw new CantTranslateException(t) - case Some((es, ev)) => - val entries: Seq[(Seq[Expr], Expr)] = es.toSeq.map(e => (e, z3.getASTKind(e._1))).collect { - case ((key, value), Z3AppAST(cons, args)) if cons == funDomainConstructors(funType.get) => ((args zip fts) map (p => rec(p._1, Some(p._2))), rec(value, Some(tt))) - } - val elseValue = rec(ev, Some(tt)) - AnonymousFunction(entries, elseValue).setType(expType.get) - } case Some(SetType(dt)) => model.getSetValue(t) match { case None => throw new CantTranslateException(t) -- GitLab