From 4dd083500db56f4978a1709cab2bb7676a7dfbc3 Mon Sep 17 00:00:00 2001
From: Nicolas Voirol <voirol.nicolas@gmail.com>
Date: Tue, 1 Nov 2016 16:49:27 +0100
Subject: [PATCH] Some fixes for ADT invariants

---
 .../inox/solvers/unrolling/DatatypeTemplates.scala    | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala b/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala
index 9a2f915e3..49114239e 100644
--- a/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala
+++ b/src/main/scala/inox/solvers/unrolling/DatatypeTemplates.scala
@@ -138,7 +138,8 @@ trait DatatypeTemplates { self: Templates =>
         guardedExprs += pathVar -> (expr +: prev)
       }
 
-      @inline protected def iff(e1: Expr, e2: Expr): Unit = storeGuarded(pathVar, Equals(e1, e2))
+      private var equations = Seq[Expr]()
+      @inline protected def iff(e1: Expr, e2: Expr): Unit = equations :+= Equals(e1, e2)
 
       private var tpes = Map[Variable, Set[(TypedADTSort, Expr)]]()
       @inline protected def storeType(pathVar: Variable, tsort: TypedADTSort, arg: Expr): Unit = {
@@ -179,6 +180,7 @@ trait DatatypeTemplates { self: Templates =>
                 }
 
                 val vars = tpes.keys.toSet ++ functions.keys ++
+                  guardedExprs.keys ++
                   guardedExprs.flatMap(_._2.flatMap(exprOps.variablesOf))
 
                 if (vars(newBool)) {
@@ -223,6 +225,8 @@ trait DatatypeTemplates { self: Templates =>
           if (callInfos.nonEmpty) calls += encoder(b) -> callInfos
         }
 
+        clauses ++= equations.map(encoder)
+
         val encodedTypes: Map[Encoded, Set[(TypedADTSort, Encoded)]] = tpes.map { case (b, tps) =>
           encoder(b) -> tps.map { case (tadt, expr) => (tadt, encoder(expr)) }
         }
@@ -487,6 +491,11 @@ trait DatatypeTemplates { self: Templates =>
           newClauses ++= template.instantiate(blocker, container, arg)
       }
 
+      ctx.reporter.debug("Unrolling datatypes (" + newClauses.size + ")")
+      for (cl <- newClauses) {
+        ctx.reporter.debug("  . " + cl)
+      }
+
       newClauses.toSeq
     }
   }
-- 
GitLab