diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala index d14b02f95c5b63f287d5b685bf73545748dd6980..69f95f45559737bfd895989aba010dbc0667bb3a 100644 --- a/src/main/scala/leon/codegen/CompilationUnit.scala +++ b/src/main/scala/leon/codegen/CompilationUnit.scala @@ -315,8 +315,8 @@ class CompilationUnit(val ctx: LeonContext, val k = jvmToValue(entry.getKey, from) val v = jvmToValue(entry.getValue, to) (k, v) - } - FiniteMap(pairs.toSeq, from, to) + }.toMap + FiniteMap(pairs, from, to) case (lambda: runtime.Lambda, _: FunctionType) => val cls = lambda.getClass diff --git a/src/main/scala/leon/datagen/VanuatooDataGen.scala b/src/main/scala/leon/datagen/VanuatooDataGen.scala index b742ec58f68dc34b35cd2e093578c4e19b2462ef..e68e21f011f3936797157688901018923c2127bf 100644 --- a/src/main/scala/leon/datagen/VanuatooDataGen.scala +++ b/src/main/scala/leon/datagen/VanuatooDataGen.scala @@ -99,7 +99,7 @@ class VanuatooDataGen(ctx: LeonContext, p: Program) extends DataGenerator { val cs = for (size <- List(0, 1, 2, 5)) yield { val subs = (1 to size).flatMap(i => List(from, to)).toList - Constructor[Expr, TypeTree](subs, mt, s => FiniteMap(s.grouped(2).map(t => (t(0), t(1))).toSeq, from, to), mt.asString(ctx)+"@"+size) + Constructor[Expr, TypeTree](subs, mt, s => FiniteMap(s.grouped(2).map(t => (t(0), t(1))).toMap, from, to), mt.asString(ctx)+"@"+size) } constructors += mt -> cs cs diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala index bd2a594ec873a079e58be27852d1c3e223f55130..f17f9caefb644bfb08c1c5d9b7a429c2f408a872 100644 --- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala +++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala @@ -603,26 +603,24 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int ) case f @ FiniteMap(ss, kT, vT) => - FiniteMap(ss.map{ case (k, v) => (e(k), e(v)) }.distinct, kT, vT) + FiniteMap(ss.map{ case (k, v) => (e(k), e(v)) }, kT, vT) case g @ MapApply(m,k) => (e(m), e(k)) match { - case (FiniteMap(ss, _, _), e) => ss.find(_._1 == e) match { - case Some((_, v0)) => v0 - case None => throw RuntimeError("Key not found: " + e.asString) - } - case (l,r) => throw EvalError(typeErrorMsg(l, MapType(r.getType, g.getType))) + case (FiniteMap(ss, _, _), e) => + ss.getOrElse(e, throw RuntimeError("Key not found: " + e.asString)) + case (l,r) => + throw EvalError(typeErrorMsg(l, MapType(r.getType, g.getType))) } case u @ MapUnion(m1,m2) => (e(m1), e(m2)) match { - case (f1@FiniteMap(ss1, _, _), FiniteMap(ss2, _, _)) => { - val filtered1 = ss1.filterNot(s1 => ss2.exists(s2 => s2._1 == s1._1)) - val newSs = filtered1 ++ ss2 + case (f1@FiniteMap(ss1, _, _), FiniteMap(ss2, _, _)) => + val newSs = ss1 ++ ss2 val MapType(kT, vT) = u.getType FiniteMap(newSs, kT, vT) - } - case (l, r) => throw EvalError(typeErrorMsg(l, m1.getType)) + case (l, r) => + throw EvalError(typeErrorMsg(l, m1.getType)) } case i @ MapIsDefinedAt(m,k) => (e(m), e(k)) match { - case (FiniteMap(ss, _, _), e) => BooleanLiteral(ss.exists(_._1 == e)) + case (FiniteMap(ss, _, _), e) => BooleanLiteral(ss.contains(e)) case (l, r) => throw EvalError(typeErrorMsg(l, m.getType)) } diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala index be64c2f7776cb60917a0315482562c87e96447fc..9fa7606da23741a13f4d705374f867c23957fc53 100644 --- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala +++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala @@ -1329,10 +1329,10 @@ trait CodeExtraction extends ASTExtractors { Forall(vds, exBody) case ExFiniteMap(tptFrom, tptTo, args) => - val singletons: Seq[(LeonExpr, LeonExpr)] = args.collect { + val singletons = args.collect { case ExTuple(tpes, trees) if trees.size == 2 => (extractTree(trees(0)), extractTree(trees(1))) - } + }.toMap if (singletons.size != args.size) { outOfSubsetError(tr, "Some map elements could not be extracted as Tuple2") @@ -1678,17 +1678,17 @@ trait CodeExtraction extends ASTExtractors { MapIsDefinedAt(a1, a2) case (IsTyped(a1, mt: MapType), "updated", List(k, v)) => - MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to)) + MapUnion(a1, FiniteMap(Map(k -> v), mt.from, mt.to)) case (IsTyped(a1, mt: MapType), "+", List(k, v)) => - MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to)) + MapUnion(a1, FiniteMap(Map(k -> v), mt.from, mt.to)) case (IsTyped(a1, mt: MapType), "+", List(IsTyped(kv, TupleType(List(_, _))))) => kv match { case Tuple(List(k, v)) => - MapUnion(a1, FiniteMap(Seq((k, v)), mt.from, mt.to)) + MapUnion(a1, FiniteMap(Map(k -> v), mt.from, mt.to)) case kv => - MapUnion(a1, FiniteMap(Seq((TupleSelect(kv, 1), TupleSelect(kv, 2))), mt.from, mt.to)) + MapUnion(a1, FiniteMap(Map(TupleSelect(kv, 1) -> TupleSelect(kv, 2)), mt.from, mt.to)) } case (IsTyped(a1, mt1: MapType), "++", List(IsTyped(a2, mt2: MapType))) if mt1 == mt2 => diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala index 2f703312a0f1e064ed9af3d1f6f094d5d6f96bbc..200a9e167e8d70e076b9d13fc7c301331e127138 100644 --- a/src/main/scala/leon/purescala/ExprOps.scala +++ b/src/main/scala/leon/purescala/ExprOps.scala @@ -1107,7 +1107,7 @@ object ExprOps { case BooleanType => BooleanLiteral(false) case UnitType => UnitLiteral() case SetType(baseType) => FiniteSet(Set(), baseType) - case MapType(fromType, toType) => FiniteMap(Nil, fromType, toType) + case MapType(fromType, toType) => FiniteMap(Map(), fromType, toType) case TupleType(tpes) => Tuple(tpes.map(simplestValue)) case ArrayType(tpe) => EmptyArray(tpe) @@ -1304,7 +1304,7 @@ object ExprOps { case wp: WildcardPattern => 1 case _ => - 1 + (if(p.binder.isDefined) 1 else 0) + p.subPatterns.map(patternSize).sum + 1 + p.binder.size + p.subPatterns.map(patternSize).sum } def formulaSize(e: Expr): Int = e match { diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala index 3db4d0bb7628f527dc125d9ac3deba238906244e..7216652a427e6784142a17f69c730fa61e2ff0aa 100644 --- a/src/main/scala/leon/purescala/Expressions.scala +++ b/src/main/scala/leon/purescala/Expressions.scala @@ -788,7 +788,7 @@ object Expressions { /* Map operations */ /** $encodingof `Map[keyType, valueType](key1 -> value1, key2 -> value2 ...)` */ - case class FiniteMap(singletons: Seq[(Expr, Expr)], keyType: TypeTree, valueType: TypeTree) extends Expr { + case class FiniteMap(pairs: Map[Expr, Expr], keyType: TypeTree, valueType: TypeTree) extends Expr { val getType = MapType(keyType, valueType).unveilUntyped } /** $encodingof `map.apply(key)` (or `map(key)`)*/ diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala index d2ccfa7da010c732fdf3784b614a218e6198fada..cd57d2187fe0cd59d45e3d88e17b0926e2279412 100644 --- a/src/main/scala/leon/purescala/Extractors.scala +++ b/src/main/scala/leon/purescala/Extractors.scala @@ -159,12 +159,12 @@ object Extractors { case FiniteSet(els, base) => Some((els.toSeq, els => FiniteSet(els.toSet, base))) case FiniteMap(args, f, t) => { - val subArgs = args.flatMap { case (k, v) => Seq(k, v) } + val subArgs = args.flatMap { case (k, v) => Seq(k, v) }.toSeq val builder = (as: Seq[Expr]) => { - def rec(kvs: Seq[Expr]): Seq[(Expr, Expr)] = kvs match { + def rec(kvs: Seq[Expr]): Map[Expr, Expr] = kvs match { case Seq(k, v, t@_*) => - (k, v) +: rec(t) - case Seq() => Seq() + Map(k -> v) ++ rec(t) + case Seq() => Map() case _ => sys.error("odd number of key/value expressions") } FiniteMap(rec(as), f, t) diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala index 620a294edf2ef6b6df0c60d697380958f7ccc23d..cb1c3246d7eff487e00904c3acbd61d7068aa316 100644 --- a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala +++ b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4Target.scala @@ -63,7 +63,7 @@ trait SMTLIBCVC4Target extends SMTLIBTarget { RawArrayValue(tupleTypeWrap(from), Map(), fromSMT(elem, to)) case MapType(k, v) => - FiniteMap(Nil, k, v) + FiniteMap(Map(), k, v) } @@ -76,7 +76,7 @@ trait SMTLIBCVC4Target extends SMTLIBTarget { RawArrayValue(tupleTypeWrap(from), Map(), fromSMT(elem, to)) case MapType(k, v) => - FiniteMap(Nil, k, v) + FiniteMap(Map(), k, v) } @@ -92,7 +92,7 @@ trait SMTLIBCVC4Target extends SMTLIBTarget { case MapType(k, v) => val FiniteMap(elems, k, v) = fromSMT(arr, otpe) - FiniteMap(elems :+ (fromSMT(key, k) -> fromSMT(elem, v)), k, v) + FiniteMap(elems + (fromSMT(key, k) -> fromSMT(elem, v)), k, v) } case (FunctionApplication(SimpleSymbol(SSymbol("singleton")), elems), Some(SetType(base))) => diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala index 952dbeadc9f862dea9c4653a651da8838e7ade31..9035700a0f12120da6086be426334622017f2b37 100644 --- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala +++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala @@ -213,7 +213,7 @@ trait SMTLIBTarget extends Interruptible { val elems = r.elems.flatMap { case (k, CaseClass(leonSome, Seq(x))) => Some(k -> x) case (k, _) => None - }.toSeq + }.toMap FiniteMap(elems, from, to) case other => diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index abf4e41693436fc61e76b53977e8fbf57a62999b..9a06cff266e221b0459b7d23e9417b4940ec5743 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -658,7 +658,7 @@ trait AbstractZ3Solver extends Solver { val elems = r.elems.flatMap { case (k, CaseClass(leonSome, Seq(x))) => Some(k -> x) case (k, _) => None - }.toSeq + }.toMap FiniteMap(elems, from, to) } diff --git a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala index 6eaf481381b7d433a0566c9433a077e026399e5e..810d9d40edfd4aaf18c7c54aff0a579db600f2db 100644 --- a/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala +++ b/src/test/scala/leon/integration/evaluators/EvaluatorSuite.scala @@ -6,17 +6,10 @@ import leon._ import leon.test._ import leon.test.helpers._ import leon.evaluators._ - -import leon.utils.{TemporaryInputPhase, PreprocessingPhase} -import leon.frontends.scalac.ExtractionPhase - import leon.purescala.Common._ import leon.purescala.Definitions._ import leon.purescala.Expressions._ -import leon.purescala.DefOps._ import leon.purescala.Types._ -import leon.purescala.Extractors._ -import leon.purescala.Constructors._ import leon.codegen._ class EvaluatorSuite extends LeonTestSuiteWithProgram with ExpressionsDSL { @@ -292,8 +285,6 @@ class EvaluatorSuite extends LeonTestSuiteWithProgram with ExpressionsDSL { fail("Expected FiniteMap, got "+e) } - val em = FiniteMap(Seq(), Int32Type, Int32Type) - for(e <- allEvaluators) { eqMap(eval(e, fcall("Maps.finite0")()).res, Map()) eqMap(eval(e, fcall("Maps.finite1")()).res, Map(i(1) -> i(2)))