From 395244dc3a02201cddc93ece9ea3a821a2d87cef Mon Sep 17 00:00:00 2001 From: Nicolas Voirol <voirol.nicolas@gmail.com> Date: Mon, 22 Feb 2016 15:07:34 +0100 Subject: [PATCH] Finishing up ADT invariants --- .../leon/solvers/templates/DatatypeManager.scala | 5 +++++ .../leon/solvers/templates/LambdaManager.scala | 7 +------ .../leon/solvers/templates/TemplateManager.scala | 13 +++++++------ .../scala/leon/solvers/z3/AbstractZ3Solver.scala | 2 +- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/scala/leon/solvers/templates/DatatypeManager.scala b/src/main/scala/leon/solvers/templates/DatatypeManager.scala index 8f9c2202a..365fe85ff 100644 --- a/src/main/scala/leon/solvers/templates/DatatypeManager.scala +++ b/src/main/scala/leon/solvers/templates/DatatypeManager.scala @@ -20,6 +20,11 @@ import Template._ import scala.collection.mutable.{Map => MutableMap, Set => MutableSet} +case class FreshFunction(expr: Expr) extends Expr with Extractable { + val getType = BooleanType + val extract = Some(Seq(expr), (exprs: Seq[Expr]) => FreshFunction(exprs.head)) +} + object DatatypeTemplate { def apply[T]( diff --git a/src/main/scala/leon/solvers/templates/LambdaManager.scala b/src/main/scala/leon/solvers/templates/LambdaManager.scala index edb096ef2..647c75a69 100644 --- a/src/main/scala/leon/solvers/templates/LambdaManager.scala +++ b/src/main/scala/leon/solvers/templates/LambdaManager.scala @@ -24,11 +24,6 @@ case class App[T](caller: T, tpe: FunctionType, args: Seq[Arg[T]], encoded: T) { override def toString = "(" + caller + " : " + tpe + ")" + args.map(_.encoded).mkString("(", ",", ")") } -case class FreshFunction(expr: Expr) extends Expr with Extractable { - val getType = BooleanType - val extract = Some(Seq(expr), (exprs: Seq[Expr]) => FreshFunction(exprs.head)) -} - object LambdaTemplate { def apply[T]( @@ -238,7 +233,7 @@ class LambdaManager[T](encoder: TemplateEncoder[T]) extends DatatypeManager(enco neqClauses ++ extClauses } - def assumptions: Seq[T] = freeBlockers.flatMap(_._2.map(p => encoder.mkNot(p._2))).toSeq + def assumptions: Seq[T] = freeBlockers.toSeq.flatMap(_._2.map(p => encoder.mkNot(p._1))) private val typeBlockers = new IncrementalMap[T, T]() private val typeEnablers: MutableSet[T] = MutableSet.empty diff --git a/src/main/scala/leon/solvers/templates/TemplateManager.scala b/src/main/scala/leon/solvers/templates/TemplateManager.scala index 62a3f0c76..56c8e6211 100644 --- a/src/main/scala/leon/solvers/templates/TemplateManager.scala +++ b/src/main/scala/leon/solvers/templates/TemplateManager.scala @@ -159,18 +159,19 @@ object Template { var clauses: Seq[T] = Seq.empty val cleanGuarded = guardedExprs.map { case (b, es) => b -> es.map { e => + def clean(expr: Expr): Expr = postMap { + case FreshFunction(f) => Some(BooleanLiteral(true)) + case _ => None + } (expr) + val withPaths = CollectorWithPaths { case FreshFunction(f) => f }.traverse(e) functions ++= withPaths.map { case (f, TopLevelAnds(paths)) => val tpe = bestRealType(f.getType).asInstanceOf[FunctionType] - val path = andJoin(paths.filterNot(_.isInstanceOf[FreshFunction])) + val path = andJoin(paths.map(clean)) (encodeExpr(and(Variable(b), path)), tpe, encodeExpr(f)) } - val cleanExpr = postMap { - case FreshFunction(f) => Some(BooleanLiteral(true)) - case _ => None - } (e) - + val cleanExpr = clean(e) clauses :+= encodeExpr(Implies(Variable(b), cleanExpr)) cleanExpr }} diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala index 3cadf39a6..7ae02d83e 100644 --- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala @@ -257,7 +257,7 @@ trait AbstractZ3Solver extends Solver { } case other => - throw SolverUnsupportedError(other, this) + unsupported(other) } protected[leon] def toZ3Formula(expr: Expr, initialMap: Map[Identifier, Z3AST] = Map.empty): Z3AST = { -- GitLab