From b01601dfdd01b18c73dcd7473fe2faf3f2962416 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Wed, 25 Apr 2012 21:21:02 +0200
Subject: [PATCH] fix bug: only collect relevant function and pass expected
 type to avoid asarray operator

---
 src/main/scala/leon/FairZ3Solver.scala | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/src/main/scala/leon/FairZ3Solver.scala b/src/main/scala/leon/FairZ3Solver.scala
index 5dc1f673e..20e1f1dac 100644
--- a/src/main/scala/leon/FairZ3Solver.scala
+++ b/src/main/scala/leon/FairZ3Solver.scala
@@ -793,17 +793,21 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
 //
 
     if(!forceStop) {
-      val functionsAsMap = functionsModel.map(p => {
-        val fd = functionDeclToDef(p._1)
-        val (cses, default) = p._2 
-        val ite = cses.foldLeft(fromZ3Formula(model, default))((expr, q) => IfExpr(
-                        And(
-                          q._1.zip(fd.args).map(a12 => Equals(fromZ3Formula(model, a12._1), Variable(a12._2.id)))
-                        ),
-                        fromZ3Formula(model, q._2),
-                        expr))
-        (fd.id, ite)
-      })
+      val functionsAsMap: Map[Identifier, Expr] = functionsModel.flatMap(p => {
+        if(isKnownDecl(p._1)) {
+          val fd = functionDeclToDef(p._1)
+          if(!fd.hasImplementation) {
+            val (cses, default) = p._2 
+            val ite = cses.foldLeft(fromZ3Formula(model, default, Some(fd.returnType)))((expr, q) => IfExpr(
+                            And(
+                              q._1.zip(fd.args).map(a12 => Equals(fromZ3Formula(model, a12._1, Some(a12._2.tpe)), Variable(a12._2.id)))
+                            ),
+                            fromZ3Formula(model, q._2, Some(fd.returnType)),
+                            expr))
+            Seq((fd.id, ite))
+          } else Seq()
+        } else Seq()
+      }).toMap
       val asMap = modelToMap(model, variables) ++ functionsAsMap
       model.delete
       lazy val modelAsString = asMap.toList.map(p => p._1 + " -> " + p._2).mkString("\n")
-- 
GitLab