From 946add91d8a3d67cf5cc0b42149db643a92afdaa Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Tue, 15 Nov 2016 15:28:23 +0100
Subject: [PATCH] More optimizations for assume lifting

---
 src/main/scala/inox/ast/SymbolOps.scala            | 14 +++++++-------
 .../inox/solvers/unrolling/TemplateGenerator.scala | 10 ++++++++--
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/src/main/scala/inox/ast/SymbolOps.scala b/src/main/scala/inox/ast/SymbolOps.scala
index cb072f84c..ec0179bd9 100644
--- a/src/main/scala/inox/ast/SymbolOps.scala
+++ b/src/main/scala/inox/ast/SymbolOps.scala
@@ -224,7 +224,7 @@ trait SymbolOps { self: TypeOps =>
     * in order to increase the precision of polarity analysis for
     * quantification instantiations.
     */
-  def simplifyQuantifications(e: Expr): Expr = {
+  def simplifyForalls(e: Expr): Expr = {
 
     def inlineFunctions(e: Expr): Expr = {
       val fds = functionCallsOf(e).flatMap { fi =>
@@ -246,7 +246,7 @@ trait SymbolOps { self: TypeOps =>
       fixpoint(inline)(e)
     }
 
-    def inlineQuantifications(e: Expr): Expr = {
+    def inlineForalls(e: Expr): Expr = {
       def liftForalls(args: Seq[ValDef], es: Seq[Expr], recons: Seq[Expr] => Expr): Expr = {
         val (allArgs, allBodies) = es.map {
           case f: Forall =>
@@ -315,7 +315,7 @@ trait SymbolOps { self: TypeOps =>
       case _ => e
     }
 
-    normalizeClauses(inlineQuantifications(inlineFunctions(e)))
+    normalizeClauses(inlineForalls(inlineFunctions(e)))
   }
 
   def simplifyLets(expr: Expr): Expr = postMap({
@@ -778,10 +778,10 @@ trait SymbolOps { self: TypeOps =>
   def simplifyFormula(e: Expr, simplify: Boolean = true): Expr = {
     if (simplify) {
       val simp: Expr => Expr =
-        ((e: Expr) => simplifyHOFunctions(e))     compose
-        ((e: Expr) => simplifyByConstructors(e))  compose
-        ((e: Expr) => simplifyAssumptions(e))     compose
-        ((e: Expr) => simplifyQuantifications(e))
+        ((e: Expr) => simplifyHOFunctions(e))    compose
+        ((e: Expr) => simplifyByConstructors(e)) compose
+        ((e: Expr) => simplifyAssumptions(e))    compose
+        ((e: Expr) => simplifyForalls(e))
       fixpoint(simp)(e)
     } else {
       simplifyHOFunctions(e, simplify = false)
diff --git a/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala b/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala
index 2a12e422b..55888023d 100644
--- a/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala
+++ b/src/main/scala/inox/solvers/unrolling/TemplateGenerator.scala
@@ -297,7 +297,7 @@ trait TemplateGenerator { self: Templates =>
         }
       }
 
-      case l @ Lambda(args, body) =>
+      case l: Lambda =>
         val idArgs : Seq[Variable] = lambdaArgs(l)
         val trArgs : Seq[Encoded] = idArgs.map(id => substMap.getOrElse(id, encodeSymbol(id)))
 
@@ -386,7 +386,13 @@ trait TemplateGenerator { self: Templates =>
         registerLambda(template)
         lid
 
-      case f @ Forall(args, body) =>
+      case f: Forall =>
+        val (assumptions, Forall(args, body)) = liftAssumptions(f)
+
+        for (a <- assumptions) {
+          rec(pathVar, a, Some(true))
+        }
+
         val TopLevelAnds(conjuncts) = body
 
         val conjunctQs = conjuncts.map { conjunct =>
-- 
GitLab