From 978df2d3c071c10f3882234ea08cdfa4c3f5d22b Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Mon, 7 Mar 2016 16:03:32 +0100
Subject: [PATCH] Simplify SimilarTo

Use Grammars.default
Remove SafeRecursiveCalls
---
 src/main/scala/leon/grammars/Grammars.scala   |  4 ++--
 src/main/scala/leon/grammars/SimilarTo.scala  | 19 +++++++------------
 .../scala/leon/synthesis/rules/CEGLESS.scala  |  4 +---
 .../scala/leon/synthesis/rules/TEGLESS.scala  |  4 +---
 4 files changed, 11 insertions(+), 20 deletions(-)

diff --git a/src/main/scala/leon/grammars/Grammars.scala b/src/main/scala/leon/grammars/Grammars.scala
index 762ea5325..fcbc628c4 100644
--- a/src/main/scala/leon/grammars/Grammars.scala
+++ b/src/main/scala/leon/grammars/Grammars.scala
@@ -24,10 +24,10 @@ object Grammars {
     FunctionCalls(prog, currentFunction, inputs.map(_.getType), exclude)
   }
 
-  def default(sctx: SynthesisContext, p: Problem): ExpressionGrammar[TypeTree] = {
+  def default(sctx: SynthesisContext, p: Problem, extraHints: Seq[Expr] = Seq()): ExpressionGrammar[TypeTree] = {
     val TopLevelAnds(ws) = p.ws
     val hints = ws.collect{ case Hint(e) if formulaSize(e) >= 4 => e }
-    default(sctx.program, p.as.map(_.toVariable) ++ hints, sctx.functionContext, sctx.settings.functionsToIgnore)
+    default(sctx.program, p.as.map(_.toVariable) ++ hints ++ extraHints, sctx.functionContext, sctx.settings.functionsToIgnore)
   }
 
   def typeDepthBound[T <: Typed](g: ExpressionGrammar[T], b: Int) = {
diff --git a/src/main/scala/leon/grammars/SimilarTo.scala b/src/main/scala/leon/grammars/SimilarTo.scala
index 4d2ee3f45..6b2f3f538 100644
--- a/src/main/scala/leon/grammars/SimilarTo.scala
+++ b/src/main/scala/leon/grammars/SimilarTo.scala
@@ -14,20 +14,15 @@ import synthesis._
 
 /** A grammar that generates expressions by inserting small variations in [[e]]
  * @param e The [[Expr]] to which small variations will be inserted
- * @param terminals A set of [[Expr]]s that may be inserted into [[e]] as small variations
  */
-case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisContext, p: Problem) extends ExpressionGrammar[NonTerminal[String]] {
+case class SimilarTo(e: Expr, sctx: SynthesisContext, p: Problem) extends ExpressionGrammar[NonTerminal[String]] {
 
   val excludeFCalls = sctx.settings.functionsToIgnore
 
   val normalGrammar: ExpressionGrammar[NonTerminal[String]] = DepthBoundedGrammar(EmbeddedGrammar(
-      BaseGrammar ||
-      EqualityGrammar(Set(IntegerType, Int32Type, BooleanType) ++ terminals.map { _.getType }) ||
-      OneOf(terminals.toSeq :+ e) ||
-      FunctionCalls(sctx.program, sctx.functionContext, p.as.map(_.getType), excludeFCalls) ||
-      SafeRecursiveCalls(sctx.program, p.ws, p.pc),
-    { (t: TypeTree)      => NonTerminal(t, "B", None)},
-    { (l: NonTerminal[String]) => l.getType }
+    Grammars.default(sctx, p, Seq(e)),
+    (t: TypeTree) => NonTerminal(t, "B", None),
+    (l: NonTerminal[String]) => l.getType
   ), 1)
 
   type L = NonTerminal[String]
@@ -148,9 +143,9 @@ case class SimilarTo(e: Expr, terminals: Set[Expr] = Set(), sctx: SynthesisConte
           gens(e, gl, subs, { case ss => builder(ss) })
       }
 
-      val terminalsMatching = terminals.collect {
-        case IsTyped(term, tpe) if tpe == gl.getType && term != e =>
-          gl -> terminal(term)
+      val terminalsMatching = p.as.collect {
+        case IsTyped(term, tpe) if tpe == gl.getType && Variable(term) != e =>
+          gl -> terminal(Variable(term))
       }
 
       val variations = e.getType match {
diff --git a/src/main/scala/leon/synthesis/rules/CEGLESS.scala b/src/main/scala/leon/synthesis/rules/CEGLESS.scala
index 52d6af00f..d59e99011 100644
--- a/src/main/scala/leon/synthesis/rules/CEGLESS.scala
+++ b/src/main/scala/leon/synthesis/rules/CEGLESS.scala
@@ -19,8 +19,6 @@ case object CEGLESS extends CEGISLike[NonTerminal[String]]("CEGLESS") {
       case Guide(e) => e
     }
 
-    val inputs = p.as.map(_.toVariable)
-
     sctx.reporter.ifDebug { printer =>
       printer("Guides available:")
       for (g <- guides) {
@@ -28,7 +26,7 @@ case object CEGLESS extends CEGISLike[NonTerminal[String]]("CEGLESS") {
       }
     }
 
-    val guidedGrammar = Union(guides.map(SimilarTo(_, inputs.toSet, sctx, p)))
+    val guidedGrammar = Union(guides.map(SimilarTo(_, sctx, p)))
 
     CegisParams(
       grammar = guidedGrammar,
diff --git a/src/main/scala/leon/synthesis/rules/TEGLESS.scala b/src/main/scala/leon/synthesis/rules/TEGLESS.scala
index dfc38ed16..f87968ea3 100644
--- a/src/main/scala/leon/synthesis/rules/TEGLESS.scala
+++ b/src/main/scala/leon/synthesis/rules/TEGLESS.scala
@@ -19,8 +19,6 @@ case object TEGLESS extends TEGISLike[NonTerminal[String]]("TEGLESS") {
       case Guide(expr) => expr
     }
 
-    val inputs = p.as.map(_.toVariable)
-
     sctx.reporter.ifDebug { printer =>
       printer("Guides available:")
       for (g <- guides) {
@@ -28,7 +26,7 @@ case object TEGLESS extends TEGISLike[NonTerminal[String]]("TEGLESS") {
       }
     }
 
-    val guidedGrammar = guides.map(SimilarTo(_, inputs.toSet, sctx, p)).foldLeft[ExpressionGrammar[NonTerminal[String]]](Empty())(_ || _)
+    val guidedGrammar = guides.map(SimilarTo(_, sctx, p)).foldLeft[ExpressionGrammar[NonTerminal[String]]](Empty())(_ || _)
 
     TegisParams(
       grammar = guidedGrammar,
-- 
GitLab