From 9e1cc021f2f480daa7f82bcdc4c813319f1852a4 Mon Sep 17 00:00:00 2001
From: Etienne Kneuss <ekneuss@gmail.com>
Date: Tue, 5 May 2015 11:42:24 +0200
Subject: [PATCH] Last-minute matchToIfThenElse, when not done by templates.

---
 .../smtlib/SMTLIBCVC4QuantifiedTarget.scala       | 15 +++++++--------
 .../scala/leon/solvers/smtlib/SMTLIBTarget.scala  |  8 +++++++-
 .../solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala | 10 +++++-----
 3 files changed, 19 insertions(+), 14 deletions(-)

diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala
index b9de2bd61..c6385d426 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBCVC4QuantifiedTarget.scala
@@ -6,9 +6,8 @@ package solvers.smtlib
 import purescala.Common.FreshIdentifier
 import purescala.Expressions.{FunctionInvocation, BooleanLiteral, Expr, Implies}
 import purescala.Definitions.TypedFunDef
-import purescala.Constructors.application
+import purescala.Constructors.{application, implies}
 import purescala.DefOps.typedTransitiveCallees
-import leon.purescala.ExprOps.matchToIfThenElse
 import smtlib.parser.Commands._
 import smtlib.parser.Terms._
 import smtlib.theories.Core.Equals
@@ -43,13 +42,13 @@ trait SMTLIBCVC4QuantifiedTarget extends SMTLIBCVC4Target {
 
       functions +=(tfd, id2sym(id))
 
-      val bodyAssert = Assert(Equals(id2sym(id): Term, toSMT(matchToIfThenElse(tfd.body.get))(Map())))
+      val bodyAssert = Assert(Equals(id2sym(id): Term, toSMT(tfd.body.get)(Map())))
 
       val specAssert = tfd.postcondition map { post =>
-        val term = matchToIfThenElse(Implies(
+        val term = implies(
           tfd.precondition getOrElse BooleanLiteral(true),
           application(post, Seq(FunctionInvocation(tfd, Seq())))
-        ))
+        )
         Assert(toSMT(term)(Map()))
       }
 
@@ -75,7 +74,7 @@ trait SMTLIBCVC4QuantifiedTarget extends SMTLIBCVC4Target {
 
     val smtBodies = smtFunDecls map { case FunDec(sym, _, _) =>
       val tfd = functions.toA(sym)
-      toSMT(matchToIfThenElse(tfd.body.get))(tfd.params.map { p =>
+      toSMT(tfd.body.get)(tfd.params.map { p =>
         (p.id, id2sym(p.id): Term)
       }.toMap)
     }
@@ -87,10 +86,10 @@ trait SMTLIBCVC4QuantifiedTarget extends SMTLIBCVC4Target {
         tfd <- seen
         post <- tfd.postcondition
       } {
-        val term = matchToIfThenElse(Implies(
+        val term = implies(
           tfd.precondition getOrElse BooleanLiteral(true),
           application(post, Seq(FunctionInvocation(tfd, tfd.params map { _.toVariable})))
-        ))
+        )
         sendCommand(Assert(quantifiedTerm(ForAll, term)))
       }
     }
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
index 9c21bc903..fcfe4c801 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBTarget.scala
@@ -505,6 +505,13 @@ trait SMTLIBTarget {
           someTester(vt),
           Seq(ArraysEx.Select(toSMT(m), toSMT(k)))
         )
+
+      case p : Passes =>
+        toSMT(matchToIfThenElse(p.asConstraint))
+
+      case m : MatchExpr =>
+        toSMT(matchToIfThenElse(m))
+
       /**
        * ===== Everything else =====
        */
@@ -575,7 +582,6 @@ trait SMTLIBTarget {
           case _ => reporter.fatalError("Unhandled nary "+e)
         }
 
-
       case o => unsupported("Tree: " + o)
     }
   }
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala
index 3087d1183..4c40da893 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBZ3QuantifiedTarget.scala
@@ -50,21 +50,21 @@ trait SMTLIBZ3QuantifiedTarget extends SMTLIBZ3Target {
       val term = quantifiedTerm(
         SMTForall,
         tfd.params map { _.id },
-        matchToIfThenElse(Equals(
+        Equals(
           FunctionInvocation(tfd, tfd.params.map {_.toVariable}),
-          matchToIfThenElse(tfd.body.get)
-        ))
+          tfd.body.get
+        )
       )
       sendCommand(Assert(term))
 
       tfd.postcondition foreach { post =>
-        val axiom = matchToIfThenElse(implies(
+        val axiom = implies(
           tfd.precondition getOrElse BooleanLiteral(true),
           application(
             post,
             Seq(FunctionInvocation(tfd, tfd.params map { _.toVariable }))
           )
-        ))
+        )
         sendCommand(Assert(quantifiedTerm(SMTForall, axiom)))
       }
     }
-- 
GitLab