From 38c581f2403e4e6f28eeb60a2eaa81d05651bec5 Mon Sep 17 00:00:00 2001
From: Manos Koukoutos <emmanouil.koukoutos@epfl.ch>
Date: Mon, 30 Mar 2015 14:44:09 +0200
Subject: [PATCH] assert variables exist. quantified instead of free

---
 .../smtlib/SMTLIBUnrollingCVC4Target.scala    | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala
index 0600de6cb..9fcbc9de9 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBUnrollingCVC4Target.scala
@@ -3,9 +3,10 @@
 package leon
 package solvers.smtlib
 
+import leon.purescala.Expressions.Expr
 import purescala.Definitions.TypedFunDef
 import purescala.DefOps.typedTransitiveCallees
-import purescala.ExprOps.matchToIfThenElse
+import leon.purescala.ExprOps.{variablesOf, matchToIfThenElse}
 import smtlib.parser.Commands._
 import smtlib.parser.Terms._
 
@@ -54,4 +55,20 @@ trait SMTLIBUnrollingCVC4Target extends SMTLIBCVC4Target {
     }
   }
 
+  override def assertCnstr(expr: Expr): Unit = {
+    val existentials = variablesOf(expr).toSeq
+
+    val term = if (existentials.isEmpty) toSMT(expr)(Map()) else {
+      val es = existentials map { id =>
+        SortedVar(id2sym(id), declareSort(id.getType))
+      }
+      Exists(
+        es.head,
+        es.tail,
+        toSMT(expr)(existentials.map { id => id -> (id2sym(id): Term)}.toMap)
+      )
+    }
+    sendCommand(Assert(term))
+  }
+
 }
-- 
GitLab