From 06b9bbc77972932f6e29c6d079444b7d357934fa Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Fri, 19 Oct 2012 18:31:26 +0200
Subject: [PATCH] Stupid example and log output

---
 .../leon/ImperativeCodeElimination.scala      |  2 +-
 src/main/scala/leon/Main.scala                | 12 +++++----
 src/main/scala/leon/purescala/Trees.scala     |  3 +--
 src/main/scala/leon/synthesis/Rules.scala     |  5 ++++
 .../scala/leon/synthesis/Synthesizer.scala    | 26 +++++++++++++++++++
 src/main/scala/leon/synthesis/Task.scala      |  7 ++++-
 6 files changed, 46 insertions(+), 9 deletions(-)

diff --git a/src/main/scala/leon/ImperativeCodeElimination.scala b/src/main/scala/leon/ImperativeCodeElimination.scala
index d3cd29907..127e862cf 100644
--- a/src/main/scala/leon/ImperativeCodeElimination.scala
+++ b/src/main/scala/leon/ImperativeCodeElimination.scala
@@ -257,8 +257,8 @@ object ImperativeCodeElimination extends Pass {
         val (argVal, argScope, argFun) = toFunction(a)
         (recons(argVal).setType(u.getType), argScope, argFun)
       }
-      case (t: Terminal) => (t, (body: Expr) => body, Map())
 
+      case (t: Terminal) => (t, (body: Expr) => body, Map())
 
       case _ => sys.error("not supported: " + expr)
     }
diff --git a/src/main/scala/leon/Main.scala b/src/main/scala/leon/Main.scala
index 9af1b41e7..584caaa6f 100644
--- a/src/main/scala/leon/Main.scala
+++ b/src/main/scala/leon/Main.scala
@@ -4,6 +4,9 @@ import scala.tools.nsc.{Global,Settings=>NSCSettings,SubComponent,CompilerComman
 
 import purescala.Definitions.Program
 
+import synthesis.Synthesizer
+import purescala.ScalaPrinter
+
 object Main {
   import leon.{Reporter,DefaultReporter,Analysis}
 
@@ -32,11 +35,10 @@ object Main {
 
   private def defaultAction(program: Program, reporter: Reporter) : Unit = {
     Logger.debug("Default action on program: " + program, 3, "main")
-    val passManager = new PassManager(Seq(ArrayTransformation, EpsilonElimination, ImperativeCodeElimination, /*UnitElimination,*/ FunctionClosure, /*FunctionHoisting,*/ Simplificator))
-    val program2 = passManager.run(program)
-    assert(program2.isPure)
-    val analysis = new Analysis(program2, reporter)
-    analysis.analyse
+    //val passManager = new PassManager(Seq(ArrayTransformation, EpsilonElimination, ImperativeCodeElimination, /*UnitElimination,*/ FunctionClosure, /*FunctionHoisting,*/ Simplificator))
+    //val program2 = passManager.run(program)
+    assert(program.isPure)
+    val program2 = new Synthesizer().synthesizeAll(program)
   }
 
   private def runWithSettings(args : Array[String], settings : NSCSettings, printerFunction : String=>Unit, actionOnProgram : Option[Program=>Unit] = None) : Unit = {
diff --git a/src/main/scala/leon/purescala/Trees.scala b/src/main/scala/leon/purescala/Trees.scala
index 4778c9b2d..e32b3dd7a 100644
--- a/src/main/scala/leon/purescala/Trees.scala
+++ b/src/main/scala/leon/purescala/Trees.scala
@@ -830,6 +830,7 @@ object Trees {
       case i @ IfExpr(a1,a2,a3) => compute(i, combine(combine(rec(a1), rec(a2)), rec(a3)))
       case m @ MatchExpr(scrut, cses) => compute(m, (scrut +: cses.flatMap(_.expressions)).map(rec(_)).reduceLeft(combine))
       case a @ AnonymousFunction(es, ev) => compute(a, (es.flatMap(e => e._1 ++ Seq(e._2)) ++ Seq(ev)).map(rec(_)).reduceLeft(combine))
+      case c @ Choose(args, body) => compute(c, rec(body))
       case t: Terminal => compute(t, convert(t))
       case unhandled => scala.sys.error("Non-terminal case should be handled in treeCatamorphism: " + unhandled)
     }
@@ -870,7 +871,6 @@ object Trees {
       case ArrayMake(_) => false
       case ArrayClone(_) => false
       case Epsilon(_) => false
-      case Choose(_, _) => false
       case _ => true
     }
     def combine(b1: Boolean, b2: Boolean) = b1 && b2
@@ -884,7 +884,6 @@ object Trees {
       case ArrayMake(_) => false
       case ArrayClone(_) => false
       case Epsilon(_) => false
-      case Choose(_, _) => false
       case _ => b
     }
     treeCatamorphism(convert, combine, compute, expr)
diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala
index 7cedb5d02..b9dc74af1 100644
--- a/src/main/scala/leon/synthesis/Rules.scala
+++ b/src/main/scala/leon/synthesis/Rules.scala
@@ -1,6 +1,11 @@
 package leon
 package synthesis
 
+object Rules {
+  def all = List()
+}
+
+
 abstract class Rule(val name: String) {
   def isApplicable(p: Problem, parent: Task): List[Task]
 }
diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala
index ba4c3c4f1..ab5f75432 100644
--- a/src/main/scala/leon/synthesis/Synthesizer.scala
+++ b/src/main/scala/leon/synthesis/Synthesizer.scala
@@ -1,9 +1,14 @@
 package leon
 package synthesis
 
+import purescala.Definitions.Program
+
 import collection.mutable.PriorityQueue
 
 class Synthesizer(rules: List[Rule]) {
+  def this() = this(Rules.all)
+
+
   def applyRules(p: Problem, parent: Task): List[Task] = {
     rules.flatMap(_.isApplicable(p, parent))
   }
@@ -48,7 +53,28 @@ class Synthesizer(rules: List[Rule]) {
 
     }
 
+    println
+    println(" ++ RESULT ++ ")
+    println("==> "+p+" ⊢  "+solution)
+
     solution
   }
+
+  def test1 = {
+    import purescala.Common._
+    import purescala.Trees._
+    import purescala.TypeTrees._
+
+    val aID = FreshIdentifier("a").setType(Int32Type)
+    val a = Variable(aID)
+    val p = Problem(Nil, And(GreaterThan(a, IntLiteral(2)), Equals(a, IntLiteral(3))), List(aID))
+
+    synthesize(p)
+  }
+
+  def synthesizeAll(p: Program): Program = {
+    test1
+    p
+  }
 }
 
diff --git a/src/main/scala/leon/synthesis/Task.scala b/src/main/scala/leon/synthesis/Task.scala
index 959f56452..69a323280 100644
--- a/src/main/scala/leon/synthesis/Task.scala
+++ b/src/main/scala/leon/synthesis/Task.scala
@@ -27,7 +27,12 @@ class Task(
     subSolutions += p -> s
 
     if (subSolutions.size == subProblems.size) {
-      notifyParent(construct(subProblems map subSolutions))
+
+      val solution = construct(subProblems map subSolutions) 
+
+      println(": "+problem+" ⊢  "+solution)
+
+      notifyParent(solution)
     }
   }
 
-- 
GitLab