additional model gen and SMT-LIBv2 compliance work: (get-assignment) now supported...
authorMorgan Deters <mdeters@gmail.com>
Sun, 10 Oct 2010 22:15:38 +0000 (22:15 +0000)
committerMorgan Deters <mdeters@gmail.com>
Sun, 10 Oct 2010 22:15:38 +0000 (22:15 +0000)
98 files changed:
configure.ac
src/context/cdset.h
src/context/cdset_forward.h [new file with mode: 0644]
src/expr/command.cpp
src/expr/command.h
src/main/getopt.cpp
src/main/main.cpp
src/main/util.cpp
src/parser/smt2/Smt2.g
src/prop/prop_engine.cpp
src/prop/prop_engine.h
src/prop/sat.h
src/smt/Makefile.am
src/smt/options.h [new file with mode: 0644]
src/smt/smt_engine.cpp
src/smt/smt_engine.h
src/theory/shared_data.h
src/theory/shared_term_manager.h
src/theory/theory_engine.cpp
src/theory/theory_engine.h
src/util/Assert.h
src/util/Makefile.am
src/util/options.h [deleted file]
src/util/result.cpp [new file with mode: 0644]
src/util/result.h
src/util/sexpr.h
test/regress/regress0/arith/arith.01.cvc
test/regress/regress0/arith/arith.02.cvc
test/regress/regress0/arith/arith.03.cvc
test/regress/regress0/boolean-prec.cvc
test/regress/regress0/boolean.cvc
test/regress/regress0/bug32.cvc
test/regress/regress0/cvc3-bug15.cvc
test/regress/regress0/hole6.cvc
test/regress/regress0/ite.cvc
test/regress/regress0/logops.01.cvc
test/regress/regress0/logops.02.cvc
test/regress/regress0/logops.03.cvc
test/regress/regress0/logops.04.cvc
test/regress/regress0/logops.05.cvc
test/regress/regress0/precedence/and-not.cvc
test/regress/regress0/precedence/and-xor.cvc
test/regress/regress0/precedence/bool-cmp.cvc
test/regress/regress0/precedence/cmp-plus.cvc
test/regress/regress0/precedence/eq-fun.cvc
test/regress/regress0/precedence/iff-assoc.cvc
test/regress/regress0/precedence/iff-implies.cvc
test/regress/regress0/precedence/implies-assoc.cvc
test/regress/regress0/precedence/implies-iff.cvc
test/regress/regress0/precedence/implies-or.cvc
test/regress/regress0/precedence/not-and.cvc
test/regress/regress0/precedence/not-eq.cvc
test/regress/regress0/precedence/or-implies.cvc
test/regress/regress0/precedence/or-xor.cvc
test/regress/regress0/precedence/plus-mult.cvc
test/regress/regress0/precedence/xor-and.cvc
test/regress/regress0/precedence/xor-assoc.cvc
test/regress/regress0/precedence/xor-or.cvc
test/regress/regress0/queries0.cvc
test/regress/regress0/simple.cvc
test/regress/regress0/smallcnf.cvc
test/regress/regress0/test11.cvc
test/regress/regress0/test12.cvc
test/regress/regress0/test9.cvc
test/regress/regress0/uf/simple.01.cvc
test/regress/regress0/uf/simple.02.cvc
test/regress/regress0/uf/simple.03.cvc
test/regress/regress0/uf/simple.04.cvc
test/regress/regress0/uf20-03.cvc
test/regress/regress0/wiki.01.cvc
test/regress/regress0/wiki.02.cvc
test/regress/regress0/wiki.03.cvc
test/regress/regress0/wiki.04.cvc
test/regress/regress0/wiki.05.cvc
test/regress/regress0/wiki.06.cvc
test/regress/regress0/wiki.07.cvc
test/regress/regress0/wiki.08.cvc
test/regress/regress0/wiki.09.cvc
test/regress/regress0/wiki.10.cvc
test/regress/regress0/wiki.11.cvc
test/regress/regress0/wiki.12.cvc
test/regress/regress0/wiki.13.cvc
test/regress/regress0/wiki.14.cvc
test/regress/regress0/wiki.15.cvc
test/regress/regress0/wiki.16.cvc
test/regress/regress0/wiki.17.cvc
test/regress/regress0/wiki.18.cvc
test/regress/regress0/wiki.19.cvc
test/regress/regress0/wiki.20.cvc
test/regress/regress0/wiki.21.cvc
test/regress/regress1/hole7.cvc
test/regress/regress1/hole8.cvc
test/regress/regress2/hole9.cvc
test/regress/regress3/hole10.cvc
test/regress/run_regression
test/unit/prop/cnf_stream_black.h
test/unit/theory/shared_term_manager_black.h
test/unit/theory/theory_engine_white.h

index ced90d56fa4cd5b7412349890759d90ae2fd93eb..de6b3a42721c20d7647509871e9c4ff2bf60fa6f 100644 (file)
@@ -67,7 +67,7 @@ if test -z "${CFLAGS+set}"; then CFLAGS=; fi
 if test -z "${CXXFLAGS+set}"; then CXXFLAGS=; fi
 
 # on by default
-AM_MAINTAINER_MODE
+AM_MAINTAINER_MODE([enable])
 
 # turn off static lib building by default
 AC_ENABLE_SHARED
index 47848c26fe74c0c518477ea1b5008f9293a9c6e1..268c3127b5e93759cea9bc9371ec0987edde3191 100644 (file)
@@ -22,6 +22,7 @@
 #define __CVC4__CONTEXT__CDSET_H
 
 #include "context/context.h"
+#include "context/cdset_forward.h"
 #include "context/cdmap.h"
 #include "util/Assert.h"
 
diff --git a/src/context/cdset_forward.h b/src/context/cdset_forward.h
new file mode 100644 (file)
index 0000000..135db87
--- /dev/null
@@ -0,0 +1,42 @@
+/*********************                                                        */
+/*! \file cdset_forward.h
+ ** \verbatim
+ ** Original author: mdeters
+ ** Major contributors: none
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief This is a forward declaration header to declare the CDSet<>
+ ** template
+ **
+ ** This is a forward declaration header to declare the CDSet<>
+ ** template.  It's useful if you want to forward-declare CDSet<>
+ ** without including the full cdset.h header, for example, in a
+ ** public header context.
+ **
+ ** For CDSet<> in particular, it's difficult to forward-declare it
+ ** yourself, becase it has a default template argument.
+ **/
+
+#include "cvc4_public.h"
+
+#ifndef __CVC4__CONTEXT__CDSET_FORWARD_H
+#define __CVC4__CONTEXT__CDSET_FORWARD_H
+
+namespace __gnu_cxx {
+  template <class Key> class hash;
+}/* __gnu_cxx namespace */
+
+namespace CVC4 {
+  namespace context {
+    template <class V, class HashFcn = __gnu_cxx::hash<V> >
+    class CDSet;
+  }/* CVC4::context namespace */
+}/* CVC4 namespace */
+
+#endif /* __CVC4__CONTEXT__CDSET_FORWARD_H */
index 15fea22dac6b0c35aac7f49ad62fd5e6d8cd966d..38193a75bb501c68c5288d250737730c92fe0c64 100644 (file)
@@ -240,6 +240,28 @@ void DefineFunctionCommand::toStream(std::ostream& out) const {
   out << "], << " << d_formula << " >> )";
 }
 
+/* class DefineFunctionCommand */
+
+DefineNamedFunctionCommand::DefineNamedFunctionCommand(Expr func,
+                                                       const std::vector<Expr>& formals,
+                                                       Expr formula) :
+  DefineFunctionCommand(func, formals, formula) {
+}
+
+void DefineNamedFunctionCommand::invoke(SmtEngine* smtEngine) {
+  this->DefineFunctionCommand::invoke(smtEngine);
+  if(d_func.getType().isBoolean()) {
+    smtEngine->addToAssignment(d_func.getExprManager()->mkExpr(kind::APPLY,
+                                                               d_func));
+  }
+}
+
+void DefineNamedFunctionCommand::toStream(std::ostream& out) const {
+  out << "DefineNamedFunction( ";
+  this->DefineFunctionCommand::toStream(out);
+  out << " )";
+}
+
 /* class GetValueCommand */
 
 GetValueCommand::GetValueCommand(Expr term) :
@@ -262,6 +284,27 @@ void GetValueCommand::toStream(std::ostream& out) const {
   out << "GetValue( << " << d_term << " >> )";
 }
 
+/* class GetAssignmentCommand */
+
+GetAssignmentCommand::GetAssignmentCommand() {
+}
+
+void GetAssignmentCommand::invoke(SmtEngine* smtEngine) {
+  d_result = smtEngine->getAssignment();
+}
+
+SExpr GetAssignmentCommand::getResult() const {
+  return d_result;
+}
+
+void GetAssignmentCommand::printResult(std::ostream& out) const {
+  out << d_result << endl;
+}
+
+void GetAssignmentCommand::toStream(std::ostream& out) const {
+  out << "GetAssignment()";
+}
+
 /* class GetAssertionsCommand */
 
 GetAssertionsCommand::GetAssertionsCommand() {
index 4c74cfd6c838befe5d29443c6a403421af1ae68c..172ddea86a0e4aa692202bf7a5346bbfd07f98db 100644 (file)
@@ -122,6 +122,20 @@ public:
   void toStream(std::ostream& out) const;
 };/* class DefineFunctionCommand */
 
+/**
+ * This differs from DefineFunctionCommand only in that it instructs
+ * the SmtEngine to "remember" this function for later retrieval with
+ * getAssignment().  Used for :named attributes in SMT-LIBv2.
+ */
+class CVC4_PUBLIC DefineNamedFunctionCommand : public DefineFunctionCommand {
+public:
+  DefineNamedFunctionCommand(Expr func,
+                             const std::vector<Expr>& formals,
+                             Expr formula);
+  void invoke(SmtEngine* smtEngine);
+  void toStream(std::ostream& out) const;
+};/* class DefineNamedFunctionCommand */
+
 class CVC4_PUBLIC CheckSatCommand : public Command {
 protected:
   BoolExpr d_expr;
@@ -158,6 +172,17 @@ public:
   void toStream(std::ostream& out) const;
 };/* class GetValueCommand */
 
+class CVC4_PUBLIC GetAssignmentCommand : public Command {
+protected:
+  SExpr d_result;
+public:
+  GetAssignmentCommand();
+  void invoke(SmtEngine* smtEngine);
+  SExpr getResult() const;
+  void printResult(std::ostream& out) const;
+  void toStream(std::ostream& out) const;
+};/* class GetAssignmentCommand */
+
 class CVC4_PUBLIC GetAssertionsCommand : public Command {
 protected:
   std::string d_result;
index 8faaefac45502c783729b85c826226ab80e7cd23..57aa84a576793e57c8cc34e835cb0f6af0d9a8cc 100644 (file)
@@ -29,7 +29,7 @@
 #include "util/exception.h"
 #include "util/configuration.h"
 #include "util/output.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/language.h"
 #include "expr/expr.h"
 
index 7fd866112e870cb7b229f12d739ea6fc10f9f5ed..f78637d8263fc2794510577bc9ad5d2b22eb8f90 100644 (file)
@@ -33,7 +33,7 @@
 #include "util/Assert.h"
 #include "util/configuration.h"
 #include "util/output.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/result.h"
 #include "util/stats.h"
 
@@ -42,8 +42,6 @@ using namespace CVC4;
 using namespace CVC4::parser;
 using namespace CVC4::main;
 
-static Result lastResult;
-
 namespace CVC4 {
   namespace main {
     struct Options options;
@@ -203,20 +201,15 @@ int runCvc4(int argc, char* argv[]) {
     delete cmd;
   }
 
-  Result asSatResult = lastResult.asSatisfiabilityResult();
+  string result = smt.getInfo(":status").getValue();
   int returnValue;
 
-  switch(asSatResult.isSAT()) {
-
-  case Result::SAT:
+  if(result == "sat") {
     returnValue = 10;
-    break;
-  case Result::UNSAT:
+  } else if(result == "unsat") {
     returnValue = 20;
-    break;
-  default:
+  } else {
     returnValue = 0;
-    break;
   }
 
 #ifdef CVC4_COMPETITION_MODE
@@ -228,7 +221,7 @@ int runCvc4(int argc, char* argv[]) {
   // Remove the parser
   delete parser;
 
-  ReferenceStat< Result > s_statSatResult("sat/unsat", asSatResult);
+  ReferenceStat< Result > s_statSatResult("sat/unsat", result);
   StatisticsRegistry::registerStat(&s_statSatResult);
 
   if(options.statistics){
@@ -259,15 +252,5 @@ void doCommand(SmtEngine& smt, Command* cmd) {
     } else {
       cmd->invoke(&smt);
     }
-
-    QueryCommand *qc = dynamic_cast<QueryCommand*>(cmd);
-    if(qc != NULL) {
-      lastResult = qc->getResult();
-    } else {
-      CheckSatCommand *csc = dynamic_cast<CheckSatCommand*>(cmd);
-      if(csc != NULL) {
-        lastResult = csc->getResult();
-      }
-    }
   }
 }
index 760bd52581331a008b60e35ad807304ee56158aa..70cb85c9311ac0ef7fd85679ec5390bb5f1e854d 100644 (file)
@@ -24,7 +24,7 @@
 #include <signal.h>
 
 #include "util/exception.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/Assert.h"
 #include "util/stats.h"
 
index ddfd1804ebe836ec9383fe256ee19307cdec59f4..f549d21482d3c59521ca87ef56d6ce673d655f2f 100644 (file)
@@ -248,6 +248,9 @@ command returns [CVC4::Command* cmd]
         $cmd = seq;
       }
     }
+  | /* get-assignment */
+    GET_ASSIGNMENT_TOK
+    { cmd = new GetAssignmentCommand; }
   | /* assertion */
     ASSERT_TOK term[expr]
     { cmd = new AssertCommand(expr); }
@@ -400,7 +403,7 @@ term[CVC4::Expr& expr]
         Expr func = PARSER_STATE->mkFunction(name, expr.getType());
         // bind name to expr with define-fun
         Command* c =
-          new DefineFunctionCommand(func, std::vector<Expr>(), expr);
+          new DefineNamedFunctionCommand(func, std::vector<Expr>(), expr);
         PARSER_STATE->preemptCommand(c);
       } else {
         std::stringstream ss;
@@ -585,6 +588,7 @@ DECLARE_SORT_TOK : 'declare-sort';
 DEFINE_FUN_TOK : 'define-fun';
 DEFINE_SORT_TOK : 'define-sort';
 GET_VALUE_TOK : 'get-value';
+GET_ASSIGNMENT_TOK : 'get-assignment';
 GET_ASSERTIONS_TOK : 'get-assertions';
 EXIT_TOK : 'exit';
 ITE_TOK : 'ite';
index 961a18bdb6427db084b7b897e4927892d0cd0673..de60b5f7d7ca2be7e89a47ff7c5171961d0ded4f 100644 (file)
@@ -24,7 +24,7 @@
 #include "util/decision_engine.h"
 #include "util/Assert.h"
 #include "util/output.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/result.h"
 
 #include <utility>
@@ -93,9 +93,11 @@ void PropEngine::assertLemma(TNode node) {
 
 
 void PropEngine::printSatisfyingAssignment(){
-  const CnfStream::TranslationCache& transCache = d_cnfStream->getTranslationCache();
+  const CnfStream::TranslationCache& transCache =
+    d_cnfStream->getTranslationCache();
   Debug("prop-value") << "Literal | Value | Expr" << endl
-                      << "---------------------------------------------------------" << endl;
+                      << "----------------------------------------"
+                      << "-----------------" << endl;
   for(CnfStream::TranslationCache::const_iterator i = transCache.begin(),
       end = transCache.end();
       i != end;
@@ -105,8 +107,7 @@ void PropEngine::printSatisfyingAssignment(){
     if(!sign(l)) {
       Node n = curr.first;
       SatLiteralValue value = d_satSolver->value(l);
-      Debug("prop-value") << /*setw(4) << */ "'" << l << "' " /*<< setw(4)*/ << value << " " << n
-            << endl;
+      Debug("prop-value") << "'" << l << "' " << value << " " << n << endl;
     }
   }
 }
@@ -126,7 +127,8 @@ Result PropEngine::checkSat() {
     printSatisfyingAssignment();
   }
 
-  Debug("prop") << "PropEngine::checkSat() => " << (result ? "true" : "false") << endl;
+  Debug("prop") << "PropEngine::checkSat() => "
+                << (result ? "true" : "false") << endl;
   return Result(result ? Result::SAT : Result::UNSAT);
 }
 
@@ -154,5 +156,5 @@ void PropEngine::pop() {
   Debug("prop") << "pop()" << endl;
 }
 
-}/* prop namespace */
+}/* CVC4::prop namespace */
 }/* CVC4 namespace */
index 7eb9031804dfac2e85cc3d4d0caec20f26fdef89..1dada2e693473a7a4f9e28366912e4e00e953ed4 100644 (file)
 
 #include "expr/node.h"
 #include "util/result.h"
-#include "util/options.h"
 #include "util/decision_engine.h"
 
 namespace CVC4 {
 
 class TheoryEngine;
+class Options;
 
 namespace prop {
 
@@ -133,7 +133,7 @@ public:
 
 };/* class PropEngine */
 
-}/* prop namespace */
+}/* CVC4::prop namespace */
 }/* CVC4 namespace */
 
 #endif /* __CVC4__PROP_ENGINE_H */
index 776895b4c5bd689c1e762914e400a8642a7d7d9a..a335b733b041af0870704a77492cefabaf11c07f 100644 (file)
@@ -25,9 +25,9 @@
 // Optional blocks below will be unconditionally included
 #define __CVC4_USE_MINISAT
 
-#include "util/options.h"
 #include "util/stats.h"
 #include "theory/theory.h"
+#include "smt/options.h"
 
 #ifdef __CVC4_USE_MINISAT
 
index 319b25576cb0177864ba2d834bfd3c690875d8c6..8878448d533b28e7eec08e54d643a9ae3f08658d 100644 (file)
@@ -10,4 +10,5 @@ libsmt_la_SOURCES = \
        smt_engine.h \
        noninteractive_exception.h \
        bad_option_exception.h \
-       no_such_function_exception.h
+       no_such_function_exception.h \
+       options.h
diff --git a/src/smt/options.h b/src/smt/options.h
new file mode 100644 (file)
index 0000000..7ddaf5d
--- /dev/null
@@ -0,0 +1,136 @@
+/*********************                                                        */
+/*! \file options.h
+ ** \verbatim
+ ** Original author: mdeters
+ ** Major contributors: cconway
+ ** Minor contributors (to current version): dejan
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief Global (command-line, set-option, ...) parameters for SMT.
+ **
+ ** Global (command-line, set-option, ...) parameters for SMT.
+ **/
+
+#include "cvc4_public.h"
+
+#ifndef __CVC4__OPTIONS_H
+#define __CVC4__OPTIONS_H
+
+#ifdef CVC4_DEBUG
+#  define USE_EARLY_TYPE_CHECKING_BY_DEFAULT true
+#else /* CVC4_DEBUG */
+#  define USE_EARLY_TYPE_CHECKING_BY_DEFAULT false
+#endif /* CVC4_DEBUG */
+
+#include <iostream>
+#include <string>
+
+#include "util/language.h"
+
+namespace CVC4 {
+
+struct CVC4_PUBLIC Options {
+
+  std::string binary_name;
+
+  bool statistics;
+
+  std::ostream *out;
+  std::ostream *err;
+
+  /* -1 means no output */
+  /* 0 is normal (and default) -- warnings only */
+  /* 1 is warnings + notices so the user doesn't get too bored */
+  /* 2 is chatty, giving statistical things etc. */
+  /* with 3, the solver is slowed down by all the scrolling */
+  int verbosity;
+
+  /** The input language */
+  InputLanguage inputLanguage;
+
+  /** Enumeration of UF implementation choices */
+  typedef enum { TIM, MORGAN } UfImplementation;
+
+  /** Which implementation of uninterpreted function theory to use */
+  UfImplementation uf_implementation;
+
+  /** Should we exit after parsing? */
+  bool parseOnly;
+
+  /** Should the parser do semantic checks? */
+  bool semanticChecks;
+
+  /** Should the parser memory-map file input? */
+  bool memoryMap;
+
+  /** Should we strictly enforce the language standard while parsing? */
+  bool strictParsing;
+
+  /** Should we expand function definitions lazily? */
+  bool lazyDefinitionExpansion;
+
+  /** Whether we're in interactive mode or not */
+  bool interactive;
+
+  /**
+   * Whether we're in interactive mode (or not) due to explicit user
+   * setting (if false, we inferred the proper default setting).
+   */
+  bool interactiveSetByUser;
+
+  /** Whether we support SmtEngine::getValue() for this run. */
+  bool produceModels;
+
+  /** Whether we support SmtEngine::getAssignment() for this run. */
+  bool produceAssignments;
+
+  /** Whether we do typechecking at Expr creation time. */
+  bool earlyTypeChecking;
+
+  Options() :
+    binary_name(),
+    statistics(false),
+    out(0),
+    err(0),
+    verbosity(0),
+    inputLanguage(language::input::LANG_AUTO),
+    uf_implementation(MORGAN),
+    parseOnly(false),
+    semanticChecks(true),
+    memoryMap(false),
+    strictParsing(false),
+    lazyDefinitionExpansion(false),
+    interactive(false),
+    interactiveSetByUser(false),
+    produceModels(false),
+    produceAssignments(false),
+    earlyTypeChecking(USE_EARLY_TYPE_CHECKING_BY_DEFAULT) {
+  }
+};/* struct Options */
+
+inline std::ostream& operator<<(std::ostream& out,
+                                Options::UfImplementation uf) {
+  switch(uf) {
+  case Options::TIM:
+    out << "TIM";
+    break;
+  case Options::MORGAN:
+    out << "MORGAN";
+    break;
+  default:
+    out << "UfImplementation:UNKNOWN![" << unsigned(uf) << "]";
+  }
+
+  return out;
+}
+
+}/* CVC4 namespace */
+
+#undef USE_EARLY_TYPE_CHECKING_BY_DEFAULT
+
+#endif /* __CVC4__OPTIONS_H */
index edf49c7ac2a6042a2da831dbfe7d0b200565e20c..3d6f304b55d2460f3a369b3db0047b8efe63ab17 100644 (file)
@@ -18,6 +18,7 @@
 
 #include <vector>
 #include <string>
+#include <sstream>
 
 #include "smt/smt_engine.h"
 #include "smt/modal_exception.h"
@@ -30,7 +31,7 @@
 #include "expr/node_builder.h"
 #include "util/output.h"
 #include "util/exception.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/configuration.h"
 #include "prop/prop_engine.h"
 #include "theory/theory_engine.h"
@@ -120,7 +121,9 @@ SmtEngine::SmtEngine(ExprManager* em, const Options* opts) throw() :
   d_decisionEngine(NULL),
   d_theoryEngine(NULL),
   d_propEngine(NULL),
+  d_definedFunctions(NULL),
   d_assertionList(NULL),
+  d_assignments(NULL),
   d_haveAdditions(false),
   d_status() {
 
@@ -152,6 +155,10 @@ SmtEngine::~SmtEngine() {
 
   shutdown();
 
+  if(d_assignments != NULL) {
+    d_assignments->deleteSelf();
+  }
+
   if(d_assertionList != NULL) {
     d_assertionList->deleteSelf();
   }
@@ -183,15 +190,7 @@ void SmtEngine::setInfo(const string& key, const SExpr& value)
       throw BadOptionException("argument to (set-info :status ..) must be "
                                "`sat' or `unsat' or `unknown'");
     }
-    if(s == "sat") {
-      d_status = Result::SAT;
-    } else if(s == "unsat") {
-      d_status = Result::UNSAT;
-    } else if(s == "unknown") {
-      d_status = Result::SAT_UNKNOWN;
-    } else {
-      Unreachable();
-    }
+    d_status = Result(s);
     return;
   }
   throw BadOptionException();
@@ -220,19 +219,16 @@ SExpr SmtEngine::getInfo(const string& key) const
   } else if(key == ":authors") {
     return Configuration::about();
   } else if(key == ":status") {
-    enum Result::SAT status = d_status.asSatisfiabilityResult().isSAT();
-    switch(status) {
-    case Result::SAT:
-      return SExpr("sat");
-    case Result::UNSAT:
-      return SExpr("unsat");
-    case Result::SAT_UNKNOWN:
-      return SExpr("unknown");
-    default:
-      Unhandled(status);
-    }
+    return d_status.asSatisfiabilityResult().toString();
   } else if(key == ":reason-unknown") {
-    throw BadOptionException();
+    if(d_status.isUnknown()) {
+      stringstream ss;
+      ss << d_status.whyUnknown();
+      return ss.str();
+    } else {
+      throw ModalException("Can't get-info :reason-unknown when the "
+                           "last result wasn't unknown!");
+    }
   } else {
     throw BadOptionException();
   }
@@ -241,8 +237,31 @@ SExpr SmtEngine::getInfo(const string& key) const
 void SmtEngine::setOption(const string& key, const SExpr& value)
   throw(BadOptionException) {
   Debug("smt") << "SMT setOption(" << key << ", " << value << ")" << endl;
-  // FIXME implement me
-  throw BadOptionException();
+  if(key == ":print-success") {
+    throw BadOptionException();
+  } else if(key == ":expand-definitions") {
+    throw BadOptionException();
+  } else if(key == ":interactive-mode") {
+    throw BadOptionException();
+  } else if(key == ":produce-proofs") {
+    throw BadOptionException();
+  } else if(key == ":produce-unsat-cores") {
+    throw BadOptionException();
+  } else if(key == ":produce-models") {
+    throw BadOptionException();
+  } else if(key == ":produce-assignments") {
+    throw BadOptionException();
+  } else if(key == ":regular-output-channel") {
+    throw BadOptionException();
+  } else if(key == ":diagnostic-output-channel") {
+    throw BadOptionException();
+  } else if(key == ":random-seed") {
+    throw BadOptionException();
+  } else if(key == ":verbosity") {
+    throw BadOptionException();
+  } else {
+    throw BadOptionException();
+  }
 }
 
 SExpr SmtEngine::getOption(const string& key) const
@@ -386,7 +405,7 @@ Result SmtEngine::check() {
 
 Result SmtEngine::quickCheck() {
   Debug("smt") << "SMT quickCheck()" << endl;
-  return Result(Result::VALIDITY_UNKNOWN);
+  return Result(Result::VALIDITY_UNKNOWN, Result::REQUIRES_FULL_CHECK);
 }
 
 void SmtEnginePrivate::addFormula(SmtEngine& smt, TNode n)
@@ -454,7 +473,7 @@ Expr SmtEngine::simplify(const Expr& e) {
   Unimplemented();
 }
 
-Expr SmtEngine::getValue(Expr e)
+Expr SmtEngine::getValue(const Expr& e)
   throw(ModalException, AssertionException) {
   Assert(e.getExprManager() == d_exprManager);
   Type type = e.getType(true);// ensure expr is type-checked at this point
@@ -494,19 +513,73 @@ Expr SmtEngine::getValue(Expr e)
   return Expr(d_exprManager, new Node(resultNode));
 }
 
+bool SmtEngine::addToAssignment(const Expr& e) throw(AssertionException) {
+  NodeManagerScope nms(d_nodeManager);
+  Type type = e.getType(true);
+  // must be Boolean
+  CheckArgument( type.isBoolean(), e,
+                 "expected Boolean-typed variable or function application "
+                 "in addToAssignment()" );
+  Node n = e.getNode();
+  // must be an APPLY of a zero-ary defined function, or a variable
+  CheckArgument( ( ( n.getKind() == kind::APPLY &&
+                     ( d_definedFunctions->find(n.getOperator()) !=
+                       d_definedFunctions->end() ) &&
+                     n.getNumChildren() == 0 ) ||
+                   n.getMetaKind() == kind::metakind::VARIABLE ), e,
+                 "expected variable or defined-function application "
+                 "in addToAssignment(),\ngot %s", e.toString().c_str() );
+  if(!d_options->interactive || !d_options->produceAssignments) {
+    return false;
+  }
+  if(d_assignments == NULL) {
+    d_assignments = new(true) AssignmentSet(d_context);
+  }
+  d_assignments->insert(n);
+
+  return true;
+}
+
 SExpr SmtEngine::getAssignment() throw(ModalException, AssertionException) {
   Debug("smt") << "SMT getAssignment()" << endl;
   if(!d_options->produceAssignments) {
     const char* msg =
-      "Cannot get the current assignment when produce-assignments option is off.";
+      "Cannot get the current assignment when "
+      "produce-assignments option is off.";
     throw ModalException(msg);
   }
   // TODO also check that the last query was sat/unknown, without intervening
   // assertions
 
   NodeManagerScope nms(d_nodeManager);
+  vector<SExpr> sexprs;
+  TypeNode boolType = d_nodeManager->booleanType();
+  for(AssignmentSet::const_iterator i = d_assignments->begin(),
+        iend = d_assignments->end();
+      i != iend;
+      ++i) {
+    Assert((*i).getType() == boolType);
 
-  Unimplemented();
+    Node n = SmtEnginePrivate::preprocess(*this, *i);
+
+    Debug("smt") << "--- getting value of " << n << endl;
+    Node resultNode = d_theoryEngine->getValue(n);
+
+    // type-check the result we got
+    Assert(resultNode.isNull() || resultNode.getType(true) == boolType);
+
+    vector<SExpr> v;
+    if((*i).getKind() == kind::APPLY) {
+      Assert((*i).getNumChildren() == 0);
+      v.push_back((*i).getOperator().toString());
+    } else {
+      Assert((*i).getMetaKind() == kind::metakind::VARIABLE);
+      v.push_back((*i).toString());
+    }
+    v.push_back(resultNode.toString());
+    sexprs.push_back(v);
+  }
+  return SExpr(sexprs);
 }
 
 vector<Expr> SmtEngine::getAssertions()
index 7272762d83aeeadb39a199a66b0798f28a5651e2..d6940f09fcd636ef94ad140f98af288157142403 100644 (file)
@@ -26,6 +26,7 @@
 #include "expr/expr.h"
 #include "expr/expr_manager.h"
 #include "context/cdmap_forward.h"
+#include "context/cdset_forward.h"
 #include "util/result.h"
 #include "util/model.h"
 #include "util/sexpr.h"
@@ -88,6 +89,8 @@ class CVC4_PUBLIC SmtEngine {
     DefinedFunctionMap;
   /** The type of our internal assertion list */
   typedef context::CDList<Expr> AssertionList;
+  /** The type of our internal assignment set */
+  typedef context::CDSet<Node, NodeHashFunction> AssignmentSet;
 
   /** Our Context */
   context::Context* d_context;
@@ -111,6 +114,11 @@ class CVC4_PUBLIC SmtEngine {
    */
   AssertionList* d_assertionList;
 
+  /**
+   * List of items for which to retrieve values using getAssignment().
+   */
+  AssignmentSet* d_assignments;
+
   /**
    * Whether or not we have added any
    * assertions/declarations/definitions since the last checkSat/query
@@ -229,7 +237,18 @@ public:
    * by a SAT or INVALID query).  Only permitted if the SmtEngine is
    * set to operate interactively and produce-models is on.
    */
-  Expr getValue(Expr e) throw(ModalException, AssertionException);
+  Expr getValue(const Expr& e) throw(ModalException, AssertionException);
+
+  /**
+   * Add a function to the set of expressions whose value is to be
+   * later returned by a call to getAssignment().  The expression
+   * should be a Boolean zero-ary defined function or a Boolean
+   * variable.  Rather than throwing a ModalException on modal
+   * failures (not in interactive mode or not producing assignments),
+   * this function returns true if the expression was added and false
+   * if this request was ignored.
+   */
+  bool addToAssignment(const Expr& e) throw(AssertionException);
 
   /**
    * Get the assignment (only if immediately preceded by a SAT or
index 0b21eedae44e08ae76910f045fa9f32066733b25..181508c541b7867de8c368d0131f902ede3668f1 100644 (file)
@@ -51,8 +51,8 @@ namespace theory {
 class SharedData : public context::ContextObj {
 private:
   /**
-   * Bit-vector representation of list of theories needing to be notified if
-   * this shared term is no longer the representative
+   * Bit-vector representation of list of theories needing to be
+   * notified if this shared term is no longer the representative
    */
   uint64_t d_theories;
 
@@ -72,25 +72,29 @@ private:
   SharedData* d_proofNext;
 
   /**
-   * In order to precisely reconstruct the equality that justifies this node
-   * being equal to the node at d_proofNext, we need to know whether this edge
-   * has been switched.  Value is meaningless at the proof root.
+   * In order to precisely reconstruct the equality that justifies
+   * this node being equal to the node at d_proofNext, we need to know
+   * whether this edge has been switched.  Value is meaningless at the
+   * proof root.
    */
   bool d_edgeReversed;
 
   /**
-   * The theory that can explain the equality of this node and the node at
-   * d_proofNext.  Not valid if this is proof root.
+   * The theory that can explain the equality of this node and the
+   * node at d_proofNext.  Not valid if this is proof root.
    */
   theory::Theory* d_explainingTheory;
 
   /**
-   * This is a pointer back to the node associated with this SharedData object.
+   * This is a pointer back to the node associated with this
+   * SharedData object.
    *
    * The following invariant should be maintained:
-   *  (n.getAttribute(SharedAttr()))->d_rep == n
-   * i.e. rep is equal to the node that maps to the SharedData using SharedAttr.
    *
+   *   (n.getAttribute(SharedAttr()))->d_rep == n
+   *
+   * i.e. rep is equal to the node that maps to the SharedData using
+   * SharedAttr.
    */
   TNode d_rep;
 
@@ -133,8 +137,8 @@ public:
   void setSize(unsigned size) { makeCurrent(); d_size = size; }
 
   /**
-   * Returns the find pointer of the SharedData.
-   * If this is the representative of the equivalence class, then getFind() == this
+   * Returns the find pointer of the SharedData.  If this is the
+   * representative of the equivalence class, then getFind() == this
    */
   SharedData* getFind() const { return d_find; }
 
@@ -169,13 +173,15 @@ public:
   void setEdgeReversed(bool value) { makeCurrent(); d_edgeReversed = value; }
 
   /**
-   * Get the original equality that created the link from this node to the next
-   * proof node.
+   * Get the original equality that created the link from this node to
+   * the next proof node.
    */
   Node getEquality() const {
     return d_edgeReversed
-      ? NodeManager::currentNM()->mkNode(kind::EQUAL, d_proofNext->getRep(), d_rep)
-      : NodeManager::currentNM()->mkNode(kind::EQUAL, d_rep, d_proofNext->getRep());
+      ? NodeManager::currentNM()->mkNode(kind::EQUAL,
+                                         d_proofNext->getRep(), d_rep)
+      : NodeManager::currentNM()->mkNode(kind::EQUAL,
+                                         d_rep, d_proofNext->getRep());
   }
 
   /**
@@ -186,7 +192,10 @@ public:
   /**
    * Set the explaining theory
    */
-  void setExplainingTheory(theory::Theory* t) { makeCurrent(); d_explainingTheory = t; }
+  void setExplainingTheory(theory::Theory* t) {
+    makeCurrent();
+    d_explainingTheory = t;
+  }
 
   /**
    * Get the shared term associated with this data
index 49bd447d71d9fefbc49d1c4bdd88cd16572911b6..7263ac93a60c4c006f3219b28d0d4682629e4185 100644 (file)
@@ -21,6 +21,9 @@
 #ifndef __CVC4__SHARED_TERM_MANAGER_H
 #define __CVC4__SHARED_TERM_MANAGER_H
 
+#include <set>
+#include <vector>
+
 #include "expr/node.h"
 #include "theory/shared_data.h"
 
@@ -50,18 +53,20 @@ class SharedTermManager {
   context::Context* d_context;
 
   /**
-   * List of all theories indexed by theory id (built by calls to registerTheory)
+   * List of all theories indexed by theory id (built by calls to
+   * registerTheory())
    */
   std::vector<theory::Theory*> d_theories;
 
   /**
-   * Private method to find equivalence class representative in union-find data
-   * structure.
+   * Private method to find equivalence class representative in
+   * union-find data structure.
    */
   SharedData* find(SharedData* pData) const;
 
   /**
-   * Helper function for explain: add all reasons for equality at pData to set s
+   * Helper function for explain: add all reasons for equality at
+   * pData to set s
    */
   void collectExplanations(SharedData* pData, std::set<Node>& s) const;
 
@@ -77,27 +82,30 @@ public:
   void registerTheory(theory::Theory* th);
 
   /**
-   * Called by theory engine to indicate that node n is shared by theories
-   * parent and child.
+   * Called by theory engine to indicate that node n is shared by
+   * theories parent and child.
    */
   void addTerm(TNode n, theory::Theory* parent,
                theory::Theory* child);
 
   /**
-   * Called by theory engine or theories to notify the shared term manager that
-   * two terms are equal.
+   * Called by theory engine or theories to notify the shared term
+   * manager that two terms are equal.
    *
    * @param eq the equality between shared terms
-   * @param thReason the theory that knows why, NULL means it's a SAT assertion
+   * @param thReason the theory that knows why, NULL means it's a SAT
+   * assertion
    */
   void addEq(TNode eq, theory::Theory* thReason = NULL);
 
   /**
-   * Called by theory engine or theories to notify the shared term manager that
-   * two terms are disequal.
+   * Called by theory engine or theories to notify the shared term
+   * manager that two terms are disequal.
    *
-   * @param eq the equality between shared terms whose negation now holds
-   * @param thReason the theory that knows why, NULL means it's a SAT assertion
+   * @param eq the equality between shared terms whose negation now
+   * holds
+   * @param thReason the theory that knows why, NULL means it's a SAT
+   * assertion
    */
   void addDiseq(TNode eq, theory::Theory* thReason = NULL) { }
 
index 388167e0024c7b2dd8dce373299d128a20048bfc..384e2fdd6fadfc39bfaffd1a2acd080e3a74a125 100644 (file)
@@ -21,6 +21,7 @@
 #include "expr/attribute.h"
 #include "theory/theory.h"
 #include "expr/node_builder.h"
+#include "smt/options.h"
 
 #include <vector>
 #include <list>
@@ -116,6 +117,57 @@ void TheoryEngine::EngineOutputChannel::newFact(TNode fact) {
   }
 }
 
+TheoryEngine::TheoryEngine(context::Context* ctxt, const Options* opts) :
+  d_propEngine(NULL),
+  d_theoryOut(this, ctxt),
+  d_hasShutDown(false),
+  d_statistics() {
+
+  d_sharedTermManager = new SharedTermManager(this, ctxt);
+
+  d_builtin = new theory::builtin::TheoryBuiltin(0, ctxt, d_theoryOut);
+  d_bool = new theory::booleans::TheoryBool(1, ctxt, d_theoryOut);
+  switch(opts->uf_implementation) {
+  case Options::TIM:
+    d_uf = new theory::uf::tim::TheoryUFTim(2, ctxt, d_theoryOut);
+    break;
+  case Options::MORGAN:
+    d_uf = new theory::uf::morgan::TheoryUFMorgan(2, ctxt, d_theoryOut);
+    break;
+  default:
+    Unhandled(opts->uf_implementation);
+  }
+  d_arith = new theory::arith::TheoryArith(3, ctxt, d_theoryOut);
+  d_arrays = new theory::arrays::TheoryArrays(4, ctxt, d_theoryOut);
+  d_bv = new theory::bv::TheoryBV(5, ctxt, d_theoryOut);
+
+  d_sharedTermManager->registerTheory(d_builtin);
+  d_sharedTermManager->registerTheory(d_bool);
+  d_sharedTermManager->registerTheory(d_uf);
+  d_sharedTermManager->registerTheory(d_arith);
+  d_sharedTermManager->registerTheory(d_arrays);
+  d_sharedTermManager->registerTheory(d_bv);
+
+  d_theoryOfTable.registerTheory(d_builtin);
+  d_theoryOfTable.registerTheory(d_bool);
+  d_theoryOfTable.registerTheory(d_uf);
+  d_theoryOfTable.registerTheory(d_arith);
+  d_theoryOfTable.registerTheory(d_arrays);
+  d_theoryOfTable.registerTheory(d_bv);
+}
+
+TheoryEngine::~TheoryEngine() {
+  Assert(d_hasShutDown);
+
+  delete d_bv;
+  delete d_arrays;
+  delete d_arith;
+  delete d_uf;
+  delete d_bool;
+  delete d_builtin;
+
+  delete d_sharedTermManager;
+}
 
 Theory* TheoryEngine::theoryOf(TypeNode t) {
   // FIXME: we don't yet have a Type-to-Theory map.  When we do,
index 0eaf6105570487750fb8da06ec4462b0e9410318..2d056af28da5bff854c1bf9ea316a25bdde28e0c 100644 (file)
@@ -36,7 +36,6 @@
 #include "theory/arrays/theory_arrays.h"
 #include "theory/bv/theory_bv.h"
 
-#include "util/options.h"
 #include "util/stats.h"
 
 namespace CVC4 {
@@ -202,57 +201,12 @@ public:
   /**
    * Construct a theory engine.
    */
-  TheoryEngine(context::Context* ctxt, const Options* opts) :
-    d_propEngine(NULL),
-    d_theoryOut(this, ctxt),
-    d_hasShutDown(false),
-    d_statistics() {
-
-    d_sharedTermManager = new SharedTermManager(this, ctxt);
-
-    d_builtin = new theory::builtin::TheoryBuiltin(0, ctxt, d_theoryOut);
-    d_bool = new theory::booleans::TheoryBool(1, ctxt, d_theoryOut);
-    switch(opts->uf_implementation) {
-    case Options::TIM:
-      d_uf = new theory::uf::tim::TheoryUFTim(2, ctxt, d_theoryOut);
-      break;
-    case Options::MORGAN:
-      d_uf = new theory::uf::morgan::TheoryUFMorgan(2, ctxt, d_theoryOut);
-      break;
-    default:
-      Unhandled(opts->uf_implementation);
-    }
-    d_arith = new theory::arith::TheoryArith(3, ctxt, d_theoryOut);
-    d_arrays = new theory::arrays::TheoryArrays(4, ctxt, d_theoryOut);
-    d_bv = new theory::bv::TheoryBV(5, ctxt, d_theoryOut);
-
-    d_sharedTermManager->registerTheory(d_builtin);
-    d_sharedTermManager->registerTheory(d_bool);
-    d_sharedTermManager->registerTheory(d_uf);
-    d_sharedTermManager->registerTheory(d_arith);
-    d_sharedTermManager->registerTheory(d_arrays);
-    d_sharedTermManager->registerTheory(d_bv);
-
-    d_theoryOfTable.registerTheory(d_builtin);
-    d_theoryOfTable.registerTheory(d_bool);
-    d_theoryOfTable.registerTheory(d_uf);
-    d_theoryOfTable.registerTheory(d_arith);
-    d_theoryOfTable.registerTheory(d_arrays);
-    d_theoryOfTable.registerTheory(d_bv);
-  }
-
-  ~TheoryEngine() {
-    Assert(d_hasShutDown);
-
-    delete d_bv;
-    delete d_arrays;
-    delete d_arith;
-    delete d_uf;
-    delete d_bool;
-    delete d_builtin;
+  TheoryEngine(context::Context* ctxt, const Options* opts);
 
-    delete d_sharedTermManager;
-  }
+  /**
+   * Destroy a theory engine.
+   */
+  ~TheoryEngine();
 
   SharedTermManager* getSharedTermManager() {
     return d_sharedTermManager;
index dbbdfe9b7f79b21c5c9db2fab60a7e38267a3592..5bb2e830f036f056b8e635b4cf2f942d8abfe98b 100644 (file)
@@ -163,7 +163,7 @@ public:
     va_list args;
     va_start(args, fmt);
     construct("Illegal argument detected",
-              ( std::string(argDesc) + " invalid" ).c_str(),
+              ( std::string("`") + argDesc + "' is a bad argument" ).c_str(),
               function, file, line, fmt, args);
     va_end(args);
   }
@@ -172,7 +172,7 @@ public:
                            const char* file, unsigned line) :
     AssertionException() {
     construct("Illegal argument detected",
-              ( std::string(argDesc) + " invalid" ).c_str(),
+              ( std::string("`") + argDesc + "' is a bad argument" ).c_str(),
               function, file, line);
   }
 
@@ -183,7 +183,7 @@ public:
     va_list args;
     va_start(args, fmt);
     construct("Illegal argument detected",
-              ( std::string(argDesc) + " invalid; expected " +
+              ( std::string("`") + argDesc + "' is a bad argument; expected " +
                 condStr + " to hold" ).c_str(),
               function, file, line, fmt, args);
     va_end(args);
@@ -194,7 +194,7 @@ public:
                            unsigned line) :
     AssertionException() {
     construct("Illegal argument detected",
-              ( std::string(argDesc) + " invalid; expected " +
+              ( std::string("`") + argDesc + "' is a bad argument; expected " +
                 condStr + " to hold" ).c_str(),
               function, file, line);
   }
index 02315143d83dfa0664f1e1a456f04d22779531a5..61c0bf885cb1da68fa42827a5910a25b8062f03e 100644 (file)
@@ -18,10 +18,10 @@ libutil_la_SOURCES = \
        hash.h \
        bool.h \
        model.h \
-       options.h \
        output.cpp \
        output.h \
        result.h \
+       result.cpp \
        unique_id.h \
        configuration.h \
        configuration_private.h \
diff --git a/src/util/options.h b/src/util/options.h
deleted file mode 100644 (file)
index af254da..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-/*********************                                                        */
-/*! \file options.h
- ** \verbatim
- ** Original author: mdeters
- ** Major contributors: cconway
- ** Minor contributors (to current version): dejan
- ** This file is part of the CVC4 prototype.
- ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
- ** Courant Institute of Mathematical Sciences
- ** New York University
- ** See the file COPYING in the top-level source directory for licensing
- ** information.\endverbatim
- **
- ** \brief Global (command-line or equivalent) tuning parameters.
- **
- ** Global (command-line or equivalent) tuning parameters.
- **/
-
-#include "cvc4_public.h"
-
-#ifndef __CVC4__OPTIONS_H
-#define __CVC4__OPTIONS_H
-
-#ifdef CVC4_DEBUG
-#  define USE_EARLY_TYPE_CHECKING_BY_DEFAULT true
-#else /* CVC4_DEBUG */
-#  define USE_EARLY_TYPE_CHECKING_BY_DEFAULT false
-#endif /* CVC4_DEBUG */
-
-#include <iostream>
-#include <string>
-
-#include "util/language.h"
-
-namespace CVC4 {
-
-struct CVC4_PUBLIC Options {
-
-  std::string binary_name;
-
-  bool statistics;
-
-  std::ostream *out;
-  std::ostream *err;
-
-  /* -1 means no output */
-  /* 0 is normal (and default) -- warnings only */
-  /* 1 is warnings + notices so the user doesn't get too bored */
-  /* 2 is chatty, giving statistical things etc. */
-  /* with 3, the solver is slowed down by all the scrolling */
-  int verbosity;
-
-  /** The input language */
-  InputLanguage inputLanguage;
-
-  /** Enumeration of UF implementation choices */
-  typedef enum { TIM, MORGAN } UfImplementation;
-
-  /** Which implementation of uninterpreted function theory to use */
-  UfImplementation uf_implementation;
-
-  /** Should we exit after parsing? */
-  bool parseOnly;
-
-  /** Should the parser do semantic checks? */
-  bool semanticChecks;
-
-  /** Should the parser memory-map file input? */
-  bool memoryMap;
-
-  /** Should we strictly enforce the language standard while parsing? */
-  bool strictParsing;
-
-  /** Should we expand function definitions lazily? */
-  bool lazyDefinitionExpansion;
-
-  /** Whether we're in interactive mode or not */
-  bool interactive;
-
-  /**
-   * Whether we're in interactive mode (or not) due to explicit user
-   * setting (if false, we inferred the proper default setting).
-   */
-  bool interactiveSetByUser;
-
-  /** Whether we support SmtEngine::getValue() for this run. */
-  bool produceModels;
-
-  /** Whether we support SmtEngine::getAssignment() for this run. */
-  bool produceAssignments;
-
-  /** Whether we support SmtEngine::getAssignment() for this run. */
-  bool earlyTypeChecking;
-
-  Options() :
-    binary_name(),
-    statistics(false),
-    out(0),
-    err(0),
-    verbosity(0),
-    inputLanguage(language::input::LANG_AUTO),
-    uf_implementation(MORGAN),
-    parseOnly(false),
-    semanticChecks(true),
-    memoryMap(false),
-    strictParsing(false),
-    lazyDefinitionExpansion(false),
-    interactive(false),
-    interactiveSetByUser(false),
-    produceModels(false),
-    produceAssignments(false),
-    earlyTypeChecking(USE_EARLY_TYPE_CHECKING_BY_DEFAULT) {
-  }
-};/* struct Options */
-
-inline std::ostream& operator<<(std::ostream& out,
-                                Options::UfImplementation uf) {
-  switch(uf) {
-  case Options::TIM:
-    out << "TIM";
-    break;
-  case Options::MORGAN:
-    out << "MORGAN";
-    break;
-  default:
-    out << "UfImplementation:UNKNOWN![" << unsigned(uf) << "]";
-  }
-
-  return out;
-}
-
-}/* CVC4 namespace */
-
-#undef USE_EARLY_TYPE_CHECKING_BY_DEFAULT
-
-#endif /* __CVC4__OPTIONS_H */
diff --git a/src/util/result.cpp b/src/util/result.cpp
new file mode 100644 (file)
index 0000000..b8f34f4
--- /dev/null
@@ -0,0 +1,210 @@
+/*********************                                                        */
+/*! \file result.h
+ ** \verbatim
+ ** Original author: mdeters
+ ** Major contributors: none
+ ** Minor contributors (to current version): none
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Courant Institute of Mathematical Sciences
+ ** New York University
+ ** See the file COPYING in the top-level source directory for licensing
+ ** information.\endverbatim
+ **
+ ** \brief Encapsulation of the result of a query.
+ **
+ ** Encapsulation of the result of a query.
+ **/
+
+#include <iostream>
+#include <algorithm>
+#include <string>
+#include <cctype>
+
+#include "util/result.h"
+#include "util/Assert.h"
+
+using namespace std;
+
+namespace CVC4 {
+
+Result::Result(const string& instr) :
+  d_sat(SAT_UNKNOWN),
+  d_validity(VALIDITY_UNKNOWN),
+  d_which(TYPE_NONE),
+  d_unknownExplanation(UNKNOWN_REASON) {
+  string s = instr;
+  transform(s.begin(), s.end(), s.begin(), ::tolower);
+  if(s == "sat" || s == "satisfiable") {
+    d_which = TYPE_SAT;
+    d_sat = SAT;
+  } else if(s == "unsat" || s == "unsatisfiable") {
+    d_which = TYPE_SAT;
+    d_sat = UNSAT;
+  } else if(s == "valid") {
+    d_which = TYPE_VALIDITY;
+    d_validity = VALID;
+  } else if(s == "invalid") {
+    d_which = TYPE_VALIDITY;
+    d_validity = INVALID;
+  } else if(s == "unknown") {
+    d_which = TYPE_SAT;
+    d_sat = SAT_UNKNOWN;
+  } else if(s == "incomplete") {
+    d_which = TYPE_SAT;
+    d_sat = SAT_UNKNOWN;
+    d_unknownExplanation = INCOMPLETE;
+  } else if(s == "timeout") {
+    d_which = TYPE_SAT;
+    d_sat = SAT_UNKNOWN;
+    d_unknownExplanation = TIMEOUT;
+  } else if(s == "memout") {
+    d_which = TYPE_SAT;
+    d_sat = SAT_UNKNOWN;
+    d_unknownExplanation = MEMOUT;
+  } else {
+    IllegalArgument(s, "expected satisfiability/validity result, "
+                    "instead got `%s'", s.c_str());
+  }
+}
+
+bool Result::operator==(const Result& r) const {
+  if(d_which != r.d_which) {
+    return false;
+  }
+  if(d_which == TYPE_SAT) {
+    return d_sat == r.d_sat &&
+      ( d_sat != SAT_UNKNOWN ||
+        d_unknownExplanation == r.d_unknownExplanation );
+  }
+  if(d_which == TYPE_VALIDITY) {
+    return d_validity == r.d_validity &&
+      ( d_validity != VALIDITY_UNKNOWN ||
+        d_unknownExplanation == r.d_unknownExplanation );
+  }
+  return false;
+}
+
+Result Result::asSatisfiabilityResult() const {
+  if(d_which == TYPE_SAT) {
+    return *this;
+  }
+
+  Assert(d_which == TYPE_VALIDITY);
+
+  switch(d_validity) {
+
+  case INVALID:
+    return Result(SAT);
+
+  case VALID:
+    return Result(UNSAT);
+
+  case VALIDITY_UNKNOWN:
+    return Result(SAT_UNKNOWN, d_unknownExplanation);
+
+  default:
+    Unhandled(d_validity);
+  }
+}
+
+Result Result::asValidityResult() const {
+  if(d_which == TYPE_VALIDITY) {
+    return *this;
+  }
+
+  Assert(d_which == TYPE_SAT);
+
+  switch(d_sat) {
+
+  case SAT:
+    return Result(INVALID);
+
+  case UNSAT:
+    return Result(VALID);
+
+  case SAT_UNKNOWN:
+    return Result(VALIDITY_UNKNOWN, d_unknownExplanation);
+
+  default:
+    Unhandled(d_sat);
+  }
+}
+
+string Result::toString() const {
+  stringstream ss;
+  ss << *this;
+  return ss.str();
+}
+
+ostream& operator<<(ostream& out, enum Result::Sat s) {
+  switch(s) {
+  case Result::UNSAT: out << "UNSAT"; break;
+  case Result::SAT: out << "SAT"; break;
+  case Result::SAT_UNKNOWN: out << "SAT_UNKNOWN"; break;
+  default: Unhandled(s);
+  }
+  return out;
+}
+
+ostream& operator<<(ostream& out, enum Result::Validity v) {
+  switch(v) {
+  case Result::INVALID: out << "INVALID"; break;
+  case Result::VALID: out << "VALID"; break;
+  case Result::VALIDITY_UNKNOWN: out << "VALIDITY_UNKNOWN"; break;
+  default: Unhandled(v);
+  }
+  return out;
+}
+
+ostream& operator<<(ostream& out,
+                    enum Result::UnknownExplanation e) {
+  switch(e) {
+  case Result::REQUIRES_FULL_CHECK: out << "REQUIRES_FULL_CHECK"; break;
+  case Result::INCOMPLETE: out << "INCOMPLETE"; break;
+  case Result::TIMEOUT: out << "TIMEOUT"; break;
+  case Result::MEMOUT: out << "MEMOUT"; break;
+  case Result::OTHER: out << "OTHER"; break;
+  case Result::UNKNOWN_REASON: out << "UNKNOWN_REASON"; break;
+  default: Unhandled(e);
+  }
+  return out;
+}
+
+ostream& operator<<(ostream& out, const Result& r) {
+  if(r.d_which == Result::TYPE_SAT) {
+    switch(r.d_sat) {
+    case Result::UNSAT:
+      out << "unsat";
+      break;
+    case Result::SAT:
+      out << "sat";
+      break;
+    case Result::SAT_UNKNOWN:
+      out << "unknown";
+      if(r.whyUnknown() != Result::UNKNOWN_REASON) {
+        out << " (" << r.whyUnknown() << ")";
+      }
+      break;
+    }
+  } else {
+    switch(r.d_validity) {
+    case Result::INVALID:
+      out << "invalid";
+      break;
+    case Result::VALID:
+      out << "valid";
+      break;
+    case Result::VALIDITY_UNKNOWN:
+      out << "unknown";
+      if(r.whyUnknown() != Result::UNKNOWN_REASON) {
+        out << " (" << r.whyUnknown() << ")";
+      }
+      break;
+    }
+  }
+
+  return out;
+}/* operator<<(ostream&, const Result&) */
+
+}/* CVC4 namespace */
index f1f6ae1c2c35acfa5e99fe57f2aed20ada9bfcfa..fc2fa4522940aff61d2b3336509947e4d56bb20a 100644 (file)
 #ifndef __CVC4__RESULT_H
 #define __CVC4__RESULT_H
 
+#include <iostream>
+#include <string>
+
+#include "util/Assert.h"
+
 namespace CVC4 {
 
-// TODO: perhaps best to templatize Result on its Kind (SAT/Validity),
-// but this requires doing the same for Prover and needs discussion.
+// TODO: either templatize Result on its Kind (Sat/Validity) or subclass.
+// TODO: INVALID/SAT provide models, etc?---perhaps just by linking back
+// into the SmtEngine that produced the Result?
+// TODO: make unconstructible except by SmtEngine?  That would ensure that
+// any Result in the system is bona fide.
 
-// TODO: subclass to provide models, etc.  This is really just
-// intended as a three-valued response code.
+class Result;
+
+std::ostream& operator<<(std::ostream& out, const Result& r) CVC4_PUBLIC;
 
 /**
- * Three-valued, immutable SMT result, with optional explanation.
+ * Three-valued SMT result, with optional explanation.
  */
 class CVC4_PUBLIC Result {
 public:
-  enum SAT {
+  enum Sat {
     UNSAT = 0,
     SAT = 1,
     SAT_UNKNOWN = 2
@@ -50,121 +59,95 @@ public:
     REQUIRES_FULL_CHECK,
     INCOMPLETE,
     TIMEOUT,
-    BAIL,
-    OTHER
+    MEMOUT,
+    OTHER,
+    UNKNOWN_REASON
   };
 
 private:
-  enum SAT      d_sat;
+  enum Sat d_sat;
   enum Validity d_validity;
   enum { TYPE_SAT, TYPE_VALIDITY, TYPE_NONE } d_which;
+  enum UnknownExplanation d_unknownExplanation;
 
-  friend std::ostream& CVC4::operator<<(std::ostream& out, Result r);
+  friend std::ostream& CVC4::operator<<(std::ostream& out, const Result& r);
 
 public:
   Result() :
     d_sat(SAT_UNKNOWN),
     d_validity(VALIDITY_UNKNOWN),
-    d_which(TYPE_NONE) {
+    d_which(TYPE_NONE),
+    d_unknownExplanation(UNKNOWN_REASON) {
   }
-  Result(enum SAT s) :
+  Result(enum Sat s) :
     d_sat(s),
     d_validity(VALIDITY_UNKNOWN),
-    d_which(TYPE_SAT) {
+    d_which(TYPE_SAT),
+    d_unknownExplanation(UNKNOWN_REASON) {
+    CheckArgument(s != SAT_UNKNOWN,
+                  "Must provide a reason for satisfiability being unknown");
   }
   Result(enum Validity v) :
     d_sat(SAT_UNKNOWN),
     d_validity(v),
-    d_which(TYPE_VALIDITY) {
+    d_which(TYPE_VALIDITY),
+    d_unknownExplanation(UNKNOWN_REASON) {
+    CheckArgument(v != VALIDITY_UNKNOWN,
+                  "Must provide a reason for validity being unknown");
+  }
+  Result(enum Sat s, enum UnknownExplanation unknownExplanation) :
+    d_sat(s),
+    d_validity(VALIDITY_UNKNOWN),
+    d_which(TYPE_SAT),
+    d_unknownExplanation(unknownExplanation) {
+    CheckArgument(s == SAT_UNKNOWN,
+                  "improper use of unknown-result constructor");
+  }
+  Result(enum Validity v, enum UnknownExplanation unknownExplanation) :
+    d_sat(SAT_UNKNOWN),
+    d_validity(v),
+    d_which(TYPE_VALIDITY),
+    d_unknownExplanation(unknownExplanation) {
+    CheckArgument(v == VALIDITY_UNKNOWN,
+                  "improper use of unknown-result constructor");
   }
+  Result(const std::string& s);
 
-  enum SAT isSAT() {
+  enum Sat isSat() const {
     return d_which == TYPE_SAT ? d_sat : SAT_UNKNOWN;
   }
-  enum Validity isValid() {
+  enum Validity isValid() const {
     return d_which == TYPE_VALIDITY ? d_validity : VALIDITY_UNKNOWN;
   }
-  enum UnknownExplanation whyUnknown();
-
-  inline bool operator==(Result r) {
-    if(d_which != r.d_which) {
-      return false;
-    }
-    if(d_which == TYPE_SAT) {
-      return d_sat == r.d_sat;
-    }
-    if(d_which == TYPE_VALIDITY) {
-      return d_validity == r.d_validity;
-    }
-    return false;
-  }
-  inline bool operator!=(Result r) {
-    return !(*this == r);
-  }
-  inline Result asSatisfiabilityResult() const;
-  inline Result asValidityResult() const;
-
-};/* class Result */
-
-inline Result Result::asSatisfiabilityResult() const {
-  if(d_which == TYPE_SAT) {
-    return *this;
-  }
-
-  switch(d_validity) {
-
-  case INVALID:
-    return Result(SAT);
-
-  case VALID:
-    return Result(UNSAT);
-
-  case VALIDITY_UNKNOWN:
-    return Result(SAT_UNKNOWN);
-
-  default:
-    Unhandled(d_validity);
+  bool isUnknown() const {
+    return isSat() == SAT_UNKNOWN && isValid() == VALIDITY_UNKNOWN;
   }
-}
-
-inline Result Result::asValidityResult() const {
-  if(d_which == TYPE_VALIDITY) {
-    return *this;
+  enum UnknownExplanation whyUnknown() const {
+    AlwaysAssert( isUnknown(),
+                  "This result is not unknown, so the reason for "
+                  "being unknown cannot be inquired of it" );
+    return d_unknownExplanation;
   }
 
-  switch(d_sat) {
-
-  case SAT:
-    return Result(INVALID);
+  bool operator==(const Result& r) const;
+  inline bool operator!=(const Result& r) const;
+  Result asSatisfiabilityResult() const;
+  Result asValidityResult() const;
 
-  case UNSAT:
-    return Result(VALID);
+  std::string toString() const;
 
-  case SAT_UNKNOWN:
-    return Result(VALIDITY_UNKNOWN);
+};/* class Result */
 
-  default:
-    Unhandled(d_sat);
-  }
+inline bool Result::operator!=(const Result& r) const {
+  return !(*this == r);
 }
 
-inline std::ostream& operator<<(std::ostream& out, Result r) {
-  if(r.d_which == Result::TYPE_SAT) {
-    switch(r.d_sat) {
-    case Result::UNSAT: out << "UNSAT"; break;
-    case Result::SAT: out << "SAT"; break;
-    case Result::SAT_UNKNOWN: out << "SAT_UNKNOWN"; break;
-    }
-  } else {
-    switch(r.d_validity) {
-    case Result::INVALID: out << "INVALID"; break;
-    case Result::VALID: out << "VALID"; break;
-    case Result::VALIDITY_UNKNOWN: out << "VALIDITY_UNKNOWN"; break;
-    }
-  }
-
-  return out;
-}
+std::ostream& operator<<(std::ostream& out,
+                         enum Result::Sat s) CVC4_PUBLIC;
+std::ostream& operator<<(std::ostream& out,
+                         enum Result::Validity v) CVC4_PUBLIC;
+std::ostream& operator<<(std::ostream& out,
+                         enum Result::UnknownExplanation e) CVC4_PUBLIC;
 
 }/* CVC4 namespace */
 
index 9821664bdb51f8ea17528f58ca78cf7cbe16216b..376a8a224f1b2fee517e5b3dfcbf5bf4ede6062f 100644 (file)
@@ -38,7 +38,7 @@ class CVC4_PUBLIC SExpr {
   bool d_isAtom;
 
   /** The value of an atomic S-expression. */
-  std::string d_value;
+  std::string d_stringValue;
 
   /** The children of a list S-expression. */
   std::vector<SExpr> d_children;
@@ -50,7 +50,7 @@ public:
 
   SExpr(const std::string& value) :
     d_isAtom(true),
-    d_value(value) {
+    d_stringValue(value) {
   }
 
   SExpr(const std::vector<SExpr> children) :
@@ -80,7 +80,7 @@ inline bool SExpr::isAtom() const {
 
 inline const std::string SExpr::getValue() const {
   AlwaysAssert( d_isAtom );
-  return d_value;
+  return d_stringValue;
 }
 
 inline const std::vector<SExpr> SExpr::getChildren() const {
index 5b4a33bed9b56910f9ce6a7afeeb6bfa1dc3490a..d153464e15e1e67fcca75ba50bba7ce13505e194 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x : REAL;
 y : REAL;
 
index a2c93da463ff3b3e666962a32c52c3485dead15a..76a7a433872087660a7b20c5abf13b5c5295d306 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x : REAL;
 y : REAL;
 z : REAL;
index 96af458f04246624968ecff3128f4ecdcab76165..007adf1d6c085eb312ba4b8362363c61d37fd639 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x : REAL;
 y : REAL;
 
index d0205116cca3912827058239a61675b44d2fa725..cdfb3a09fbc9e2c3e75325a7334dbd6641188195 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of AND, <=>, NOT.
 
 A, B, C: BOOLEAN;
index eeac40c9f99dabba0a81dfcd83f20cee8f8a0717..fe3450c27dd60f91330aef8fb0da8d7eb498b922 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 p : BOOLEAN;
 q : BOOLEAN;
 r : BOOLEAN;
index c6d79a4ab02e946ba52a510ace1ec70a2e9d3095..394f89e5130c83b56da45d7f0db1cf0dc93ded62 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 a:BOOLEAN;
 b:BOOLEAN;
 ASSERT(a);
index aaebeebd681a801fb6a7201a972417049720f27d..371374078bdb3bd19b947dd9c480b447dcb8a9af 100644 (file)
@@ -1,5 +1,5 @@
 %% This test borrowed from CVC3 regressions, bug15.cvc
-% EXPECT: VALID
+% EXPECT: valid
 x : REAL;
 y : REAL;
 f : REAL -> REAL;
index 07bfa392cc0f82e28eb0fe0c3ae8e052f63283f1..64231aaf5862946fac0549a07e041ad087d5716f 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x_1 : BOOLEAN;
 x_2 : BOOLEAN;
 x_3 : BOOLEAN;
index 0a3e7535aa2f436b72afc19adbdfc307a40e626b..5094c997d1f6e9dc33ef9b9fc2e8ed4a06855c9d 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: UNSAT
+% EXPECT: unsat
 % EXIT: 20
 x, y : REAL;
 CHECKSAT (NOT (x = IF TRUE THEN x ELSE y ENDIF));
index 5348cf7e4760a6bed69f29c2b79a69d71e27f088..9a247d2c635ba06782c69121456a62d6e2da1acc 100644 (file)
@@ -1,4 +1,4 @@
 a, b, c: BOOLEAN;
-% EXPECT: VALID
+% EXPECT: valid
 QUERY (a XOR b) <=> (NOT a AND b) OR (NOT b AND a);
 % EXIT: 20
index 4a8539faeca06fde24548600083c6603a7e0a4a3..105cc76857cbfb5eaa4efc91540e553923a27db1 100644 (file)
@@ -1,4 +1,4 @@
 a, b, c: BOOLEAN;
-% EXPECT: INVALID
+% EXPECT: invalid
 QUERY NOT c AND b;
 % EXIT: 10
index 6b5f34613e672b1aec7a20e979f12d9314addc9a..65126699caf72999a4e173976fea82aa9d0e8499 100644 (file)
@@ -1,4 +1,4 @@
 a, b, c: BOOLEAN;
-% EXPECT: VALID
+% EXPECT: valid
 QUERY (IF c THEN a ELSE b ENDIF) <=> ((c AND a) OR (NOT c AND b));
 % EXIT: 20
index 6e7aa1f5eca43485ad8dcd0a62da7073a7e35577..258307e8c3645890a665a4a90076c07bffcfb9e6 100644 (file)
@@ -1,4 +1,4 @@
 a, b, c: BOOLEAN;
-% EXPECT: VALID
+% EXPECT: valid
 QUERY (a => b) <=> (NOT a OR b);
 % EXIT: 20
index 14e2c887ab59e219c7b25019f8c3107289ee4f10..b7308870eb742687c84f6a4500679c7b3d8104f8 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c: BOOLEAN;
-% EXPECT: VALID
+% EXPECT: valid
 QUERY TRUE XOR FALSE;
  
 % EXIT: 20
index 0de37db83c6bb5bbc7d65059087fac5457f4574f..547633bf17dd10a2a88fd11b6373eed91ebd17f5 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of AND and NOT.
 
 A, B: BOOLEAN;
index 7b29bb95e9a5d5c9a7157c7c62f74fce5edd2bba..dfc03bf22811b4eb3c27f3715e8838e0cc547ba3 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of XOR and AND.
 
 A, B, C: BOOLEAN;
index ef1345cc12a015188001a1103b8d35851b2575d2..d19ab9aae0d94af7a3f09cbeee486896dfe1a6dd 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of comparisons and booleans
 
 x , y, z: INT;
index af2823fcf9702a32829dcaf31335644f1b70cc4d..aff12548feb13d2049282ce345132178583cc90f 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of comparisons and plus/minus
 
 x, y, z: INT;
index e85b4a3e696c25861b1f719b12ce5f58f81b7348..f207071b34e0a7702a41debc04df7e4c11f87865 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of function application and =
 
 T : TYPE;
index b92354753034eeeb2799cf6f032b318e4beb828f..a496ccf16b74f39245552fa1c7d1a0cc2f795361 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right associativity of <=>
 
 A, B, C: BOOLEAN;
index 0115fc3195ec30f181917280075e6989216336be..ee2e2479f500b63b1a4ecad35d39119fdd29a280 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of <=> and =>.
 
 A, B, C: BOOLEAN;
index d465df3131378d240285076411d2e81d33397c54..b87038a9924e87cb55185a9109f196400c163ecf 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right associativity of =>
 
 A, B, C: BOOLEAN;
index f8c813ceb7dc82fa66fe0db8476a83a3608dcaf5..4a2aa18a81524cc6ee07e0abbfc79cac8e0aeac8 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of <=> and =>.
 
 A, B, C: BOOLEAN;
index 24edb4ecd1a06811d60a3e2b0d8d9b03846f26af..266daae404348a3fd4b166e08dd3b3f4e7d1e39e 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of => and OR.
 
 A, B, C: BOOLEAN;
index 8c849a0d91406d82fab2a6d7481d4db379abc3ac..048d971b41da529e0538606f5e1a6b405fa7e635 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of AND and NOT.
 
 A, B, C: BOOLEAN;
index 6d712d43d5d3502493579091d1232554b49c070f..cf4a0e4a53ba6559d8bbd4164686ebba6516ba66 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of = and NOT.
 
 A, B: INT;
index d91f79dc84aa1f3d542d8be6f61ad5e08acf2c3f..13f3a316e01f8f68791eb479a12c631099f026a7 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of => and OR.
 
 A, B, C: BOOLEAN;
index 47cc87c7648eb55054cb35b33c1e5f53c8a9f249..4e19be584213ec750d6f68568060504a7d29a487 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of OR and XOR.
 
 A, B, C: BOOLEAN;
index ecd34f58364fb894b6f0780d94ce4051e52e56cf..9300ae6c421422c6bcf6f41d69c6c9137cb5aa54 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of plus/minus and mult/divide
 
 a, b, c, d, e: INT;
index ba3f48a7f48afb81458ae8061e748cd82aa476e9..950c8ee94c67bc6dbf79904e976b99db7a8a1ff2 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of XOR and AND.
 
 A, B, C: BOOLEAN;
index 27911332c3361dc5e4f9ab76fd15469b93e9d6d5..a356f9b3a2683205e8925f5bced14bbaad9e2fb2 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for left associativity of XOR
 
 A, B, C: BOOLEAN;
index 2b4436937c4441cb411eb168d86c67af4ddee086..837e4c5753e95d2f3b83365f31f676afb9bd280b 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 % Simple test for right precedence of OR and XOR.
 
 A, B, C: BOOLEAN;
index fe6235981d6281ded08caae3dad5350bfa828fc5..1109840834809d62a6a49a08251ee9e8614b0922 100644 (file)
@@ -2,10 +2,10 @@
 
 a, b: BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY (a AND b) OR NOT (a AND b);
 
-% EXPECT: INVALID
+% EXPECT: invalid
 QUERY (a OR b);
 
 % EXIT: 10
index a0bff6c5af510e3541cb05600c30926803562c45..4a16dcbe37503953d5e1eb58c89ac5ade52e35d7 100644 (file)
@@ -3,6 +3,6 @@ ASSERT x1 OR NOT x0;
 ASSERT x0 OR NOT x3;
 ASSERT x3 OR x2;
 ASSERT x1 AND NOT x1;
-% EXPECT: VALID
+% EXPECT: valid
 QUERY x2;
 % EXIT: 20
index fe17e0b53a647a184ae8782ccb06489e6816215f..dc316a9fb0ef8184437aa6d37f789d3c6f19a1b7 100644 (file)
@@ -4,7 +4,7 @@ ASSERT NOT a OR NOT b;
 ASSERT c OR b OR a;
 ASSERT b OR NOT a;
 ASSERT a OR NOT b OR c;
-% EXPECT: INVALID
+% EXPECT: invalid
 QUERY FALSE;
 
 % EXIT: 10
index 2fa1e23ba4ee0518b1a87fc07e3fa9156ae458c2..f777e517ec064eb5041c6aad766e6963dace109b 100644 (file)
@@ -3,6 +3,6 @@ x, y : BOOLEAN;
 ASSERT (x OR y);
 ASSERT NOT (x OR y);
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY FALSE;
 % EXIT: 20
index a3d63b49760c84a3e2697dd7168d8b4238f56aa9..25245f36a2e8c530e484a748c3ecf9b2b704a1a2 100644 (file)
@@ -1,33 +1,33 @@
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: VALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: VALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: INVALID
-% EXPECT: VALID
-% EXPECT: VALID
-% EXPECT: VALID
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: valid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: valid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: invalid
+% EXPECT: valid
+% EXPECT: valid
+% EXPECT: valid
 A: TYPE;
 P_1: BOOLEAN;
 P_2: BOOLEAN;
index 64c2011a4c973b8ae2c0ec0afa01fb0b4a1bc056..0cf587bca84c74dbd16aca960ebcd982fa9e04f7 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 P,Q:BOOLEAN;
 ASSERT (P OR Q);
 QUERY (P OR Q);
index 84b8b8a8d2a0570287b77a4924f181e2c9824c0b..141cc11fbfb68eb612fba7ff82219ab50ef2fb69 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 A: TYPE;
 B: TYPE;
 x, y: A;
index 21d3e3cee1add89cba730ac5574875833e8d757a..3a72ce71ac896478dcea5f7464b7544b4f8cd0a4 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: INVALID
+% EXPECT: invalid
 A: TYPE;
 B: TYPE;
 x, y: A;
index 476c6cd4a3743245aa2db72b8b5dfa3e27aab35b..e0079c826d5761b0b58f8d09ba8d4bb3384137d1 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 A: TYPE;
 B: TYPE;
 x, y: A;
index c9675588d1beb51463aa7269d3d4a31a62b07488..649accd21357dc98b1ef3c9e4f89e41e31553777 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: INVALID
+% EXPECT: invalid
 A: TYPE;
 B: TYPE;
 x, y: A;
index a44b028a234406c8761ecf36bd28aa972b9d3ee4..1b35efd7dfc12e7737bf6d4f0c1a08a8a4b5db74 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: INVALID
+% EXPECT: invalid
 x_1 : BOOLEAN;
 x_2 : BOOLEAN;
 x_3 : BOOLEAN;
index 7b6835469722d5736d775ceb0b5155dfa6a45ca9..3833bb85fdc4b50a22b333953292cd7c45ccaa3c 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR (b OR c) <=> (a OR b) OR c;
 % EXIT: 20
index 9fd4f8fb71f29dd2d67bb47ae3590cf78c831e9f..a431f9b2298387468cafa9efe3d95c3bbda582cd 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND (b AND c) <=> (a AND b) AND c;
 % EXIT: 20
index 63c1029b431e2d3c15ea31a320fbcb371fa6e72e..65acbb438ba452b2d9fe08df984d695fca663ce8 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR b <=> b OR a;
 % EXIT: 20
index 77fa0059b5cc7a14834686fd8bbc821b75a1229a..bcd724c8db1e3efb0f15b97059bb0f86670ceec5 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND b <=> b AND a;
 % EXIT: 20
index cb7140bccf4abf26479837797c04c15acdce8d22..9469a990214d823176af6d708415870545072d82 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR (a AND b) <=> a;
 % EXIT: 20
index 6c69ca4bc7176fc6576fd94ca49751758e686b99..64663e459f58729213be896c1724a4d9bd04b159 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND (a OR b) <=> a;
 % EXIT: 20
index a0281d04b282d32f96dec5b5b595387de3bd6303..85de76be7304ba02b511c7333cf644f49d9ee451 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR (b AND c) <=> (a OR b) AND (a OR c);
 % EXIT: 20
index ddf0f328cc5ad2493f0f58990346d45447fe11ca..cedf3dba0ae9bf3f4ea927cb65a89491f09c8865 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND (b OR c) <=> (a AND b) OR (a AND c);
 % EXIT: 20
index f97021910054314fef092902d03c2b70d64cdd2f..ded0edd5aeda55f77b92724e45c5f02a64a13080 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR NOT a;
 % EXIT: 20
index da8a1a9c358cbfd76c71890e87a19fc728c69920..dd1e7031af902dc672a1ebb994e0f4d2d66faf32 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND NOT a <=> FALSE;
 % EXIT: 20
index 4d7c3c13059a15c8ddc048db72513ed6a280615a..61e4043382a28681682115c143bf49e26ce93858 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR a <=> a;
 % EXIT: 20
index c932892c802e3a139f79c497d39b897f39eb9e07..b73b0357b369aa6a9c4e217c82cdfd4edcff3142 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND a <=> a;
 % EXIT: 20
index 3ad4fd4abf410b46961f68e5c3b352647a493d0b..6ae84461604702995076d2af8c32190d255b3de2 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR FALSE <=> a;
 % EXIT: 20
index 454cf442c70992b861451908c0b092afb04bd4bb..228a5af4f9b4e6b42ab37771285478cf2be8098e 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND TRUE <=> a;
 % EXIT: 20
index 81a13f7986b890399a98eebf583a06404ef59d8f..b78e2cb8036e9fa453bc07670119ec3df1a5dd3a 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a OR TRUE <=> TRUE;
 % EXIT: 20
index bd13faf11ae160126ff02c38719a4b01ffbf071d..0282c59af4ecc1a7611a5b10252ccfe7d73c3b62 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY a AND FALSE <=> FALSE;
 % EXIT: 20
index 48949f89fb0aaca4c1a9208afb838d3d268d1d86..5d3b7629bfd4fb4c7c53bbf016b08871e58d5c8f 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY NOT FALSE <=> TRUE;
 % EXIT: 20
index 8959d34a65a4b8d42380b978232aad1194bfb7ab..a34ceeef8530575898bdb00c99e08fbcdb6036aa 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY NOT TRUE <=> FALSE;
 % EXIT: 20
index 11366526b9db5ce479020de19fbe031b6bd9408f..38c557514fced1ec6d60a51f1f8f037c3e7522f4 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY NOT (a OR b) <=> NOT a AND NOT b;
 % EXIT: 20
index 5ef534bb0b3aa7209d3629b795fef55361cc8cc7..cd166f95607ba2cc0369788cbb8abb8d389200ba 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY NOT (a AND b) <=> NOT a OR NOT b;
 % EXIT: 20
index bcd7146fb9a8b4d4a69cbaa4c9c054e7280fa310..a8fbafbc1f17eaf727ff2b6c0b1f38017b44be4b 100644 (file)
@@ -1,5 +1,5 @@
 a, b, c : BOOLEAN;
 
-% EXPECT: VALID
+% EXPECT: valid
 QUERY NOT NOT a <=> a;
 % EXIT: 20
index 5ff290f6236f6c4eb1888d2b3e715ee4493f3d06..150c39e38df74e74b1807dcbf47b48ba0720b9e9 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x_1 : BOOLEAN;
 x_2 : BOOLEAN;
 x_3 : BOOLEAN;
index d0f974619c3618c80e91ca10f77e502eb6d74976..fb9206aa0ebc60a92e7b10f73307a160dd07ebeb 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x_1 : BOOLEAN;
 x_2 : BOOLEAN;
 x_3 : BOOLEAN;
index e631444d34cc4f3493c223f576293a46e656b087..e9bd543eff412d3041dfc55ea3c1279eb6782078 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x_1 : BOOLEAN;
 x_2 : BOOLEAN;
 x_3 : BOOLEAN;
index 661e3ef4b217d9708dbdc86597c3a72fceacec81..ba29355db8f4825e3c4582c3f2b6a23fcb103ecc 100644 (file)
@@ -1,4 +1,4 @@
-% EXPECT: VALID
+% EXPECT: valid
 x_1 : BOOLEAN;
 x_2 : BOOLEAN;
 x_3 : BOOLEAN;
index ebef82cf1ba3b5433d4df08556b311e491a5c073..614f02f0f310b54666e0dd39cdd0e6dc9161814b 100755 (executable)
@@ -52,10 +52,10 @@ if expr "$benchmark" : '.*\.smt$' &>/dev/null; then
     fi
     benchmark=$tmpbenchmark
   elif grep '^ *:status  *sat' "$benchmark" &>/dev/null; then
-    expected_output=SAT
+    expected_output=sat
     expected_exit_status=10
   elif grep '^ *:status  *unsat' "$benchmark" &>/dev/null; then
-    expected_output=UNSAT
+    expected_output=unsat
     expected_exit_status=20
   else
     error "cannot determine status of \`$benchmark'"
@@ -80,10 +80,10 @@ elif expr "$benchmark" : '.*\.smt2$' &>/dev/null; then
     fi
     benchmark=$tmpbenchmark
   elif grep '^ *(set-info  *:status  *sat' "$benchmark" &>/dev/null; then
-    expected_output=SAT
+    expected_output=sat
     expected_exit_status=10
   elif grep '^ *(set-info  *:status  *unsat' "$benchmark" &>/dev/null; then
-    expected_output=UNSAT
+    expected_output=unsat
     expected_exit_status=20
   else
     error "cannot determine status of \`$benchmark'"
index ee3d9c2002cbf9f825bc9b4f5574ab4f1126b3e4..b340beb50e696b78bd2657d270441ce02643a952 100644 (file)
@@ -30,7 +30,7 @@
 #include "prop/prop_engine.h"
 #include "prop/sat.h"
 #include "smt/smt_engine.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/decision_engine.h"
 
 using namespace CVC4;
index a9b902deafeb27fbe79ec4c6a0356ba85188e1ab..3e7a9f523ce459e0974c5289e5c60046867e5da6 100644 (file)
@@ -31,7 +31,7 @@
 #include "context/context.h"
 #include "util/rational.h"
 #include "util/integer.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/Assert.h"
 
 using namespace CVC4;
index 0920fbd56f3a5fa0af9b3959dc67fb06c6cb41dc..96585768429b0ffe058b4a94fc10af59d3f3e187 100644 (file)
@@ -35,7 +35,7 @@
 #include "context/context.h"
 #include "util/rational.h"
 #include "util/integer.h"
-#include "util/options.h"
+#include "smt/options.h"
 #include "util/Assert.h"
 
 using namespace CVC4;