From 47c5debaa0390ca2be34ad3a78d4ad7e26397d9f Mon Sep 17 00:00:00 2001 From: Etienne Kneuss <ekneuss@gmail.com> Date: Mon, 22 Oct 2012 15:49:32 +0200 Subject: [PATCH] Plop --- src/main/scala/leon/purescala/Trees.scala | 9 +++++++ src/main/scala/leon/synthesis/Main.scala | 5 +++- src/main/scala/leon/synthesis/Rules.scala | 26 ++++++++++--------- .../scala/leon/synthesis/Synthesizer.scala | 5 ++-- src/main/scala/leon/synthesis/Task.scala | 7 +++-- 5 files changed, 35 insertions(+), 17 deletions(-) diff --git a/src/main/scala/leon/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala index 259ce7911..04db1ab18 100644 --- a/src/main/scala/leon/purescala/Trees.scala +++ b/src/main/scala/leon/purescala/Trees.scala @@ -179,6 +179,15 @@ object Trees { val fixedType = BooleanType } + object TopLevelAnds { // expr1 AND (expr2 AND (expr3 AND ..)) => List(expr1, expr2, expr3) + def unapply(e: Expr): Option[Seq[Expr]] = e match { + case And(exprs) => + Some(exprs.flatMap(unapply(_).flatten)) + case e => + Some(Seq(e)) + } + } + object Or { def apply(l: Expr, r: Expr) : Expr = (l,r) match { case (BooleanLiteral(false),_) => r diff --git a/src/main/scala/leon/synthesis/Main.scala b/src/main/scala/leon/synthesis/Main.scala index a8ed6de21..10520ef26 100644 --- a/src/main/scala/leon/synthesis/Main.scala +++ b/src/main/scala/leon/synthesis/Main.scala @@ -3,7 +3,10 @@ package synthesis object Main { def main(args : Array[String]) { - new Synthesizer(new DefaultReporter).test() + val reporter = new DefaultReporter + val solvers = List(new TrivialSolver(reporter)) + + new Synthesizer(reporter, solvers).test() } } diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala index 8eca81ad7..0472c87ec 100644 --- a/src/main/scala/leon/synthesis/Rules.scala +++ b/src/main/scala/leon/synthesis/Rules.scala @@ -6,29 +6,25 @@ import purescala.Trees._ object Rules { def all(synth: Synthesizer) = List( - OnePoint(synth) + new OnePoint(synth), + new Ground(synth) ) } -abstract class Rule(val name: String) { +abstract class Rule(val name: String, val synth: Synthesizer) { def isApplicable(p: Problem, parent: Task): List[Task] - def subst(what: Tuple2[Identifier, Expr], in: Expr): Expr = replace(Map(Variable(what._1) -> what._2), in) + + override def toString = name } -case class OnePoint(synth: Synthesizer) extends Rule("One-point") { +class OnePoint(synth: Synthesizer) extends Rule("One-point", synth) { def isApplicable(p: Problem, parent: Task): List[Task] = { p.phi match { - case a : And => - def collectAnds(e: Expr): List[Expr] = e match { - case And(exs) => exs.toList.flatMap(collectAnds) - case e => List(e) - } - - val exprs = collectAnds(a) + case TopLevelAnds(exprs) => val candidates = exprs.collect { case eq @ Equals(Variable(x), e) if (p.xs contains x) && !(variablesOf(e) contains x) => (x, e, eq) @@ -54,7 +50,7 @@ case class OnePoint(synth: Synthesizer) extends Rule("One-point") { case _ => Solution.none } - List(new Task(synth, parent, p, List(newProblem), onSuccess, 100)) + List(new Task(synth, parent, this, p, List(newProblem), onSuccess, 100)) } else { Nil } @@ -65,3 +61,9 @@ case class OnePoint(synth: Synthesizer) extends Rule("One-point") { } } } + +class Ground(synth: Synthesizer) extends Rule("Ground", synth) { + def isApplicable(p: Problem, parent: Task): List[Task] = { + Nil + } +} diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala index e1e8da942..3f7ba6a85 100644 --- a/src/main/scala/leon/synthesis/Synthesizer.scala +++ b/src/main/scala/leon/synthesis/Synthesizer.scala @@ -2,10 +2,11 @@ package leon package synthesis import purescala.Definitions.Program +import Extensions.Solver import collection.mutable.PriorityQueue -class Synthesizer(val r: Reporter) { +class Synthesizer(val r: Reporter, val solvers: List[Solver]) { import r.{error,warning,info,fatalError} private[this] var solution: Solution = null @@ -50,7 +51,7 @@ class Synthesizer(val r: Reporter) { task.subSucceeded(sp, sol) } else { info(" => Possible Next Steps:") - alternatives.foreach(a => info(" - "+a)) + alternatives.foreach(t => info(" - "+t.description)) } } } diff --git a/src/main/scala/leon/synthesis/Task.scala b/src/main/scala/leon/synthesis/Task.scala index be0d75624..7941afea6 100644 --- a/src/main/scala/leon/synthesis/Task.scala +++ b/src/main/scala/leon/synthesis/Task.scala @@ -4,6 +4,7 @@ package synthesis class Task( val synth: Synthesizer, val parent: Task, + val rule: Rule, val problem: Problem, val subProblems: List[Problem], val onSuccess: List[Solution] => Solution, @@ -38,7 +39,9 @@ class Task( } } - override def toString = subProblems.map(p => (p, !subSolutions.get(p).isEmpty)).map{ case (p, isSolved) => p+(if(isSolved) "(OK)" else "(?)") }.mkString(" ; ") + override def toString = description + + def description = "by "+rule.name+"("+score+"): "+problem +" ⟿ "+subProblems.mkString(" ; ") } -class RootTask(synth: Synthesizer, p: Problem) extends Task(synth, null, p, List(p), xs => xs.head, 0) +class RootTask(synth: Synthesizer, p: Problem) extends Task(synth, null, null, p, List(p), xs => xs.head, 0) -- GitLab