From 053c4545c66929148a4d9c5641bb288b5b6757bc Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Mon, 1 Jun 2015 16:42:13 +0200
Subject: [PATCH] Only generate one vc per function group in GroupedTactic

---
 .../scala/leon/purescala/Extractors.scala     |  1 -
 .../scala/leon/synthesis/Synthesizer.scala    |  1 -
 .../scala/leon/utils/PreprocessingPhase.scala |  1 -
 .../leon/verification/GroupedTactic.scala     | 40 +++++++++++--------
 4 files changed, 23 insertions(+), 20 deletions(-)

diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala
index 0bacc4a72..9fb28e66d 100644
--- a/src/main/scala/leon/purescala/Extractors.scala
+++ b/src/main/scala/leon/purescala/Extractors.scala
@@ -6,7 +6,6 @@ package purescala
 import Expressions._
 import Common._
 import Types._
-import Definitions._
 import Constructors._
 import ExprOps._
 
diff --git a/src/main/scala/leon/synthesis/Synthesizer.scala b/src/main/scala/leon/synthesis/Synthesizer.scala
index 48624c809..4fa399f7a 100644
--- a/src/main/scala/leon/synthesis/Synthesizer.scala
+++ b/src/main/scala/leon/synthesis/Synthesizer.scala
@@ -10,7 +10,6 @@ import purescala.Expressions._
 import purescala.Constructors._
 import purescala.ScalaPrinter
 import solvers._
-import solvers.z3._
 
 import scala.concurrent.duration._
 
diff --git a/src/main/scala/leon/utils/PreprocessingPhase.scala b/src/main/scala/leon/utils/PreprocessingPhase.scala
index 7802d4509..60c270248 100644
--- a/src/main/scala/leon/utils/PreprocessingPhase.scala
+++ b/src/main/scala/leon/utils/PreprocessingPhase.scala
@@ -4,7 +4,6 @@ package leon
 package utils
 
 import purescala.Definitions.Program
-import purescala.ScalaPrinter
 
 import purescala.{MethodLifting, CompleteAbstractDefinitions,CheckADTFieldsTypes}
 import synthesis.{ConvertWithOracle, ConvertHoles}
diff --git a/src/main/scala/leon/verification/GroupedTactic.scala b/src/main/scala/leon/verification/GroupedTactic.scala
index 4a551a267..02da7e55b 100644
--- a/src/main/scala/leon/verification/GroupedTactic.scala
+++ b/src/main/scala/leon/verification/GroupedTactic.scala
@@ -3,6 +3,7 @@
 package leon
 package verification
 
+import leon.utils.NoPosition
 import purescala.Expressions._
 import purescala.ExprOps._
 import purescala.Definitions._
@@ -12,23 +13,28 @@ class GroupedTactic(vctx: VerificationContext) extends Tactic(vctx) {
     val description = "Default verification condition generation approach"
 
     def generatePostconditions(fd: FunDef): Seq[VC] = {
-      fd.postcondition map { post =>
-        val perFunc = for {
-          inComp <- vctx.program.callGraph.stronglyConnectedComponent(fd)
-          p <- inComp.postcondition
-          b <- inComp.body
-        } yield {
-          implies(
-            precOrTrue(inComp),
-            // @mk: Don't know which one is better. Inline the body, or have it as a fun. app?
-            //application(p, Seq(b))
-            application(p, Seq(FunctionInvocation(inComp.typedWithDef, inComp.params map { _.toVariable })))
-          )
-        }
-        
-        VC(andJoin(perFunc.toSeq), fd, VCKinds.Postcondition, this).setPos(post)
-      }
-    }.toSeq
+      // We collectively generate postconditions for a scc of the call graph.
+      // To not repeat vcs, we follow the convention to generate them for the first
+      // FunDef of the vcc according to unique name
+      val component = vctx.program.callGraph.stronglyConnectedComponent(fd).toSeq sortBy (_.id.uniqueName)
+      val perFunc:Seq[Expr] = for {
+        generator <- component.find( _.postcondition.isDefined).toSeq
+        if generator == fd
+        inComp <- component
+        p <- inComp.postcondition
+        b <- inComp.body
+      } yield { implies(
+        precOrTrue(inComp),
+        // @mk: Don't know which one is better. Inline the body, or have it as a fun. app?
+        //application(p, Seq(b))
+        application(p, Seq(FunctionInvocation(inComp.typedWithDef, inComp.params map { _.toVariable })))
+      )}
+
+      if (perFunc.nonEmpty)
+        Seq(VC(andJoin(perFunc.toSeq), fd, VCKinds.Postcondition, this).setPos(fd.postcondition.get))
+      else Nil
+
+    }
 
     def generatePreconditions(fd: FunDef): Seq[VC] = {
       fd.body match {
-- 
GitLab