From ff2a3de247a7761b9f5d2882d2a2804f07cb8374 Mon Sep 17 00:00:00 2001 From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch> Date: Mon, 7 Mar 2016 16:46:16 +0100 Subject: [PATCH] Move Printable to core leon package. More classes implement it --- src/main/scala/leon/Printable.scala | 8 ++++++++ src/main/scala/leon/purescala/Printable.scala | 7 ------- src/main/scala/leon/solvers/ADTManager.scala | 4 ++-- src/main/scala/leon/solvers/Model.scala | 3 ++- src/main/scala/leon/solvers/templates/UnrollingBank.scala | 1 - src/main/scala/leon/solvers/z3/FairZ3Solver.scala | 1 - src/main/scala/leon/synthesis/CostModel.scala | 2 +- src/main/scala/leon/synthesis/InOutExample.scala | 3 +-- src/main/scala/leon/synthesis/Problem.scala | 4 ++-- src/main/scala/leon/synthesis/Rules.scala | 4 ++-- src/main/scala/leon/synthesis/Solution.scala | 2 +- src/main/scala/leon/synthesis/graph/Graph.scala | 2 +- .../leon/synthesis/strategies/CostBasedStrategy.scala | 2 +- src/main/scala/leon/utils/FreeableIterator.scala | 2 ++ 14 files changed, 23 insertions(+), 22 deletions(-) create mode 100644 src/main/scala/leon/Printable.scala delete mode 100644 src/main/scala/leon/purescala/Printable.scala diff --git a/src/main/scala/leon/Printable.scala b/src/main/scala/leon/Printable.scala new file mode 100644 index 000000000..cbe2e8ed9 --- /dev/null +++ b/src/main/scala/leon/Printable.scala @@ -0,0 +1,8 @@ +/* Copyright 2009-2015 EPFL, Lausanne */ + +package leon + +/** A trait for objects that can be pretty-printed given a [[leon.LeonContext]] */ +trait Printable { + def asString(implicit ctx: LeonContext): String +} diff --git a/src/main/scala/leon/purescala/Printable.scala b/src/main/scala/leon/purescala/Printable.scala deleted file mode 100644 index 27be03538..000000000 --- a/src/main/scala/leon/purescala/Printable.scala +++ /dev/null @@ -1,7 +0,0 @@ -package leon -package purescala - - -trait Printable { - def asString(implicit ctx: LeonContext): String -} diff --git a/src/main/scala/leon/solvers/ADTManager.scala b/src/main/scala/leon/solvers/ADTManager.scala index e811feaa1..fada59c17 100644 --- a/src/main/scala/leon/solvers/ADTManager.scala +++ b/src/main/scala/leon/solvers/ADTManager.scala @@ -6,12 +6,12 @@ package solvers import purescala.Types._ import purescala.Common._ -case class DataType(sym: Identifier, cases: Seq[Constructor]) { +case class DataType(sym: Identifier, cases: Seq[Constructor]) extends Printable { def asString(implicit ctx: LeonContext) = { "Datatype: "+sym.asString+"\n"+cases.map(c => " - "+c.asString(ctx)).mkString("\n") } } -case class Constructor(sym: Identifier, tpe: TypeTree, fields: Seq[(Identifier, TypeTree)]) { +case class Constructor(sym: Identifier, tpe: TypeTree, fields: Seq[(Identifier, TypeTree)]) extends Printable { def asString(implicit ctx: LeonContext) = { sym.asString(ctx)+" ["+tpe.asString(ctx)+"] "+fields.map(f => f._1.asString(ctx)+": "+f._2.asString(ctx)).mkString("(", ", ", ")") } diff --git a/src/main/scala/leon/solvers/Model.scala b/src/main/scala/leon/solvers/Model.scala index 57f93655f..59b6c9064 100644 --- a/src/main/scala/leon/solvers/Model.scala +++ b/src/main/scala/leon/solvers/Model.scala @@ -9,7 +9,8 @@ import purescala.Quantification.Domains import purescala.ExprOps._ trait AbstractModel[+This <: Model with AbstractModel[This]] - extends scala.collection.IterableLike[(Identifier, Expr), This] { + extends scala.collection.IterableLike[(Identifier, Expr), This] + with Printable { protected val mapping: Map[Identifier, Expr] diff --git a/src/main/scala/leon/solvers/templates/UnrollingBank.scala b/src/main/scala/leon/solvers/templates/UnrollingBank.scala index cb7fe90d2..1866fc72b 100644 --- a/src/main/scala/leon/solvers/templates/UnrollingBank.scala +++ b/src/main/scala/leon/solvers/templates/UnrollingBank.scala @@ -4,7 +4,6 @@ package leon package solvers package templates -import purescala.Printable import purescala.Common._ import purescala.Expressions._ import purescala.Types._ diff --git a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala index 5c12fd386..ee6197774 100644 --- a/src/main/scala/leon/solvers/z3/FairZ3Solver.scala +++ b/src/main/scala/leon/solvers/z3/FairZ3Solver.scala @@ -7,7 +7,6 @@ package z3 import utils._ import _root_.z3.scala._ -import purescala.Printable import purescala.Common._ import purescala.Definitions._ import purescala.Expressions._ diff --git a/src/main/scala/leon/synthesis/CostModel.scala b/src/main/scala/leon/synthesis/CostModel.scala index bc5873392..8449d37a5 100644 --- a/src/main/scala/leon/synthesis/CostModel.scala +++ b/src/main/scala/leon/synthesis/CostModel.scala @@ -23,7 +23,7 @@ case class Cost(minSize: Int) extends AnyVal with Ordered[Cost] { this.minSize-that.minSize } - def asString: String = { + override def toString: String = { f"$minSize%3d" } } diff --git a/src/main/scala/leon/synthesis/InOutExample.scala b/src/main/scala/leon/synthesis/InOutExample.scala index ae6e24bbc..3340816aa 100644 --- a/src/main/scala/leon/synthesis/InOutExample.scala +++ b/src/main/scala/leon/synthesis/InOutExample.scala @@ -4,9 +4,8 @@ package leon package synthesis import purescala.Expressions._ -import leon.utils.ASCIIHelpers._ -sealed abstract class Example { +sealed abstract class Example extends Printable { def ins: Seq[Expr] def asString(implicit ctx: LeonContext) = { diff --git a/src/main/scala/leon/synthesis/Problem.scala b/src/main/scala/leon/synthesis/Problem.scala index f51fe3dd5..d59d956e9 100644 --- a/src/main/scala/leon/synthesis/Problem.scala +++ b/src/main/scala/leon/synthesis/Problem.scala @@ -21,7 +21,7 @@ import Witnesses._ * @param phi The formula on `as` and `xs` to satisfy * @param xs The list of output identifiers for which we want to compute a function */ -case class Problem(as: List[Identifier], ws: Expr, pc: Expr, phi: Expr, xs: List[Identifier], eb: ExamplesBank = ExamplesBank.empty) { +case class Problem(as: List[Identifier], ws: Expr, pc: Expr, phi: Expr, xs: List[Identifier], eb: ExamplesBank = ExamplesBank.empty) extends Printable { def inType = tupleTypeWrap(as.map(_.getType)) def outType = tupleTypeWrap(xs.map(_.getType)) @@ -35,7 +35,7 @@ case class Problem(as: List[Identifier], ws: Expr, pc: Expr, phi: Expr, xs: List | ${pcws.asString} ≺ | ⟨ ${phi.asString} ⟩ | ${if (xs.nonEmpty) xs.map(_.asString).mkString(", ") else "()"} - |⟧ """.stripMargin + ebInfo + |⟧ $ebInfo""".stripMargin } def withWs(es: Seq[Expr]) = { diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index 6f8b3781d..f3019de65 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -11,7 +11,7 @@ import purescala.Constructors._ import rules._ /** A Rule can be applied on a synthesis problem */ -abstract class Rule(val name: String) extends RuleDSL { +abstract class Rule(val name: String) extends RuleDSL with Printable { def instantiateOn(implicit hctx: SearchContext, problem: Problem): Traversable[RuleInstantiation] val priority: RulePriority = RulePriorityDefault @@ -78,7 +78,7 @@ object Rules { /** When applying this to a [SearchContext] it returns a wrapped stream of solutions or a new list of problems. */ abstract class RuleInstantiation(val description: String, val onSuccess: SolutionBuilder = SolutionBuilderCloser()) - (implicit val problem: Problem, val rule: Rule) { + (implicit val problem: Problem, val rule: Rule) extends Printable { def apply(hctx: SearchContext): RuleApplication diff --git a/src/main/scala/leon/synthesis/Solution.scala b/src/main/scala/leon/synthesis/Solution.scala index 24a518fa9..428df1ee6 100644 --- a/src/main/scala/leon/synthesis/Solution.scala +++ b/src/main/scala/leon/synthesis/Solution.scala @@ -14,7 +14,7 @@ import leon.utils.Simplifiers // Defines a synthesis solution of the form: // ⟨ P | T ⟩ -class Solution(val pre: Expr, val defs: Set[FunDef], val term: Expr, val isTrusted: Boolean = true) { +class Solution(val pre: Expr, val defs: Set[FunDef], val term: Expr, val isTrusted: Boolean = true) extends Printable { def asString(implicit ctx: LeonContext) = { "⟨ "+pre.asString+" | "+defs.map(_.asString).mkString(" ")+" "+term.asString+" ⟩" diff --git a/src/main/scala/leon/synthesis/graph/Graph.scala b/src/main/scala/leon/synthesis/graph/Graph.scala index 3bb9fbff9..2af026aaa 100644 --- a/src/main/scala/leon/synthesis/graph/Graph.scala +++ b/src/main/scala/leon/synthesis/graph/Graph.scala @@ -27,7 +27,7 @@ sealed class Graph(problem: Problem) { } } -sealed abstract class Node(val parent: Option[Node]) { +sealed abstract class Node(val parent: Option[Node]) extends Printable { def asString(implicit ctx: LeonContext): String diff --git a/src/main/scala/leon/synthesis/strategies/CostBasedStrategy.scala b/src/main/scala/leon/synthesis/strategies/CostBasedStrategy.scala index 70ccc90ab..e309593fe 100644 --- a/src/main/scala/leon/synthesis/strategies/CostBasedStrategy.scala +++ b/src/main/scala/leon/synthesis/strategies/CostBasedStrategy.scala @@ -90,5 +90,5 @@ class CostBasedStrategy(ctx: LeonContext, cm: CostModel) extends Strategy { recomputeCost(n) } - def debugInfoFor(n: Node) = bestCosts.get(n).map(_.asString).getOrElse("?") + def debugInfoFor(n: Node) = bestCosts.get(n).map(_.toString).getOrElse("?") } diff --git a/src/main/scala/leon/utils/FreeableIterator.scala b/src/main/scala/leon/utils/FreeableIterator.scala index a790b2dbf..b288dcae4 100644 --- a/src/main/scala/leon/utils/FreeableIterator.scala +++ b/src/main/scala/leon/utils/FreeableIterator.scala @@ -1,3 +1,5 @@ +/* Copyright 2009-2015 EPFL, Lausanne */ + package leon package utils -- GitLab