From 857317fc4b19601ad07a6551eb2874cebb7e81b7 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Wed, 24 Oct 2012 16:47:09 +0200
Subject: [PATCH] Make sure model is complete, simplify rule

---
 src/main/scala/leon/synthesis/Rules.scala | 55 +++++++++++------------
 1 file changed, 25 insertions(+), 30 deletions(-)

diff --git a/src/main/scala/leon/synthesis/Rules.scala b/src/main/scala/leon/synthesis/Rules.scala
index 1765c44f3..d5151cfca 100644
--- a/src/main/scala/leon/synthesis/Rules.scala
+++ b/src/main/scala/leon/synthesis/Rules.scala
@@ -38,41 +38,36 @@ class OnePoint(synth: Synthesizer) extends Rule("One-point", synth) {
 
     val p = task.problem
 
-    p.phi match {
-      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)
-          case eq @ Equals(e, Variable(x)) if (p.xs contains x) && !(variablesOf(e) contains x) =>
-            (x, e, eq)
-        }
-
-        if (!candidates.isEmpty) {
-          val (x, e, eq) = candidates.head
+    val TopLevelAnds(exprs) = p.phi
 
-          val others = exprs.filter(_ != eq)
-          val oxs    = p.xs.filter(_ != x)
+    val candidates = exprs.collect {
+      case eq @ Equals(Variable(x), e) if (p.xs contains x) && !(variablesOf(e) contains x) =>
+        (x, e, eq)
+      case eq @ Equals(e, Variable(x)) if (p.xs contains x) && !(variablesOf(e) contains x) =>
+        (x, e, eq)
+    }
 
-          val newProblem = Problem(p.as, subst(x -> e, And(others)), oxs)
+    if (!candidates.isEmpty) {
+      val (x, e, eq) = candidates.head
 
-          val onSuccess: List[Solution] => Solution = { 
-            case List(Solution(pre, term, sc)) =>
-              if (oxs.isEmpty) {
-                Solution(pre, Tuple(e :: Nil), sc) 
-              } else {
-                Solution(pre, LetTuple(oxs, term, subst(x -> e, Tuple(p.xs.map(Variable(_))))), sc) 
-              }
-            case _ => Solution.none
-          }
+      val others = exprs.filter(_ != eq)
+      val oxs    = p.xs.filter(_ != x)
 
-          List(task.decompose(this, List(newProblem), onSuccess, 100))
-        } else {
-          Nil
-        }
+      val newProblem = Problem(p.as, subst(x -> e, And(others)), oxs)
 
+      val onSuccess: List[Solution] => Solution = { 
+        case List(Solution(pre, term, sc)) =>
+          if (oxs.isEmpty) {
+            Solution(pre, Tuple(e :: Nil), sc) 
+          } else {
+            Solution(pre, LetTuple(oxs, term, subst(x -> e, Tuple(p.xs.map(Variable(_))))), sc) 
+          }
+        case _ => Solution.none
+      }
 
-      case _ =>
-        Nil
+      List(task.decompose(this, List(newProblem), onSuccess, 100))
+    } else {
+      Nil
     }
   }
 }
@@ -87,7 +82,7 @@ class Ground(synth: Synthesizer) extends Rule("Ground", synth) {
 
       synth.solveSAT(p.phi) match {
         case (Some(true), model) =>
-          List(task.solveUsing(this, Solution(BooleanLiteral(true), Tuple(p.xs.map(model)).setType(tpe), 200), 200))
+          List(task.solveUsing(this, Solution(BooleanLiteral(true), Tuple(p.xs.map(id => model.getOrElse(id, simplestValue(Variable(id))))).setType(tpe), 200), 200))
         case (Some(false), model) =>
           List(task.solveUsing(this, Solution(BooleanLiteral(false), Error(p.phi+" is UNSAT!").setType(tpe), 200), 200))
         case _ =>
-- 
GitLab