From 82e00daa7c4c54fc4c205be9fd6918c882daa16d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9gis=20Blanc?= <regwblanc@gmail.com>
Date: Wed, 25 Apr 2012 18:36:03 +0200
Subject: [PATCH] model evaluation can handle function model for epsilon

---
 src/main/scala/leon/Evaluator.scala    |  5 ++--
 src/main/scala/leon/FairZ3Solver.scala | 33 +++++++++++++++++---------
 2 files changed, 25 insertions(+), 13 deletions(-)

diff --git a/src/main/scala/leon/Evaluator.scala b/src/main/scala/leon/Evaluator.scala
index 72c62ef15..0f3204e70 100644
--- a/src/main/scala/leon/Evaluator.scala
+++ b/src/main/scala/leon/Evaluator.scala
@@ -85,10 +85,11 @@ object Evaluator {
             }
           }
 
-          if(!fd.hasBody) {
+          if(!fd.hasBody && !context.isDefinedAt(fd.id)) {
             throw RuntimeErrorEx("Evaluation of function with unknown implementation.")
           }
-          val callResult = rec(frame, matchToIfThenElse(fd.body.get))
+          val body = fd.body.getOrElse(context(fd.id))
+          val callResult = rec(frame, matchToIfThenElse(body))
 
           if(fd.hasPostcondition) {
             val freshResID = FreshIdentifier("result").setType(fd.returnType)
diff --git a/src/main/scala/leon/FairZ3Solver.scala b/src/main/scala/leon/FairZ3Solver.scala
index 7745edc76..5dc1f673e 100644
--- a/src/main/scala/leon/FairZ3Solver.scala
+++ b/src/main/scala/leon/FairZ3Solver.scala
@@ -781,19 +781,30 @@ class FairZ3Solver(reporter: Reporter) extends Solver(reporter) with AbstractZ3S
     import Evaluator._
 
     val functionsModel: Map[Z3FuncDecl, (Seq[(Seq[Z3AST], Z3AST)], Z3AST)] = model.getModelFuncInterpretations.map(i => (i._1, (i._2, i._3))).toMap
-    println(functionsModel.toList.map(p => p._1 + " -> " + {
-      val (cses, default) = p._2 
-      val ite = cses.foldLeft(fromZ3Formula(model, default))((expr, q) => IfExpr(
-                      And(
-                        q._1.zip(functionDeclToDef(p._1).args).map(a12 => Equals(fromZ3Formula(model, a12._1), Variable(a12._2.id)))
-                      ),
-                      fromZ3Formula(model, q._2),
-                      expr))
-      ite.toString
-    }).mkString("\n"))
+
+//    println(functionsModel.toList.map(p => p._1 + " -> " + {
+//      val (cses, default) = p._2 
+//      val ite = cses.foldLeft(fromZ3Formula(model, default))((expr, q) => IfExpr(
+//                      And(
+//                        q._1.zip(functionDeclToDef(p._1).args).map(a12 => Equals(fromZ3Formula(model, a12._1), Variable(a12._2.id)))
+//                      ),
+//                      fromZ3Formula(model, q._2),
+//                      expr))
+//
 
     if(!forceStop) {
-      val asMap = modelToMap(model, variables)
+      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 asMap = modelToMap(model, variables) ++ functionsAsMap
       model.delete
       lazy val modelAsString = asMap.toList.map(p => p._1 + " -> " + p._2).mkString("\n")
       val evalResult = eval(asMap, formula, evaluator)
-- 
GitLab