From 609c8fad23bd052785d5194f6eab0876f3d2417e Mon Sep 17 00:00:00 2001
From: Philippe Suter <philippe.suter@gmail.com>
Date: Mon, 22 Oct 2012 16:04:06 +0200
Subject: [PATCH] Extending the interface of Solver to support counter-example
 generation.

---
 src/main/scala/leon/Extensions.scala    | 3 +++
 src/main/scala/leon/FairZ3Solver.scala  | 5 +++++
 src/main/scala/leon/TrivialSolver.scala | 1 -
 3 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/main/scala/leon/Extensions.scala b/src/main/scala/leon/Extensions.scala
index e9fdde89c..53bd6f37e 100644
--- a/src/main/scala/leon/Extensions.scala
+++ b/src/main/scala/leon/Extensions.scala
@@ -1,5 +1,6 @@
 package leon
 
+import purescala.Common._
 import purescala.Trees._
 import purescala.Definitions._
 
@@ -20,6 +21,8 @@ object Extensions {
     // should halt as soon as possible with any result (Unknown is ok) as soon as forceStop is true
     def solve(expression: Expr) : Option[Boolean]
 
+    def solveOrGetCounterexample(expression : Expr) : (Option[Boolean],Map[Identifier,Expr]) = (solve(expression), Map.empty)
+
     def isUnsat(expression: Expr) : Option[Boolean] = solve(negate(expression))
     def superseeds : Seq[String] = Nil
 
diff --git a/src/main/scala/leon/FairZ3Solver.scala b/src/main/scala/leon/FairZ3Solver.scala
index 2c429bab3..b54f5db1d 100644
--- a/src/main/scala/leon/FairZ3Solver.scala
+++ b/src/main/scala/leon/FairZ3Solver.scala
@@ -478,6 +478,11 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
 
   def solve(vc: Expr) = decide(vc, true)
 
+  override def solveOrGetCounterexample(vc : Expr) : (Option[Boolean],Map[Identifier,Expr]) = {
+    restartZ3
+    decideWithModel(vc, true)
+  }
+
   def solveWithBounds(vc: Expr, fv: Boolean) : (Option[Boolean], Map[Identifier,Expr]) = {
     restartZ3
     boundValues
diff --git a/src/main/scala/leon/TrivialSolver.scala b/src/main/scala/leon/TrivialSolver.scala
index 7e08c4832..0b05bbb59 100644
--- a/src/main/scala/leon/TrivialSolver.scala
+++ b/src/main/scala/leon/TrivialSolver.scala
@@ -18,5 +18,4 @@ class TrivialSolver(reporter: Reporter) extends Solver(reporter) {
     case And(exs) if exs.contains(BooleanLiteral(false)) => Some(false)
     case _ => None
   }
-
 }
-- 
GitLab