various fixes and updates to use and support parser
authorMorgan Deters <mdeters@gmail.com>
Tue, 24 Nov 2009 22:51:35 +0000 (22:51 +0000)
committerMorgan Deters <mdeters@gmail.com>
Tue, 24 Nov 2009 22:51:35 +0000 (22:51 +0000)
19 files changed:
contrib/update-copyright.pl
src/expr/expr.cpp
src/expr/expr.h
src/expr/expr_builder.cpp
src/expr/expr_builder.h
src/expr/expr_manager.cpp
src/include/cvc4.h
src/include/cvc4_expr.h
src/main/getopt.cpp
src/main/main.cpp
src/parser/language.h [new file with mode: 0644]
src/parser/parser.h
src/parser/parser_state.h
src/parser/pl.ypp
src/parser/smtlib.ypp
src/prop/prop_engine.h
src/smt/Makefile.am
src/smt/smt_engine.h
src/util/command.h

index a270e736252316d663379e1ff9226b67d420d641..5c1f605c9719188007b3d29085162784f202323b 100755 (executable)
@@ -27,6 +27,24 @@ my $excluded_directories = '^(minisat|CVS)$';
 # "1985, 1987, 1992, 1997, 2008" or "2006-2009" or whatever.
 my $years = '2009';
 
+my $standard_template = <<EOF;
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) $years 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.
+EOF
+
+my $public_template = <<EOF;
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) $years 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.
+EOF
+
 ## end config ##
 
 use strict;
@@ -92,12 +110,7 @@ sub recurse {
           print $OUT "/*********************                                           -*- C++ -*-  */\n";
         }
         print $OUT "/** $file\n";
-        print $OUT " ** This file is part of the CVC4 prototype.\n";
-        print $OUT " ** Copyright (c) $years The Analysis of Computer Systems Group (ACSys)\n";
-        print $OUT " ** Courant Institute of Mathematical Sciences\n";
-        print $OUT " ** New York University\n";
-        print $OUT " ** See the file COPYING in the top-level source directory for licensing\n";
-        print $OUT " ** information.\n";
+        print $OUT $standard_template;
         print $OUT " **\n";
         while(my $line = <$IN>) {
           last if $line =~ /^ \*\*\s*$/;
@@ -111,12 +124,7 @@ sub recurse {
           print $OUT "/*********************                                           -*- C++ -*-  */\n";
         }
         print $OUT "/** $file\n";
-        print $OUT " ** This file is part of the CVC4 prototype.\n";
-        print $OUT " ** Copyright (c) $years The Analysis of Computer Systems Group (ACSys)\n";
-        print $OUT " ** Courant Institute of Mathematical Sciences\n";
-        print $OUT " ** New York University\n";
-        print $OUT " ** See the file COPYING in the top-level source directory for licensing\n";
-        print $OUT " ** information.\n";
+        print $OUT $standard_template;
         print $OUT " **\n";
         print $OUT " ** [[ Add file-specific comments here ]]\n";
         print $OUT " **/\n\n";
index e25cf8595b408c22b42cdd266e4eb3c9de409613..f94a3c438b6247d6b1ab4d7f3637f1b83dac84b2 100644 (file)
@@ -86,13 +86,4 @@ Expr Expr::xorExpr(const Expr& right) const {
   return ExprBuilder(*this).xorExpr(right);
 }
 
-Expr Expr::skolemExpr(int i) const {
-  return ExprBuilder(*this).skolemExpr(i);
-}
-
-Expr Expr::substExpr(const std::vector<Expr>& oldTerms,
-                     const std::vector<Expr>& newTerms) const {
-  return ExprBuilder(*this).substExpr(oldTerms, newTerms);
-}
-
 }/* CVC4 namespace */
index d997089915af3feb90b74585d9b6ffc993a09a60..19f02650e2e4bdf42be03c8d06ccb34f4df826de 100644 (file)
@@ -10,8 +10,8 @@
  ** Reference-counted encapsulation of a pointer to an expression.
  **/
 
-#ifndef __CVC4_EXPR_H
-#define __CVC4_EXPR_H
+#ifndef __CVC4__EXPR_H
+#define __CVC4__EXPR_H
 
 #include <vector>
 #include <stdint.h>
@@ -74,9 +74,6 @@ public:
   Expr iffExpr(const Expr& right) const;
   Expr impExpr(const Expr& right) const;
   Expr xorExpr(const Expr& right) const;
-  Expr skolemExpr(int i) const;
-  Expr substExpr(const std::vector<Expr>& oldTerms,
-                 const std::vector<Expr>& newTerms) const;
 
   Expr plusExpr(const Expr& right) const;
   Expr uMinusExpr() const;
@@ -100,4 +97,4 @@ inline Kind Expr::getKind() const {
 
 }/* CVC4 namespace */
 
-#endif /* __CVC4_EXPR_H */
+#endif /* __CVC4__EXPR_H */
index bf572cfbc67ded677816e0906658635a9bb306e6..be9c60199e8145dba28026aeaf5d7f2979dcbc7f 100644 (file)
@@ -157,14 +157,6 @@ ExprBuilder& ExprBuilder::xorExpr(const Expr& right) {
   return *this;
 }
 
-ExprBuilder& ExprBuilder::skolemExpr(int i) {
-  Assert( d_kind != UNDEFINED_KIND );
-  collapse();
-  d_kind = SKOLEM;
-  //addChild(i);//FIXME: int constant
-  return *this;
-}
-
 // "Stream" expression constructor syntax
 ExprBuilder& ExprBuilder::operator<<(const Kind& op) {
   return *this;
@@ -217,37 +209,13 @@ void ExprBuilder::addChild(ExprValue* ev) {
   }
 }
 
-void ExprBuilder::collapse() {
+ExprBuilder& ExprBuilder::collapse() {
   if(d_nchildren == nchild_thresh) {
     vector<Expr>* v = new vector<Expr>();
     v->reserve(nchild_thresh + 5);
-    
+    //
   }
-}
-
-// not const
-ExprBuilder::operator Expr() {
-  // FIXME
-}
-
-AndExprBuilder   ExprBuilder::operator&&(Expr e) {
-  return AndExprBuilder(*this) && e;
-}
-
-OrExprBuilder    ExprBuilder::operator||(Expr e) {
-  return OrExprBuilder(*this) || e;
-}
-
-PlusExprBuilder  ExprBuilder::operator+ (Expr e) {
-  return PlusExprBuilder(*this) + e;
-}
-
-PlusExprBuilder  ExprBuilder::operator- (Expr e) {
-  return PlusExprBuilder(*this) - e;
-}
-
-MultExprBuilder  ExprBuilder::operator* (Expr e) {
-  return MultExprBuilder(*this) * e;
+  return *this;
 }
 
 }/* CVC4 namespace */
index 97f18ca6d14377a5e1bf8f72994590ba0593adb9..13f196dd09046d2757a7c6fbcb03767cf4c70c45 100644 (file)
@@ -43,7 +43,7 @@ class ExprBuilder {
 
   void addChild(const Expr&);
   void addChild(ExprValue*);
-  void collapse();
+  ExprBuilder& collapse();
 
   typedef ExprValue** ev_iterator;
   typedef ExprValue const** const_ev_iterator;
@@ -74,12 +74,6 @@ public:
   ExprBuilder& iffExpr(const Expr& right);
   ExprBuilder& impExpr(const Expr& right);
   ExprBuilder& xorExpr(const Expr& right);
-  ExprBuilder& skolemExpr(int i);
-  ExprBuilder& substExpr(const std::vector<Expr>& oldTerms,
-                         const std::vector<Expr>& newTerms);
-  /*
-  ExprBuilder& substExpr(const ExprHashMap<Expr>& oldToNew);
-  */
 
   /* TODO design: these modify ExprBuilder */
   ExprBuilder& operator!() { return notExpr(); }
@@ -92,6 +86,7 @@ public:
 
   // For pushing sequences of children
   ExprBuilder& append(const std::vector<Expr>& children) { return append(children.begin(), children.end()); }
+  ExprBuilder& append(Expr child) { return append(&child, &(child)+1); }
   template <class Iterator> ExprBuilder& append(const Iterator& begin, const Iterator& end);
 
   operator Expr();// not const
@@ -102,71 +97,167 @@ public:
   PlusExprBuilder  operator- (Expr);
   MultExprBuilder  operator* (Expr);
 
+  friend class AndExprBuilder;
+  friend class OrExprBuilder;
+  friend class PlusExprBuilder;
+  friend class MultExprBuilder;
 };/* class ExprBuilder */
 
 class AndExprBuilder {
-  ExprManager* d_em;
+  ExprBuilder d_eb;
 
 public:
 
-  AndExprBuilder(const ExprBuilder&);
+  AndExprBuilder(const ExprBuilder& eb) : d_eb(eb) {
+    if(d_eb.d_kind != AND) {
+      d_eb.collapse();
+      d_eb.d_kind = AND;
+    }
+  }
 
   AndExprBuilder&   operator&&(Expr);
   OrExprBuilder     operator||(Expr);
 
-  operator ExprBuilder();
+  operator ExprBuilder() { return d_eb; }
 
 };/* class AndExprBuilder */
 
 class OrExprBuilder {
-  ExprManager* d_em;
+  ExprBuilder d_eb;
 
 public:
 
-  OrExprBuilder(const ExprBuilder&);
+  OrExprBuilder(const ExprBuilder& eb) : d_eb(eb) {
+    if(d_eb.d_kind != OR) {
+      d_eb.collapse();
+      d_eb.d_kind = OR;
+    }
+  }
 
   AndExprBuilder    operator&&(Expr);
   OrExprBuilder&    operator||(Expr);
 
-  operator ExprBuilder();
+  operator ExprBuilder() { return d_eb; }
 
 };/* class OrExprBuilder */
 
 class PlusExprBuilder {
-  ExprManager* d_em;
+  ExprBuilder d_eb;
 
 public:
 
-  PlusExprBuilder(const ExprBuilder&);
+  PlusExprBuilder(const ExprBuilder& eb) : d_eb(eb) {
+    if(d_eb.d_kind != PLUS) {
+      d_eb.collapse();
+      d_eb.d_kind = PLUS;
+    }
+  }
 
   PlusExprBuilder&  operator+(Expr);
   PlusExprBuilder&  operator-(Expr);
   MultExprBuilder   operator*(Expr);
 
-  operator ExprBuilder();
+  operator ExprBuilder() { return d_eb; }
 
 };/* class PlusExprBuilder */
 
 class MultExprBuilder {
-  ExprManager* d_em;
+  ExprBuilder d_eb;
 
 public:
 
-  MultExprBuilder(const ExprBuilder&);
+  MultExprBuilder(const ExprBuilder& eb) : d_eb(eb) {
+    if(d_eb.d_kind != MULT) {
+      d_eb.collapse();
+      d_eb.d_kind = MULT;
+    }
+  }
 
   PlusExprBuilder   operator+(Expr);
   PlusExprBuilder   operator-(Expr);
   MultExprBuilder&  operator*(Expr);
 
-  operator ExprBuilder();
+  operator ExprBuilder() { return d_eb; }
 
 };/* class MultExprBuilder */
 
 template <class Iterator>
-ExprBuilder& ExprBuilder::append(const Iterator& begin, const Iterator& end) {
+inline ExprBuilder& ExprBuilder::append(const Iterator& begin, const Iterator& end) {
+  return *this;
+}
+
+// not const
+inline ExprBuilder::operator Expr() {
+  // FIXME
+  return Expr::s_null;
+}
+
+inline AndExprBuilder   ExprBuilder::operator&&(Expr e) {
+  return AndExprBuilder(*this) && e;
+}
+
+inline OrExprBuilder    ExprBuilder::operator||(Expr e) {
+  return OrExprBuilder(*this) || e;
+}
+
+inline PlusExprBuilder  ExprBuilder::operator+ (Expr e) {
+  return PlusExprBuilder(*this) + e;
+}
+
+inline PlusExprBuilder  ExprBuilder::operator- (Expr e) {
+  return PlusExprBuilder(*this) - e;
+}
+
+inline MultExprBuilder  ExprBuilder::operator* (Expr e) {
+  return MultExprBuilder(*this) * e;
+}
+
+inline AndExprBuilder&  AndExprBuilder::operator&&(Expr e) {
+  d_eb.append(e);
+  return *this;
+}
+
+inline OrExprBuilder    AndExprBuilder::operator||(Expr e) {
+  return OrExprBuilder(d_eb.collapse()) || e;
+}
+
+inline AndExprBuilder   OrExprBuilder::operator&&(Expr e) {
+  return AndExprBuilder(d_eb.collapse()) && e;
+}
+
+inline OrExprBuilder&   OrExprBuilder::operator||(Expr e) {
+  d_eb.append(e);
+  return *this;
+}
+
+inline PlusExprBuilder& PlusExprBuilder::operator+(Expr e) {
+  d_eb.append(e);
+  return *this;
+}
+
+inline PlusExprBuilder& PlusExprBuilder::operator-(Expr e) {
+  d_eb.append(e.negate());
   return *this;
 }
 
+inline MultExprBuilder  PlusExprBuilder::operator*(Expr e) {
+  return MultExprBuilder(d_eb.collapse()) * e;
+}
+
+inline PlusExprBuilder  MultExprBuilder::operator+(Expr e) {
+  return MultExprBuilder(d_eb.collapse()) + e;
+}
+
+inline PlusExprBuilder  MultExprBuilder::operator-(Expr e) {
+  return MultExprBuilder(d_eb.collapse()) - e;
+}
+
+inline MultExprBuilder& MultExprBuilder::operator*(Expr e) {
+  d_eb.append(e);
+  return *this;
+}
+
+
 }/* CVC4 namespace */
 
 #endif /* __CVC4__EXPR_BUILDER_H */
index a65a2f3cd28ebad26fc8fe9ec8d67f2169b78e7b..3aeab80491504dc85eafc8fe8767f5f2fcc07089 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "expr_builder.h"
 #include "expr_manager.h"
-#include "cvc4_expr.h"
+#include "expr/expr.h"
 
 namespace CVC4 {
 
index 7b068228fbe05c6a9eae24e9cac90bbaf7225ef7..5d33fa838978e8a16c4c672b1c89b73a9b19c4b0 100644 (file)
 #include "util/result.h"
 #include "util/model.h"
 
-// In terms of abstraction, this is below (and provides services to)
-// ValidityChecker and above (and requires the services of)
-// PropEngine.
-
 namespace CVC4 {
 
-// TODO: SAT layer (esp. CNF- versus non-clausal solvers under the
-// hood): use a type parameter and have check() delegate, or subclass
-// SmtEngine and override check()?
-//
-// Probably better than that is to have a configuration object that
-// indicates which passes are desired.  The configuration occurs
-// elsewhere (and can even occur at runtime).  A simple "pass manager"
-// of sorts determines check()'s behavior.
-//
-// The CNF conversion can go on in PropEngine.
-
 class SmtEngine {
   /** Current set of assertions. */
   // TODO: make context-aware to handle user-level push/pop.
   std::vector<Expr> d_assertList;
 
-private:
+  /** Our expression manager */
+  ExprManager *d_em;
+
+  /** User-level options */
+  Options *opts;
+
   /**
    * Pre-process an Expr.  This is expected to be highly-variable,
    * with a lot of "source-level configurability" to add multiple
@@ -74,10 +64,15 @@ private:
   void processAssertionList();
 
 public:
+  /*
+   * Construct an SmtEngine with the given expression manager and user options.
+   */
+  SmtEngine(ExprManager*, Options*);
+
   /**
-   * Execute a command
+   * Execute a command.
    */
-  void doCommand(Command c);
+  void doCommand(Command*);
 
   /**
    * Add a formula to the current context: preprocess, do per-theory
index d997089915af3feb90b74585d9b6ffc993a09a60..863097123f2ea030b8a1abf01a5c652f28dc87c9 100644 (file)
@@ -74,9 +74,6 @@ public:
   Expr iffExpr(const Expr& right) const;
   Expr impExpr(const Expr& right) const;
   Expr xorExpr(const Expr& right) const;
-  Expr skolemExpr(int i) const;
-  Expr substExpr(const std::vector<Expr>& oldTerms,
-                 const std::vector<Expr>& newTerms) const;
 
   Expr plusExpr(const Expr& right) const;
   Expr uMinusExpr() const;
index dcb23c303b0ef15a9df3f5564bd16ecd603183d7..5af3b5d214467a113370111b8c39d8bd903a8075 100644 (file)
 #include "util/exception.h"
 #include "usage.h"
 #include "about.h"
+#include "parser/language.h"
 
 using namespace std;
 using namespace CVC4;
+using namespace CVC4::parser;
 
 namespace CVC4 {
 namespace main {
@@ -39,12 +41,6 @@ Languages currently supported to the -L / --lang option:\n\
   smt | smtlib  SMT-LIB format\n\
 ";
 
-enum Language {
-  AUTO = 0,
-  PL,
-  SMTLIB,
-};/* enum Language */
-
 enum OptionValue {
   SMTCOMP = 256, /* no clash with char options */
   STATS
index 8529f2ca2579256f6b793bea98049349e77fca58..1fc616fe6a6b9a21403d2393435f83f0408f0472 100644 (file)
@@ -10,6 +10,8 @@
  ** [[ Add file-specific comments here ]]
  **/
 
+#include <iostream>
+#include <fstream>
 #include <cstdio>
 #include <cstdlib>
 #include <cerrno>
 #include "config.h"
 #include "main.h"
 #include "usage.h"
+#include "parser/parser.h"
+#include "expr/expr_manager.h"
+#include "smt/smt_engine.h"
+#include "parser/language.h"
 
 using namespace std;
 using namespace CVC4;
+using namespace CVC4::parser;
 using namespace CVC4::main;
 
 int main(int argc, char *argv[]) {
@@ -36,28 +43,37 @@ int main(int argc, char *argv[]) {
 
     int firstArgIndex = parseOptions(argc, argv, &opts);
 
-    FILE *infile;
+    istream *in;
+    ifstream infile;
+    Language lang = PL;
 
     if(firstArgIndex >= argc) {
-      infile = stdin;
+      in = &cin;
     } else if(argc > firstArgIndex + 1) {
       throw new Exception("Too many input files specified.");
     } else {
-      infile = fopen(argv[firstArgIndex], "r");
+      in = &infile;
+      if(strlen(argv[firstArgIndex]) >= 4 && !strcmp(argv[firstArgIndex] + strlen(argv[firstArgIndex]) - 4, ".smt"))
+        lang = SMTLIB;
+      infile.open(argv[firstArgIndex], ifstream::in);
+
       if(!infile) {
         throw new Exception(string("Could not open input file `") + argv[firstArgIndex] + "' for reading: " + strerror(errno));
         exit(1);
       }
+    }
 
-      // ExprManager *exprMgr = ...;
-      // SmtEngine smt(exprMgr, &opts);
-      // Parser parser(infile, exprMgr, &opts);
-      // while(!parser.done) {
-      //   Command *cmd = parser.get();
-      //   cmd->invoke(smt);
-      //   delete cmd;
-      // }
+    ExprManager *exprMgr = new ExprManager();
+    SmtEngine smt(exprMgr, &opts);
+    Parser parser(&smt, lang, *in, &opts);
+    while(!parser.done()) {
+      Command *cmd = parser.next();
+      cmd->invoke();
+      delete cmd;
     }
+
+    if(infile)
+      infile.close();
   } catch(CVC4::main::OptionException* e) {
     if(opts.smtcomp_mode) {
       printf("unknown");
diff --git a/src/parser/language.h b/src/parser/language.h
new file mode 100644 (file)
index 0000000..7ea6547
--- /dev/null
@@ -0,0 +1,31 @@
+/*********************                                           -*- C++ -*-  */
+/** language.h
+ ** This file is part of the CVC4 prototype.
+ ** Copyright (c) 2009 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.
+ **
+ ** Input languages.
+ **/
+
+#ifndef __CVC4__PARSER__LANGUAGE_H
+#define __CVC4__PARSER__LANGUAGE_H
+
+#include "util/exception.h"
+#include "parser/language.h"
+
+namespace CVC4 {
+namespace parser {
+
+enum Language {
+  AUTO = 0,
+  PL,
+  SMTLIB,
+};/* enum Language */
+
+}/* CVC4::parser namespace */
+}/* CVC4 namespace */
+
+#endif /* __CVC4__PARSER__LANGUAGE_H */
index 36b8c34eb2baab4bd2d3db4904ff3e8cd197fedf..73565b8c4c8e2067345b6ab784fb5bed43859d53 100644 (file)
 #ifndef __CVC4__PARSER__PARSER_H
 #define __CVC4__PARSER__PARSER_H
 
-#include "core/exception.h"
-#include "core/lang.h"
+#include "util/exception.h"
+#include "parser/language.h"
+#include "util/command.h"
 
 namespace CVC4 {
 namespace parser {
 
-  class ValidityChecker;
   class Expr;
   
   // Internal parser state and other data
@@ -33,16 +33,11 @@ namespace parser {
     void deleteParser();
   public:
     // Constructors
-    Parser(ValidityChecker* vc, InputLanguage lang,
-          // The 'interactive' flag is ignored when fileName != ""
-          bool interactive = true,
-          const std::string& fileName = "");
-    Parser(ValidityChecker* vc, InputLanguage lang, std::istream& is,
-          bool interactive = false);
+    Parser(CVC4::SmtEngine* smt, Language lang, std::istream& is, Options* opts, bool interactive = false);
     // Destructor
     ~Parser();
     // Read the next command.  
-    Expr next();
+    CVC4::Command* next();
     // Check if we are done (end of input has been reached)
     bool done() const;
     // The same check can be done by using the class Parser's value as
index 4eda5eb3884fc0d7c518b82979aebe3ca581c94c..1d013a0b40cb1df170a9df2cab0964eb22b80db3 100644 (file)
@@ -19,7 +19,7 @@
 
 #include <iostream>
 #include <sstream>
-#include "cvc4_expr.h"
+#include "expr/expr.h"
 #include "expr/expr_manager.h"
 #include "util/exception.h"
 
index e7d752419f377609576173159348a63380e61d2d..b59c7c69e83cb1ff808dbbc489b6e9eaf39d3541 100644 (file)
 
 %{
 
-#include "cvc4.h"
-#include "cvc4_expr.h"
+#include "smt/smt_engine.h"
 #include "parser/parser_exception.h"
 #include "parser/parser_state.h"
+#include "expr/expr.h"
 #include "expr/expr_builder.h"
 #include "expr/expr_manager.h"
 #include "util/command.h"
index 692a9cda5b9147390db4e1ecf1a701cc7a8f8396..e616b3a65e9dc48f7cc4cfbd3536acc9f2ce26d3 100644 (file)
  ** commands in SMT-LIB language.
  **/
 
-#include "cvc4.h"
+#include "smt/smt_engine.h"
 #include "parser/parser_exception.h"
 #include "parser/parser_state.h"
 
+#include <vector>
+
 // Exported shared data
 namespace CVC4 {
   extern ParserState* parserState;
index 08d48588204ad331dc3b627a1d8b6801649c2b78..5969e82d1a61cce60bc8b207d24fc9eb1b17bc7c 100644 (file)
@@ -12,7 +12,7 @@
 #ifndef __CVC4__PROP__PROP_ENGINE_H
 #define __CVC4__PROP__PROP_ENGINE_H
 
-#include "cvc4_expr.h"
+#include "expr/expr.h"
 #include "util/decision_engine.h"
 #include "theory/theory_engine.h"
 
index 325999db220f2ec591b4fd6b17acab1b302c62c2..b8fc81961119b4e92dc148c204207a5a62f21fc2 100644 (file)
@@ -4,4 +4,5 @@ AM_CPPFLAGS = -D__BUILDING_CVC4LIB
 
 noinst_LTLIBRARIES = libsmt.la
 
-libsmt_la_SOURCES =
+libsmt_la_SOURCES = \
+       smt_engine.cpp
index 078bf9cde6e90d32712356803a5625a7521eac12..149de058e246f1ae9b168215c13c3bafc47e1e01 100644 (file)
@@ -1,5 +1,5 @@
 /*********************                                           -*- C++ -*-  */
-/** prover.h
+/** cvc4.h
  ** This file is part of the CVC4 prototype.
  ** Copyright (c) 2009 The Analysis of Computer Systems Group (ACSys)
  ** Courant Institute of Mathematical Sciences
@@ -9,20 +9,22 @@
  **
  **/
 
-#ifndef __CVC4__SMT__SMT_ENGINE_H
-#define __CVC4__SMT__SMT_ENGINE_H
+#ifndef __CVC4__SMT_ENGINE_H
+#define __CVC4__SMT_ENGINE_H
 
 #include <vector>
-#include "core/cvc4_expr.h"
-#include "core/result.h"
-#include "core/model.h"
+#include "expr/expr.h"
+#include "expr/expr_manager.h"
+#include "util/command.h"
+#include "util/result.h"
+#include "util/model.h"
+#include "util/options.h"
 
 // In terms of abstraction, this is below (and provides services to)
 // ValidityChecker and above (and requires the services of)
 // PropEngine.
 
 namespace CVC4 {
-namespace smt {
 
 // TODO: SAT layer (esp. CNF- versus non-clausal solvers under the
 // hood): use a type parameter and have check() delegate, or subclass
@@ -40,7 +42,12 @@ class SmtEngine {
   // TODO: make context-aware to handle user-level push/pop.
   std::vector<Expr> d_assertList;
 
-private:
+  /** Our expression manager */
+  ExprManager *d_em;
+
+  /** User-level options */
+  Options *d_opts;
+
   /**
    * Pre-process an Expr.  This is expected to be highly-variable,
    * with a lot of "source-level configurability" to add multiple
@@ -74,6 +81,16 @@ private:
   void processAssertionList();
 
 public:
+  /*
+   * Construct an SmtEngine with the given expression manager and user options.
+   */
+  SmtEngine(ExprManager* em, Options* opts) : d_em(em), d_opts(opts) {}
+
+  /**
+   * Execute a command.
+   */
+  void doCommand(Command*);
+
   /**
    * Add a formula to the current context: preprocess, do per-theory
    * setup, use processAssertionList(), asserting to T-solver for
@@ -110,7 +127,6 @@ public:
   void pop();
 };/* class SmtEngine */
 
-}/* CVC4::smt namespace */
 }/* CVC4 namespace */
 
-#endif /* __CVC4__SMT__SMT_ENGINE_H */
+#endif /* __CVC4__SMT_ENGINE_H */
index 804d3771770e11798af046ce4909426fb5e7c1b3..976e2b3d7fc02522803daf8938aba7d23b94e482 100644 (file)
 #ifndef __CVC4__COMMAND_H
 #define __CVC4__COMMAND_H
 
+#include "expr/expr.h"
+
 namespace CVC4 {
 
-class Command { 
-   // distinct from Exprs
+class SmtEngine;
+
+class Command {
+  SmtEngine* d_smt;
+
+public:
+  Command(CVC4::SmtEngine* smt) : d_smt(smt) {}
+  virtual void invoke() = 0;
 };
 
 class AssertCommand : public Command {
 public:
   AssertCommand(const Expr&);
+  void invoke() { }
 };
 
 class CheckSatCommand : public Command {
 public:
   CheckSatCommand(void);
   CheckSatCommand(const Expr&);
+  void invoke() { }
 };
 
 class QueryCommand : public Command {
 public:
   QueryCommand(const Expr&);
+  void invoke() { }
 };