From 1249ca17488e86c4f8349083b645faf68c154093 Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Mon, 8 Aug 2016 15:05:13 +0200 Subject: [PATCH] Tidy up --- .../inox/solvers/smtlib/CVC4Target.scala | 29 ++++++----- .../inox/solvers/smtlib/SMTLIBSolver.scala | 10 ++-- .../inox/solvers/smtlib/SMTLIBTarget.scala | 8 +-- .../scala/inox/solvers/smtlib/Z3Target.scala | 52 ++++++++----------- 4 files changed, 46 insertions(+), 53 deletions(-) diff --git a/src/main/scala/inox/solvers/smtlib/CVC4Target.scala b/src/main/scala/inox/solvers/smtlib/CVC4Target.scala index 3936ea873..e9961b451 100644 --- a/src/main/scala/inox/solvers/smtlib/CVC4Target.scala +++ b/src/main/scala/inox/solvers/smtlib/CVC4Target.scala @@ -6,7 +6,7 @@ package smtlib import org.apache.commons.lang3.StringEscapeUtils -import _root_.smtlib.parser.Terms.{Identifier => SMTIdentifier, Forall => SMTForall, _} +import _root_.smtlib.parser.Terms.{Identifier => SMTIdentifier, _} import _root_.smtlib.parser.Commands._ import _root_.smtlib.interpreters.CVC4Interpreter import _root_.smtlib.theories.experimental.Sets @@ -156,19 +156,22 @@ trait CVC4Target extends SMTLIBTarget { } } - case SubsetOf(ss, s) => Sets.Subset(toSMT(ss), toSMT(s)) - case ElementOfSet(e, s) => Sets.Member(toSMT(e), toSMT(s)) - case SetDifference(a, b) => Sets.Setminus(toSMT(a), toSMT(b)) - case SetUnion(a, b) => Sets.Union(toSMT(a), toSMT(b)) - case SetIntersection(a, b) => Sets.Intersection(toSMT(a), toSMT(b)) - case StringLiteral(v) => - declareSort(StringType) - Strings.StringLit(StringEscapeUtils.escapeJava(v)) - case StringLength(a) => Strings.Length(toSMT(a)) - case StringConcat(a, b) => Strings.Concat(toSMT(a), toSMT(b)) + case SubsetOf(ss, s) => Sets.Subset(toSMT(ss), toSMT(s)) + case ElementOfSet(e, s) => Sets.Member(toSMT(e), toSMT(s)) + case SetDifference(a, b) => Sets.Setminus(toSMT(a), toSMT(b)) + case SetUnion(a, b) => Sets.Union(toSMT(a), toSMT(b)) + case SetIntersection(a, b) => Sets.Intersection(toSMT(a), toSMT(b)) + + /** String operations */ + case StringLiteral(v) => + declareSort(StringType) + Strings.StringLit(StringEscapeUtils.escapeJava(v)) + case StringLength(a) => Strings.Length(toSMT(a)) + case StringConcat(a, b) => Strings.Concat(toSMT(a), toSMT(b)) case SubString(a, start, Plus(start2, length)) if start == start2 => - Strings.Substring(toSMT(a),toSMT(start),toSMT(length)) - case SubString(a, start, end) => Strings.Substring(toSMT(a),toSMT(start),toSMT(Minus(end, start))) + Strings.Substring(toSMT(a),toSMT(start),toSMT(length)) + case SubString(a, start, end) => + Strings.Substring(toSMT(a),toSMT(start),toSMT(Minus(end, start))) case _ => super.toSMT(e) } diff --git a/src/main/scala/inox/solvers/smtlib/SMTLIBSolver.scala b/src/main/scala/inox/solvers/smtlib/SMTLIBSolver.scala index 4e3597e5a..2dd091e00 100644 --- a/src/main/scala/inox/solvers/smtlib/SMTLIBSolver.scala +++ b/src/main/scala/inox/solvers/smtlib/SMTLIBSolver.scala @@ -4,9 +4,9 @@ package inox package solvers package smtlib -import _root_.smtlib.parser.Commands.{Assert => SMTAssert, FunDef => SMTFunDef, _} +import _root_.smtlib.parser.Commands.{FunDef => SMTFunDef, _} import _root_.smtlib.parser.Terms.{Identifier => _, _} -import _root_.smtlib.parser.CommandsResponses.{Error => ErrorResponse, _} +import _root_.smtlib.parser.CommandsResponses._ trait SMTLIBSolver extends Solver with SMTLIBTarget { @@ -33,7 +33,7 @@ trait SMTLIBSolver extends Solver with SMTLIBTarget { variablesOf(expr).foreach(declareVariable) val term = toSMT(expr)(Map()) - emit(SMTAssert(term)) + emit(Assert(term)) } catch { case _ : SolverUnsupportedError => // Store that there was an error. Now all following check() @@ -44,7 +44,7 @@ trait SMTLIBSolver extends Solver with SMTLIBTarget { override def reset() = { emit(Reset(), rawOut = true) match { - case ErrorResponse(msg) => + case Error(msg) => reporter.warning(s"Failed to reset $name: $msg") throw new CantResetException(this) case _ => @@ -105,7 +105,7 @@ trait SMTLIBSolver extends Solver with SMTLIBTarget { } } - def checkAssumptions(config: Configuration)(assumptions: Set[Trees]): config.Response[Model, Cores] = ??? + def checkAssumptions(config: Configuration)(assumptions: Set[Trees]): config.Response[Model, Cores] = ??? //TODO def push(): Unit = { constructors.push() diff --git a/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala index 52c3ec00c..9077286e7 100644 --- a/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala +++ b/src/main/scala/inox/solvers/smtlib/SMTLIBTarget.scala @@ -4,7 +4,6 @@ package inox package solvers package smtlib -import inox.utils.Interruptible import utils._ import _root_.smtlib.common._ @@ -12,19 +11,16 @@ import _root_.smtlib.printer.{ RecursivePrinter => SMTPrinter } import _root_.smtlib.parser.Commands.{ Constructor => SMTConstructor, FunDef => SMTFunDef, - Assert => SMTAssert, _ } import _root_.smtlib.parser.Terms.{ Forall => SMTForall, - Exists => _, Identifier => SMTIdentifier, Let => SMTLet, _ } -import _root_.smtlib.parser.CommandsResponses.{ Error => ErrorResponse, _ } +import _root_.smtlib.parser.CommandsResponses._ import _root_.smtlib.theories.{Constructors => SmtLibConstructors, _} -import _root_.smtlib.theories.experimental._ import _root_.smtlib.interpreters.ProcessInterpreter trait SMTLIBTarget extends Interruptible with ADTManagers { @@ -94,7 +90,7 @@ trait SMTLIBTarget extends Interruptible with ADTManagers { o.flush() } interpreter.eval(cmd) match { - case err @ ErrorResponse(msg) if !hasError && !interrupted && !rawOut => + case err @ Error(msg) if !hasError && !interrupted && !rawOut => ctx.reporter.warning(s"Unexpected error from $targetName solver: $msg") //println(Thread.currentThread().getStackTrace.map(_.toString).take(10).mkString("\n")) // Store that there was an error. Now all following check() diff --git a/src/main/scala/inox/solvers/smtlib/Z3Target.scala b/src/main/scala/inox/solvers/smtlib/Z3Target.scala index 2a59c4a97..179262886 100644 --- a/src/main/scala/inox/solvers/smtlib/Z3Target.scala +++ b/src/main/scala/inox/solvers/smtlib/Z3Target.scala @@ -34,7 +34,19 @@ trait Z3Target extends SMTLIBTarget { protected val extSym = SSymbol("_") - protected var setSort: Option[SSymbol] = None + protected lazy val setSort: SSymbol = { + val s = SSymbol("Set") + val t = SSymbol("T") + + val arraySort = Sort( + SMTIdentifier(SSymbol("Array")), + Seq(Sort(SMTIdentifier(t)), BoolSort()) + ) + + val cmd = DefineSort(s, Seq(t), arraySort) + emit(cmd) + s + } override protected def declareSort(t: Type): Sort = { val tpe = normalizeType(t) @@ -42,7 +54,7 @@ trait Z3Target extends SMTLIBTarget { tpe match { case SetType(base) => super.declareSort(BooleanType) - declareSetSort(base) + Sort(SMTIdentifier(setSort), Seq(declareSort(base))) case BagType(base) => declareSort(MapType(base, IntegerType)) case _ => @@ -51,29 +63,8 @@ trait Z3Target extends SMTLIBTarget { } } - protected def declareSetSort(of: Type): Sort = { - setSort match { - case None => - val s = SSymbol("Set") - val t = SSymbol("T") - setSort = Some(s) - - val arraySort = Sort(SMTIdentifier(SSymbol("Array")), - Seq(Sort(SMTIdentifier(t)), BoolSort())) - - val cmd = DefineSort(s, Seq(t), arraySort) - emit(cmd) - - case _ => - } - - Sort(SMTIdentifier(setSort.get), Seq(declareSort(of))) - } - override protected def fromSMT(t: Term, otpe: Option[Type] = None) (implicit lets: Map[SSymbol, Term], letDefs: Map[SSymbol, DefineFun]): Expr = { - - (t, otpe) match { case (QualifiedIdentifier(ExtendedIdentifier(SSymbol("as-array"), k: SSymbol), _), Some(tpe)) => if (letDefs contains k) { @@ -113,8 +104,7 @@ trait Z3Target extends SMTLIBTarget { * ===== Set operations ===== */ case fs @ FiniteSet(elems, base) => - val st @ SetType(base) = fs.getType - declareSort(st) + declareSort(fs.getType) toSMT(FiniteMap(elems map ((_, BooleanLiteral(true))), BooleanLiteral(false), BooleanType)) case SubsetOf(ss, s) => @@ -151,8 +141,10 @@ trait Z3Target extends SMTLIBTarget { val bid = FreshIdentifier("b", true) val eid = FreshIdentifier("e", true) val (bSym, eSym) = (id2sym(bid), id2sym(eid)) - SMTLet(VarBinding(bSym, toSMT(b)), Seq(VarBinding(eSym, toSMT(e))), ArraysEx.Store(bSym, eSym, - Ints.Add(ArraysEx.Select(bSym, eSym), Ints.NumeralLit(1)))) + SMTLet( + VarBinding(bSym, toSMT(b)), Seq(VarBinding(eSym, toSMT(e))), + ArraysEx.Store(bSym, eSym, Ints.Add(ArraysEx.Select(bSym, eSym), Ints.NumeralLit(1))) + ) case MultiplicityInBag(e, b) => ArraysEx.Select(toSMT(b), toSMT(e)) @@ -175,8 +167,10 @@ trait Z3Target extends SMTLIBTarget { val all2 = ArrayConst(declareSort(IntegerType), Ints.NumeralLit(2)) - SMTLet(VarBinding(dSym, ArrayMap(minus, toSMT(b1), toSMT(b2))), Seq(), - ArrayMap(div, ArrayMap(plus, dSym, ArrayMap(abs, dSym)), all2)) + SMTLet( + VarBinding(dSym, ArrayMap(minus, toSMT(b1), toSMT(b2))), Seq(), + ArrayMap(div, ArrayMap(plus, dSym, ArrayMap(abs, dSym)), all2) + ) case _ => super.toSMT(e) -- GitLab