This is a merge from the "theoryfixes+cdattrhash" branch. The changes
authorMorgan Deters <mdeters@gmail.com>
Fri, 25 Mar 2011 05:32:31 +0000 (05:32 +0000)
committerMorgan Deters <mdeters@gmail.com>
Fri, 25 Mar 2011 05:32:31 +0000 (05:32 +0000)
are somewhat disparate but belonged on the same branch because they were
held back from trunk all for the same reason (to keep the trunk stable
for furious bitvector development).  Dejan has now given me the go-ahead
for a merge.

=========================================
THIS COMMIT CHANGES THE THEORY INTERFACE!
=========================================

Theory constructors are expected to take an additional "Valuation*"
parameter that each Theory should send along to the base class
constructor.  The base class Theory keeps the Valuation* in a
d_valuation field for use by it and by its derived classes.
Theory::getValue() no longer takes a Valuation* (it is expected
to use d_valuation instead).  This allows other theory functions
to take advantage of getValue() for debugging or heuristic
purposes.

TODO BEFORE MERGE TO TRUNK:
****implement BitIterator find() in CDAttrHash<bool>.

Specifically:

* Added QF_BV support for SMT-LIB v2.
* Two adjustments to the theory interface as requested by Tim King:
  1. As described above.
  2. Theories now have const access to the fact queue through base
     class functions facts_begin() and facts_end(); useful for
     debugging.
* Added an "Asserted" attribute so that theories can check if something
  has been asserted or not (and therefore not propagate it).  However, this
  has been disabled for now, pending more data on the overhead of it, and
  pending discussion at the 3/25/2011 meeting.
* Do not define NDEBUG in MiniSat in assertion-enabled builds (so
  that MiniSat asserts are evaluated).
* As a result of the new MiniSat assertions, some --incremental
  regressions had to be disabled; also, some bitvectors ?!!
* Bug 71 is resolved by adding a specialization for CDAttrHash<> in the
  attribute package.
* Fixes for some warnings flagged by clang.
* System tests have arrived!  So far mainly infrastructure for having
  system tests, but there is a system test aimed at improving code
  coverage of the printer package.
* Minor other adjustments to documentation and coding to be more
  conformant to CVC4 policy.

Tests have been performed to demonstrate that these changes have no or
negligible effect on performance.  In particular, changing the
CDAttrHash<> doesn't have any real effect on performance or memory right
now, since there is only one context-dependent boolean flag (as soon
as another is added, the effect is noticeable but probably still slight).

66 files changed:
Makefile.am
configure.ac
src/context/cdlist_forward.h
src/context/cdmap_forward.h
src/context/cdset_forward.h
src/context/context.h
src/expr/attribute.cpp
src/expr/attribute_internals.h
src/expr/command.cpp
src/expr/declaration_scope.h
src/expr/expr_manager_template.cpp
src/expr/expr_manager_template.h
src/expr/expr_template.cpp
src/expr/node.cpp
src/expr/node_manager.h
src/expr/type.h
src/lib/clock_gettime.c
src/parser/input.h
src/parser/smt/Smt.g
src/parser/smt2/Smt2.g
src/parser/smt2/smt2.cpp
src/printer/smt2/smt2_printer.cpp
src/prop/minisat/Makefile.am
src/prop/sat.h
src/theory/arith/theory_arith.cpp
src/theory/arith/theory_arith.h
src/theory/arrays/theory_arrays.cpp
src/theory/arrays/theory_arrays.h
src/theory/booleans/theory_bool.cpp
src/theory/booleans/theory_bool.h
src/theory/builtin/theory_builtin.cpp
src/theory/builtin/theory_builtin.h
src/theory/bv/theory_bv.cpp
src/theory/bv/theory_bv.h
src/theory/bv/theory_bv_rewriter.h
src/theory/theory.h
src/theory/theory_engine.cpp
src/theory/theory_engine.h
src/theory/uf/morgan/theory_uf_morgan.cpp
src/theory/uf/morgan/theory_uf_morgan.h
src/theory/uf/theory_uf.h
src/theory/uf/tim/theory_uf_tim.cpp
src/theory/uf/tim/theory_uf_tim.h
test/Makefile.am
test/regress/Makefile.am
test/regress/regress0/Makefile.am
test/regress/regress0/arith/Makefile.am
test/regress/regress0/bv/core/Makefile.am
test/regress/regress0/lemmas/Makefile.am
test/regress/regress0/precedence/Makefile.am
test/regress/regress0/push-pop/Makefile.am
test/regress/regress0/uf/Makefile.am
test/regress/regress0/uflra/Makefile.am
test/regress/regress1/Makefile.am
test/regress/regress1/arith/Makefile.am
test/regress/regress2/Makefile.am
test/regress/regress3/Makefile.am
test/system/Makefile.am
test/system/boilerplate.cpp [new file with mode: 0644]
test/system/ouroborous.cpp [new file with mode: 0644]
test/unit/Makefile.am
test/unit/expr/attribute_white.h
test/unit/theory/theory_arith_white.h
test/unit/theory/theory_black.h
test/unit/theory/theory_engine_white.h
test/unit/theory/theory_uf_tim_white.h

index 288cfb2cc1b1b059bfe4509732479c6201603eeb..ecb9c6eda2b4a034a1f62f1077043a8d54c20baf 100644 (file)
@@ -7,8 +7,8 @@ ACLOCAL_AMFLAGS = -I config
 
 SUBDIRS = src test contrib
 
-.PHONY: units regress regress0 regress1 regress2 regress3
-regress regress0 regress1 regress2 regress3: all
+.PHONY: units systemtests regress regress0 regress1 regress2 regress3
+systemtests regress regress0 regress1 regress2 regress3: all
        (cd test && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1
 units: all
        (cd test && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1
index 05e3bac8e19e1d54d031103dd99523d12cae39b0..fae1ec3291c147b636fd15bf2e8a6d87813060fb 100644 (file)
@@ -491,6 +491,9 @@ AC_MSG_RESULT([$enable_assertions])
 
 if test "$enable_assertions" = yes; then
   CVC4CPPFLAGS="${CVC4CPPFLAGS:+$CVC4CPPFLAGS }-DCVC4_ASSERTIONS"
+else
+  # turn off regular C assert() also
+  CVC4CPPFLAGS="${CVC4CPPFLAGS:+$CVC4CPPFLAGS }-DNDEBUG"
 fi
 
 AC_MSG_CHECKING([whether to do a traceable build of CVC4])
index 82bc9cc159616c3a0f9573e88cac24a48e2180e2..a1e50c7c85ee7f9363acc392531654262620d909 100644 (file)
@@ -37,7 +37,7 @@
 #include <memory>
 
 namespace __gnu_cxx {
-  template <class Key> class hash;
+  template <class Key> struct hash;
 }/* __gnu_cxx namespace */
 
 namespace CVC4 {
index 1024f0b54cbd17e72644646e28de22d793cde2ef..214d9e700318ae205ae7d8092770597703c48ce2 100644 (file)
@@ -29,7 +29,7 @@
 #define __CVC4__CONTEXT__CDMAP_FORWARD_H
 
 namespace __gnu_cxx {
-  template <class Key> class hash;
+  template <class Key> struct hash;
 }/* __gnu_cxx namespace */
 
 namespace CVC4 {
index 135db8751de494f33e7e91f67ae58b03adaca2f0..af3c6f85cfbcdb693d4cbf2ec7cd0f55d589fded 100644 (file)
@@ -29,7 +29,7 @@
 #define __CVC4__CONTEXT__CDSET_FORWARD_H
 
 namespace __gnu_cxx {
-  template <class Key> class hash;
+  template <class Key> struct hash;
 }/* __gnu_cxx namespace */
 
 namespace CVC4 {
index 053d5cb1a6abe9b0cd21ed1ea9697fb22c2f8b86..aabe4e7c2e429c7b602dfb1079bf4a4fe82a57fe 100644 (file)
@@ -496,6 +496,15 @@ protected:
 
 public:
 
+  /**
+   * Disable delete: objects allocated with new(ContextMemorymanager) should
+   * never be deleted.  Objects allocated with new(bool) should be deleted by
+   * calling deleteSelf().
+   */
+  static void operator delete(void* pMem) {
+    AlwaysAssert(false, "It is not allowed to delete a ContextObj this way!");
+  }
+
   /**
    * operator new using ContextMemoryManager (common case used by
    * subclasses during save()).  No delete is required for memory
@@ -573,15 +582,6 @@ public:
     ::operator delete(this);
   }
 
-  /**
-   * Disable delete: objects allocated with new(ContextMemorymanager) should
-   * never be deleted.  Objects allocated with new(bool) should be deleted by
-   * calling deleteSelf().
-   */
-  static void operator delete(void* pMem) {
-    AlwaysAssert(false, "It is not allowed to delete a ContextObj this way!");
-  }
-
 };/* class ContextObj */
 
 /**
index 2952444732801ce1c8ecc05a67e102d31d27469a..85c0fe52803948c7ec784c7c4ca001b45e255b31 100644 (file)
@@ -37,8 +37,7 @@ void AttributeManager::deleteAllAttributes(NodeValue* nv) {
   deleteFromTable(d_strings, nv);
   deleteFromTable(d_ptrs, nv);
 
-  // FIXME CD-bools in optimized table
-  deleteFromTable(d_cdbools, nv);
+  d_cdbools.erase(nv);
   deleteFromTable(d_cdints, nv);
   deleteFromTable(d_cdtnodes, nv);
   deleteFromTable(d_cdnodes, nv);
@@ -55,7 +54,6 @@ void AttributeManager::deleteAllAttributes() {
   deleteAllFromTable(d_strings);
   deleteAllFromTable(d_ptrs);
 
-  // FIXME CD-bools in optimized table
   d_cdbools.clear();
   d_cdints.clear();
   d_cdtnodes.clear();
@@ -64,7 +62,6 @@ void AttributeManager::deleteAllAttributes() {
   d_cdptrs.clear();
 }
 
-
 }/* CVC4::expr::attr namespace */
 }/* CVC4::expr namespace */
 }/* CVC4 namespace */
index a77d09c4df96c26a4f1c336a0dc97878ca64498d..3bbab17a42c9297256100de34bbebe4846ce6d94 100644 (file)
@@ -153,11 +153,11 @@ namespace attr {
  * to value_type using our specialized hash function for these pairs.
  */
 template <class value_type>
-struct AttrHash :
+class AttrHash :
     public __gnu_cxx::hash_map<std::pair<uint64_t, NodeValue*>,
                                value_type,
                                AttrHashStrategy> {
-};
+};/* class AttrHash<> */
 
 /**
  * In the case of Boolean-valued attributes we have a special
@@ -205,7 +205,7 @@ class AttrHash<bool> :
     operator bool() const {
       return (d_word & (1 << d_bit)) ? true : false;
     }
-  };
+  };/* class AttrHash<bool>::BitAccessor */
 
   /**
    * A (somewhat degenerate) iterator over boolean-valued attributes.
@@ -239,7 +239,7 @@ class AttrHash<bool> :
     bool operator==(const BitIterator& b) {
       return d_entry == b.d_entry && d_bit == b.d_bit;
     }
-  };
+  };/* class AttrHash<bool>::BitIterator */
 
   /**
    * A (somewhat degenerate) const_iterator over boolean-valued
@@ -274,7 +274,7 @@ class AttrHash<bool> :
     bool operator==(const ConstBitIterator& b) {
       return d_entry == b.d_entry && d_bit == b.d_bit;
     }
-  };
+  };/* class AttrHash<bool>::ConstBitIterator */
 
 public:
 
@@ -374,7 +374,226 @@ public:
                    value_type,
                    AttrHashStrategy>(ctxt) {
   }
-};
+};/* class CDAttrHash<> */
+
+/**
+ * In the case of Boolean-valued attributes we have a special
+ * "CDAttrHash<bool>" to pack bits together in words.
+ */
+template <>
+class CDAttrHash<bool> :
+    protected context::CDMap<NodeValue*,
+                             uint64_t,
+                             AttrHashBoolStrategy> {
+
+  /** A "super" type, like in Java, for easy reference below. */
+  typedef context::CDMap<NodeValue*, uint64_t, AttrHashBoolStrategy> super;
+
+  /**
+   * BitAccessor allows us to return a bit "by reference."  Of course,
+   * we don't require bit-addressibility supported by the system, we
+   * do it with a complex type.
+   */
+  class BitAccessor {
+
+    super& d_map;
+
+    NodeValue* d_key;
+
+    uint64_t d_word;
+
+    unsigned d_bit;
+
+  public:
+
+    BitAccessor(super& map, NodeValue* key, uint64_t word, unsigned bit) :
+      d_map(map),
+      d_key(key),
+      d_word(word),
+      d_bit(bit) {
+      Debug.printf("cdboolattr", "CDAttrHash<bool>::BitAccessor(%p, %p, %lx, %u)\n", &map, key, word, bit);
+    }
+
+    BitAccessor& operator=(bool b) {
+      if(b) {
+        // set the bit
+        d_word |= (1 << d_bit);
+        d_map.insert(d_key, d_word);
+        Debug.printf("cdboolattr", "CDAttrHash<bool>::BitAccessor::set(%p, %p, %lx, %u)\n", &d_map, d_key, d_word, d_bit);
+      } else {
+        // clear the bit
+        d_word &= ~(1 << d_bit);
+        d_map.insert(d_key, d_word);
+        Debug.printf("cdboolattr", "CDAttrHash<bool>::BitAccessor::clr(%p, %p, %lx, %u)\n", &d_map, d_key, d_word, d_bit);
+      }
+
+      return *this;
+    }
+
+    operator bool() const {
+      Debug.printf("cdboolattr", "CDAttrHash<bool>::BitAccessor::toBool(%p, %p, %lx, %u)\n", &d_map, d_key, d_word, d_bit);
+      return (d_word & (1 << d_bit)) ? true : false;
+    }
+  };/* class CDAttrHash<bool>::BitAccessor */
+
+  /**
+   * A (somewhat degenerate) iterator over boolean-valued attributes.
+   * This iterator doesn't support anything except comparison and
+   * dereference.  It's intended just for the result of find() on the
+   * table.
+   */
+  class BitIterator {
+
+    super* d_map;
+
+    std::pair<NodeValue* const, uint64_t>* d_entry;
+
+    unsigned d_bit;
+
+  public:
+
+    BitIterator() :
+      d_map(NULL),
+      d_entry(NULL),
+      d_bit(0) {
+    }
+
+    BitIterator(super& map, std::pair<NodeValue* const, uint64_t>& entry, unsigned bit) :
+      d_map(&map),
+      d_entry(&entry),
+      d_bit(bit) {
+    }
+
+    std::pair<NodeValue* const, BitAccessor> operator*() {
+      return std::make_pair(d_entry->first,
+                            BitAccessor(*d_map, d_entry->first, d_entry->second, d_bit));
+    }
+
+    bool operator==(const BitIterator& b) {
+      return d_entry == b.d_entry && d_bit == b.d_bit;
+    }
+  };/* class CDAttrHash<bool>::BitIterator */
+
+  /**
+   * A (somewhat degenerate) const_iterator over boolean-valued
+   * attributes.  This const_iterator doesn't support anything except
+   * comparison and dereference.  It's intended just for the result of
+   * find() on the table.
+   */
+  class ConstBitIterator {
+
+    const std::pair<NodeValue* const, uint64_t> d_entry;
+
+    unsigned d_bit;
+
+  public:
+
+    ConstBitIterator() :
+      d_entry(),
+      d_bit(0) {
+    }
+
+    ConstBitIterator(const std::pair<NodeValue* const, uint64_t>& entry,
+                     unsigned bit) :
+      d_entry(entry),
+      d_bit(bit) {
+    }
+
+    std::pair<NodeValue* const, bool> operator*() {
+      return std::make_pair(d_entry.first,
+                            (d_entry.second & (1 << d_bit)) ? true : false);
+    }
+
+    bool operator==(const ConstBitIterator& b) {
+      return d_entry == b.d_entry && d_bit == b.d_bit;
+    }
+  };/* class CDAttrHash<bool>::ConstBitIterator */
+
+  /* remove non-permitted operations */
+  CDAttrHash(const CDAttrHash<bool>&) CVC4_UNDEFINED;
+  CDAttrHash<bool>& operator=(const CDAttrHash<bool>&) CVC4_UNDEFINED;
+
+public:
+
+  CDAttrHash(context::Context* context) : super(context) { }
+
+  typedef std::pair<uint64_t, NodeValue*> key_type;
+  typedef bool data_type;
+  typedef std::pair<const key_type, data_type> value_type;
+
+  /** an iterator type; see above for limitations */
+  typedef BitIterator iterator;
+  /** a const_iterator type; see above for limitations */
+  typedef ConstBitIterator const_iterator;
+
+  /**
+   * Find the boolean value in the hash table.  Returns something ==
+   * end() if not found.
+   */
+  /*BitIterator find(const std::pair<uint64_t, NodeValue*>& k) {
+    super::iterator i = super::find(k.second);
+    if(i == super::end()) {
+      return BitIterator();
+    }
+    Debug.printf("cdboolattr",
+                 "underlying word at 0x%p looks like 0x%016llx, bit is %u\n",
+                 &(*i).second,
+                 (unsigned long long)((*i).second),
+                 unsigned(k.first));
+    return BitIterator(*i, k.first);
+  }*/
+
+  /** The "off the end" iterator */
+  BitIterator end() {
+    return BitIterator();
+  }
+
+  /**
+   * Find the boolean value in the hash table.  Returns something ==
+   * end() if not found.
+   */
+  ConstBitIterator find(const std::pair<uint64_t, NodeValue*>& k) const {
+    super::const_iterator i = super::find(k.second);
+    if(i == super::end()) {
+      return ConstBitIterator();
+    }
+    Debug.printf("cdboolattr",
+                 "underlying word at address looks like 0x%016llx, bit is %u\n",
+                 (unsigned long long)((*i).second),
+                 unsigned(k.first));
+    return ConstBitIterator(*i, k.first);
+  }
+
+  /** The "off the end" const_iterator */
+  ConstBitIterator end() const {
+    return ConstBitIterator();
+  }
+
+  /**
+   * Access the hash table using the underlying operator[].  Inserts
+   * the key into the table (associated to default value) if it's not
+   * already there.
+   */
+  BitAccessor operator[](const std::pair<uint64_t, NodeValue*>& k) {
+    uint64_t word = super::operator[](k.second);
+    return BitAccessor(*this, k.second, word, k.first);
+  }
+
+  /**
+   * Delete all flags from the given node.
+   */
+  void erase(NodeValue* nv) {
+    super::obliterate(nv);
+  }
+
+  /**
+   * Clear the hash table.
+   */
+  void clear() {
+    super::clear();
+  }
+
+};/* class CDAttrHash<bool> */
 
 }/* CVC4::expr::attr namespace */
 
index b17e98b3816a6fb5f04268b75b02675bf73312d0..7c08293bed972b5e277b65633a010905415df60d 100644 (file)
@@ -345,9 +345,9 @@ void SetBenchmarkStatusCommand::invoke(SmtEngine* smtEngine) {
   try {
     smtEngine->setInfo(":status", status);
     //d_result = "success";
-  } catch(ModalException& m) {
+  } catch(ModalException&) {
     d_result = "error";
-  } catch(BadOptionException& bo) {
+  } catch(BadOptionException&) {
     // should not happen
     d_result = "error";
   }
@@ -367,7 +367,7 @@ void SetBenchmarkLogicCommand::invoke(SmtEngine* smtEngine) {
   try {
     smtEngine->setLogic(d_logic);
     //d_result = "success";
-  } catch(ModalException& m) {
+  } catch(ModalException&) {
     d_result = "error";
   }
 }
@@ -387,9 +387,9 @@ void SetInfoCommand::invoke(SmtEngine* smtEngine) {
   try {
     smtEngine->setInfo(d_flag, d_sexpr);
     //d_result = "success";
-  } catch(ModalException& m) {
+  } catch(ModalException&) {
     d_result = "error";
-  } catch(BadOptionException& bo) {
+  } catch(BadOptionException&) {
     d_result = "unsupported";
   }
 }
@@ -419,7 +419,7 @@ void GetInfoCommand::invoke(SmtEngine* smtEngine) {
     stringstream ss;
     ss << smtEngine->getInfo(d_flag);
     d_result = ss.str();
-  } catch(BadOptionException& bo) {
+  } catch(BadOptionException&) {
     d_result = "unsupported";
   }
 }
@@ -449,9 +449,9 @@ void SetOptionCommand::invoke(SmtEngine* smtEngine) {
   try {
     smtEngine->setOption(d_flag, d_sexpr);
     //d_result = "success";
-  } catch(ModalException& m) {
+  } catch(ModalException&) {
     d_result = "error";
-  } catch(BadOptionException& bo) {
+  } catch(BadOptionException&) {
     d_result = "unsupported";
   }
 }
@@ -479,7 +479,7 @@ GetOptionCommand::GetOptionCommand(std::string flag) :
 void GetOptionCommand::invoke(SmtEngine* smtEngine) {
   try {
     d_result = smtEngine->getOption(d_flag).getValue();
-  } catch(BadOptionException& bo) {
+  } catch(BadOptionException&) {
     d_result = "unsupported";
   }
 }
index 65574b6c9b2d9d82fc4de25b10846c4eb18e6728..9acc46b5fbd188f535b13e242cff903763dea836 100644 (file)
  ** Convenience class for scoping variable and type declarations.
  **/
 
-#ifndef DECLARATION_SCOPE_H
-#define DECLARATION_SCOPE_H
+#include "cvc4_public.h"
+
+#ifndef __CVC4__DECLARATION_SCOPE_H
+#define __CVC4__DECLARATION_SCOPE_H
 
 #include <vector>
 #include <utility>
@@ -182,4 +184,4 @@ public:
 
 }/* CVC4 namespace */
 
-#endif /* DECLARATION_SCOPE_H */
+#endif /* __CVC4__DECLARATION_SCOPE_H */
index eadbb73a2bf3e411e446d6e1b8edddff96d5cb51..9b8511de9891c08ab87a0ebce3f0620406b7e80b 100644 (file)
@@ -115,22 +115,22 @@ ExprManager::~ExprManager() {
 
 BooleanType ExprManager::booleanType() const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->booleanType()));
+  return BooleanType(Type(d_nodeManager, new TypeNode(d_nodeManager->booleanType())));
 }
 
 KindType ExprManager::kindType() const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->kindType()));
+  return KindType(Type(d_nodeManager, new TypeNode(d_nodeManager->kindType())));
 }
 
 RealType ExprManager::realType() const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->realType()));
+  return RealType(Type(d_nodeManager, new TypeNode(d_nodeManager->realType())));
 }
 
 IntegerType ExprManager::integerType() const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->integerType()));
+  return IntegerType(Type(d_nodeManager, new TypeNode(d_nodeManager->integerType())));
 }
 
 Expr ExprManager::mkExpr(Kind kind, const Expr& child1) {
@@ -285,7 +285,7 @@ Expr ExprManager::mkExpr(Expr opExpr, const std::vector<Expr>& children) {
 /** Make a function type from domain to range. */
 FunctionType ExprManager::mkFunctionType(const Type& domain, const Type& range) {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkFunctionType(*domain.d_typeNode, *range.d_typeNode)));
+  return FunctionType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkFunctionType(*domain.d_typeNode, *range.d_typeNode))));
 }
 
 /** Make a function type with input types from argTypes. */
@@ -296,7 +296,7 @@ FunctionType ExprManager::mkFunctionType(const std::vector<Type>& argTypes, cons
   for (unsigned i = 0, i_end = argTypes.size(); i < i_end; ++ i) {
     argTypeNodes.push_back(*argTypes[i].d_typeNode);
   }
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkFunctionType(argTypeNodes, *range.d_typeNode)));
+  return FunctionType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkFunctionType(argTypeNodes, *range.d_typeNode))));
 }
 
 FunctionType ExprManager::mkFunctionType(const std::vector<Type>& sorts) {
@@ -306,7 +306,7 @@ FunctionType ExprManager::mkFunctionType(const std::vector<Type>& sorts) {
   for (unsigned i = 0, i_end = sorts.size(); i < i_end; ++ i) {
      sortNodes.push_back(*sorts[i].d_typeNode);
   }
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkFunctionType(sortNodes)));
+  return FunctionType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkFunctionType(sortNodes))));
 }
 
 FunctionType ExprManager::mkPredicateType(const std::vector<Type>& sorts) {
@@ -316,7 +316,7 @@ FunctionType ExprManager::mkPredicateType(const std::vector<Type>& sorts) {
   for (unsigned i = 0, i_end = sorts.size(); i < i_end; ++ i) {
      sortNodes.push_back(*sorts[i].d_typeNode);
   }
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkPredicateType(sortNodes)));
+  return FunctionType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkPredicateType(sortNodes))));
 }
 
 TupleType ExprManager::mkTupleType(const std::vector<Type>& types) {
@@ -326,29 +326,29 @@ TupleType ExprManager::mkTupleType(const std::vector<Type>& types) {
   for (unsigned i = 0, i_end = types.size(); i < i_end; ++ i) {
      typeNodes.push_back(*types[i].d_typeNode);
   }
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkTupleType(typeNodes)));
+  return TupleType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkTupleType(typeNodes))));
 }
 
 BitVectorType ExprManager::mkBitVectorType(unsigned size) const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkBitVectorType(size)));
+  return BitVectorType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkBitVectorType(size))));
 }
 
 ArrayType ExprManager::mkArrayType(Type indexType, Type constituentType) const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkArrayType(*indexType.d_typeNode, *constituentType.d_typeNode)));
+  return ArrayType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkArrayType(*indexType.d_typeNode, *constituentType.d_typeNode))));
 }
 
 SortType ExprManager::mkSort(const std::string& name) const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager, new TypeNode(d_nodeManager->mkSort(name)));
+  return SortType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkSort(name))));
 }
 
 SortConstructorType ExprManager::mkSortConstructor(const std::string& name,
                                                    size_t arity) const {
   NodeManagerScope nms(d_nodeManager);
-  return Type(d_nodeManager,
-              new TypeNode(d_nodeManager->mkSortConstructor(name, arity)));
+  return SortConstructorType(Type(d_nodeManager,
+              new TypeNode(d_nodeManager->mkSortConstructor(name, arity))));
 }
 
 /**
index fba1a919c63de9a5e67022fe20a861a143aa8109..83d306871f98c931e32793eb56812161648d6796 100644 (file)
@@ -40,7 +40,7 @@ namespace CVC4 {
 class Expr;
 class SmtEngine;
 class NodeManager;
-class Options;
+struct Options;
 class IntStat;
 
 namespace context {
index eb618a8c904ddaeea916a89feda0dea76b36324b..f6d3466304fd99a80d5fd8556f55daada29d9f66 100644 (file)
@@ -74,7 +74,7 @@ TypeCheckingException::~TypeCheckingException() throw () {
 
 std::string TypeCheckingException::toString() const {
   std::stringstream ss;
-  ss << "Error type-checking " << d_expr << ": " << d_msg;
+  ss << "Error type-checking " << d_expr << ": " << d_msg << std::endl << *d_expr;
   return ss.str();
 }
 
index efcd429995b95b14ea05e1e7202a4e702073be88..445d91da825313057d2954f76fe3718603718a13 100644 (file)
@@ -37,7 +37,7 @@ TypeCheckingExceptionPrivate::~TypeCheckingExceptionPrivate() throw () {
 
 string TypeCheckingExceptionPrivate::toString() const {
   stringstream ss;
-  ss << "Error type-checking " << d_node << ": " << d_msg;
+  ss << "Error type-checking " << d_node << ": " << d_msg << std::endl << *d_node;
   return ss.str();
 }
 
index 117497539a4202e63a4d40e8cde5933711d96cb4..d8a690da5dc33ff9d5f694bedda5095d9f994912 100644 (file)
@@ -42,7 +42,7 @@
 
 namespace CVC4 {
 
-class Options;
+struct Options;
 
 namespace expr {
 
index d357c869ef8d96a386a1a3312bcd92d0896ba6d1..cc12485107e1dff74d437d4af6e2c262695cdf97 100644 (file)
@@ -73,7 +73,7 @@ class CVC4_PUBLIC Type {
   friend class SmtEngine;
   friend class ExprManager;
   friend class TypeNode;
-  friend class TypeHashStrategy;
+  friend struct TypeHashStrategy;
   friend std::ostream& operator<<(std::ostream& out, const Type& t);
 
 protected:
index b1bc24ed894ecd59a65bceaf821355ec65ac46d7..97c8f28a836fe454819520658ec6041d45c7bad9 100644 (file)
@@ -18,6 +18,8 @@
  ** OS X).
  **/
 
+#include "cvc4_private.h"
+
 #include <stdio.h>
 #include <errno.h>
 #include <time.h>
index 6ed9bb441670e3915a9f623ac40df4a0a6ee61d8..b9123fc456f3efbcb55991db462e8887d2d29d7e 100644 (file)
@@ -94,10 +94,11 @@ class CVC4_PUBLIC Input {
   InputStream *d_inputStream;
 
   /* Since we own d_inputStream and it needs to be freed, we need to prevent
-   * copy construction and assignment.
+   * copy construction and assignment.  Mark them private and do not define
+   * them.
    */
-  Input(const Input& input) { Unimplemented("Copy constructor for Input."); }
-  Input& operator=(const Input& input) { Unimplemented("operator= for Input."); }
+  Input(const Input& input) CVC4_UNUSED;
+  Input& operator=(const Input& input) CVC4_UNUSED;
 
 public:
 
index f125826d3b5034810fec7d8e0dcca9b4f435fecc..39d834891b37d502358ce9cb7eb5d589abfc69de 100644 (file)
@@ -595,7 +595,7 @@ ROTATE_LEFT_TOK   : 'rotate_left';
 ROTATE_RIGHT_TOK  : 'rotate_right';
 
 /**
- * Mathces a bit-vector constant of the form bv123
+ * Matches a bit-vector constant of the form bv123
  */
 BITVECTOR_BV_CONST
   : 'bv' DIGIT+
index 705eee4d4a1fd65d8c14624925feb0620001f9ee..f34279149b776124b71a05c3e619c61501f10a20 100644 (file)
@@ -5,7 +5,7 @@
  ** Major contributors: none
  ** Minor contributors (to current version): mdeters, taking
  ** This file is part of the CVC4 prototype.
- ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Copyright (c) 2009, 2010, 2011  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
@@ -27,7 +27,7 @@ options {
 @header {
 /**
  ** This file is part of the CVC4 prototype.
- ** Copyright (c) 2009, 2010  The Analysis of Computer Systems Group (ACSys)
+ ** Copyright (c) 2009, 2010, 2011  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
@@ -321,6 +321,7 @@ term[CVC4::Expr& expr]
 @init {
   Debug("parser") << "term: " << AntlrInput::tokenText(LT(1)) << std::endl;
   Kind kind;
+  Expr op;
   std::string name;
   std::vector<Expr> args;
   SExpr sexpr;
@@ -356,18 +357,27 @@ term[CVC4::Expr& expr]
   | /* A non-built-in function application */
     LPAREN_TOK
     functionName[name,CHECK_DECLARED]
-    { args.push_back(Expr()); }
-    termList[args,expr] RPAREN_TOK
     { PARSER_STATE->checkFunction(name);
       const bool isDefinedFunction =
         PARSER_STATE->isDefinedFunction(name);
-      expr = isDefinedFunction ?
-        PARSER_STATE->getFunction(name) :
-        PARSER_STATE->getVariable(name);
-      args[0] = expr;
-      expr = MK_EXPR(isDefinedFunction ?
-                     CVC4::kind::APPLY :
-                     CVC4::kind::APPLY_UF, args); }
+      if(isDefinedFunction) {
+        expr = PARSER_STATE->getFunction(name);
+        kind = CVC4::kind::APPLY;
+      } else {
+        expr = PARSER_STATE->getVariable(name);
+        kind = CVC4::kind::APPLY_UF;
+      }
+      args.push_back(expr);
+    }
+    termList[args,expr] RPAREN_TOK
+    { Debug("parser") << "args has size " << args.size() << std::endl << "expr is " << expr << std::endl;
+      for(std::vector<Expr>::iterator i = args.begin(); i != args.end(); ++i)
+        Debug("parser") << "++ " << *i << std::endl;
+      expr = MK_EXPR(kind, args); }
+
+  | /* An indexed function application */
+    LPAREN_TOK indexedFunctionName[op] termList[args,expr] RPAREN_TOK
+    { expr = MK_EXPR(op, args); }
 
   | /* a let binding */
     LPAREN_TOK LET_TOK LPAREN_TOK
@@ -421,18 +431,61 @@ term[CVC4::Expr& expr]
       // valid GMP rational string
       expr = MK_CONST( AntlrInput::tokenToRational($DECIMAL_LITERAL) ); }
 
+  | LPAREN_TOK INDEX_TOK bvLit=SYMBOL size=INTEGER_LITERAL RPAREN_TOK
+    { if(AntlrInput::tokenText($bvLit).find("bv") == 0) {
+        expr = MK_CONST( AntlrInput::tokenToBitvector($bvLit, $size) );
+      } else {
+        PARSER_STATE->parseError("Unexpected symbol `" + AntlrInput::tokenText($bvLit) + "'");
+      }
+    }
+
   | HEX_LITERAL
     { Assert( AntlrInput::tokenText($HEX_LITERAL).find("#x") == 0 );
-      std::string hexString = AntlrInput::tokenTextSubstr($HEX_LITERAL,2);
+      std::string hexString = AntlrInput::tokenTextSubstr($HEX_LITERAL, 2);
       expr = MK_CONST( BitVector(hexString, 16) ); }
 
   | BINARY_LITERAL
     { Assert( AntlrInput::tokenText($BINARY_LITERAL).find("#b") == 0 );
-      std::string binString = AntlrInput::tokenTextSubstr($BINARY_LITERAL,2);
+      std::string binString = AntlrInput::tokenTextSubstr($BINARY_LITERAL, 2);
       expr = MK_CONST( BitVector(binString, 2) ); }
     // NOTE: Theory constants go here
   ;
 
+/**
+ * Matches a bit-vector operator (the ones parametrized by numbers)
+ */
+indexedFunctionName[CVC4::Expr& op]
+  : LPAREN_TOK INDEX_TOK
+    ( 'extract' n1=INTEGER_LITERAL n2=INTEGER_LITERAL
+      { op = MK_CONST(BitVectorExtract(AntlrInput::tokenToUnsigned($n1),
+                                       AntlrInput::tokenToUnsigned($n2))); }
+    | 'repeat' n=INTEGER_LITERAL
+      { op = MK_CONST(BitVectorRepeat(AntlrInput::tokenToUnsigned($n))); }
+    | 'zero_extend' n=INTEGER_LITERAL
+      { op = MK_CONST(BitVectorZeroExtend(AntlrInput::tokenToUnsigned($n))); }
+    | 'sign_extend' n=INTEGER_LITERAL
+      { op = MK_CONST(BitVectorSignExtend(AntlrInput::tokenToUnsigned($n))); }
+    | 'rotate_left' n=INTEGER_LITERAL
+      { op = MK_CONST(BitVectorRotateLeft(AntlrInput::tokenToUnsigned($n))); }
+    | 'rotate_right' n=INTEGER_LITERAL
+      { op = MK_CONST(BitVectorRotateRight(AntlrInput::tokenToUnsigned($n))); }
+    | badIndexedFunctionName
+   )
+    RPAREN_TOK
+  ;
+
+/**
+ * Matches an erroneous indexed function name (and args) for better
+ * error reporting.
+ */
+badIndexedFunctionName
+@declarations {
+  std::string name;
+}
+  : symbol[name,CHECK_NONE,SYM_VARIABLE] INTEGER_LITERAL+
+      { PARSER_STATE->parseError(std::string("Unknown indexed function `") + name + "'"); }
+  ;
+
 /**
  * Matches a sequence of terms and puts them into the formulas
  * vector.
@@ -472,8 +525,40 @@ builtinOp[CVC4::Kind& kind]
   | MINUS_TOK    { $kind = CVC4::kind::MINUS; }
   | STAR_TOK     { $kind = CVC4::kind::MULT; }
   | DIV_TOK      { $kind = CVC4::kind::DIVISION; }
+
   | SELECT_TOK   { $kind = CVC4::kind::SELECT; }
   | STORE_TOK    { $kind = CVC4::kind::STORE; }
+
+  | CONCAT_TOK   { $kind = CVC4::kind::BITVECTOR_CONCAT; }
+  | BVNOT_TOK   { $kind = CVC4::kind::BITVECTOR_NOT; }
+  | BVAND_TOK   { $kind = CVC4::kind::BITVECTOR_AND; }
+  | BVOR_TOK   { $kind = CVC4::kind::BITVECTOR_OR; }
+  | BVNEG_TOK   { $kind = CVC4::kind::BITVECTOR_NEG; }
+  | BVADD_TOK   { $kind = CVC4::kind::BITVECTOR_PLUS; }
+  | BVMUL_TOK   { $kind = CVC4::kind::BITVECTOR_MULT; }
+  | BVUDIV_TOK   { $kind = CVC4::kind::BITVECTOR_UDIV; }
+  | BVUREM_TOK   { $kind = CVC4::kind::BITVECTOR_UREM; }
+  | BVSHL_TOK     { $kind = CVC4::kind::BITVECTOR_SHL; }
+  | BVLSHR_TOK     { $kind = CVC4::kind::BITVECTOR_LSHR; }
+  | BVULT_TOK     { $kind = CVC4::kind::BITVECTOR_ULT; }
+  | BVNAND_TOK     { $kind = CVC4::kind::BITVECTOR_NAND; }
+  | BVNOR_TOK     { $kind = CVC4::kind::BITVECTOR_NOR; }
+  | BVXOR_TOK     { $kind = CVC4::kind::BITVECTOR_XOR; }
+  | BVXNOR_TOK     { $kind = CVC4::kind::BITVECTOR_XNOR; }
+  | BVCOMP_TOK     { $kind = CVC4::kind::BITVECTOR_COMP; }
+  | BVSUB_TOK     { $kind = CVC4::kind::BITVECTOR_SUB; }
+  | BVSDIV_TOK     { $kind = CVC4::kind::BITVECTOR_SDIV; }
+  | BVSREM_TOK     { $kind = CVC4::kind::BITVECTOR_SREM; }
+  | BVSMOD_TOK     { $kind = CVC4::kind::BITVECTOR_SMOD; }
+  | BVASHR_TOK     { $kind = CVC4::kind::BITVECTOR_ASHR; }
+  | BVULE_TOK     { $kind = CVC4::kind::BITVECTOR_ULE; }
+  | BVUGT_TOK     { $kind = CVC4::kind::BITVECTOR_UGT; }
+  | BVUGE_TOK     { $kind = CVC4::kind::BITVECTOR_UGE; }
+  | BVSLT_TOK     { $kind = CVC4::kind::BITVECTOR_SLT; }
+  | BVSLE_TOK     { $kind = CVC4::kind::BITVECTOR_SLE; }
+  | BVSGT_TOK     { $kind = CVC4::kind::BITVECTOR_SGT; }
+  | BVSGE_TOK     { $kind = CVC4::kind::BITVECTOR_SGE; }
+
   // NOTE: Theory operators go here
   ;
 
@@ -534,9 +619,21 @@ sortSymbol[CVC4::Type& t]
 @declarations {
   std::string name;
   std::vector<CVC4::Type> args;
+  std::vector<uint64_t> numerals;
 }
   : sortName[name,CHECK_NONE]
        { t = PARSER_STATE->getSort(name); }
+  | LPAREN_TOK INDEX_TOK symbol[name,CHECK_NONE,SYM_SORT] nonemptyNumeralList[numerals] RPAREN_TOK
+    {
+      if( name == "BitVec" ) {
+        if( numerals.size() != 1 ) {
+          PARSER_STATE->parseError("Illegal bitvector type.");
+        }
+        t = EXPR_MANAGER->mkBitVectorType(numerals.front());
+      } else {
+        Unhandled(name);
+      }
+    }
   | LPAREN_TOK symbol[name,CHECK_NONE,SYM_SORT] sortList[args] RPAREN_TOK
     {
       if( name == "Array" ) {
@@ -580,6 +677,16 @@ symbol[std::string& id,
       PARSER_STATE->checkDeclaration(id, check, type); }
   ;
 
+/**
+ * Matches a nonempty list of numerals.
+ * @param numerals the (empty) vector to house the numerals.
+ */
+nonemptyNumeralList[std::vector<uint64_t>& numerals]
+  : ( INTEGER_LITERAL
+      { numerals.push_back(AntlrInput::tokenToUnsigned($INTEGER_LITERAL)); }
+    )+
+  ;
+
 // Base SMT-LIB tokens
 ASSERT_TOK : 'assert';
 CHECKSAT_TOK : 'check-sat';
@@ -596,6 +703,7 @@ LET_TOK : 'let';
 ATTRIBUTE_TOK : '!';
 LPAREN_TOK : '(';
 RPAREN_TOK : ')';
+INDEX_TOK : '_';
 SET_LOGIC_TOK : 'set-logic';
 SET_INFO_TOK : 'set-info';
 GET_INFO_TOK : 'get-info';
@@ -631,6 +739,36 @@ STORE_TOK         : 'store';
 TILDE_TOK         : '~';
 XOR_TOK           : 'xor';
 
+CONCAT_TOK : 'concat';
+BVNOT_TOK : 'bvnot';
+BVAND_TOK : 'bvand';
+BVOR_TOK : 'bvor';
+BVNEG_TOK : 'bvneg';
+BVADD_TOK : 'bvadd';
+BVMUL_TOK : 'bvmul';
+BVUDIV_TOK : 'bvudiv';
+BVUREM_TOK : 'bvurem';
+BVSHL_TOK : 'bvshl';
+BVLSHR_TOK : 'bvlshr';
+BVULT_TOK : 'bvult';
+BVNAND_TOK : 'bvnand';
+BVNOR_TOK : 'bvnor';
+BVXOR_TOK : 'bvxor';
+BVXNOR_TOK : 'bvxnor';
+BVCOMP_TOK : 'bvcomp';
+BVSUB_TOK : 'bvsub';
+BVSDIV_TOK : 'bvsdiv';
+BVSREM_TOK : 'bvsrem';
+BVSMOD_TOK : 'bvsmod';
+BVASHR_TOK : 'bvashr';
+BVULE_TOK : 'bvule';
+BVUGT_TOK : 'bvugt';
+BVUGE_TOK : 'bvuge';
+BVSLT_TOK : 'bvslt';
+BVSLE_TOK : 'bvsle';
+BVSGT_TOK : 'bvsgt';
+BVSGE_TOK : 'bvsge';
+
 /**
  * Matches a symbol from the input. A symbol is a "simple" symbol or a
  * sequence of printable ASCII characters that starts and ends with | and
@@ -651,10 +789,12 @@ KEYWORD
 
 /** Matches a "simple" symbol: a non-empty sequence of letters, digits and
  * the characters + - / * = % ? ! . $ ~ & ^ < > @ that does not start with a
- * digit.
+ * digit, and is not the special reserved symbol '_'.
  */
 fragment SIMPLE_SYMBOL
-  : (ALPHA | SYMBOL_CHAR) (ALPHA | DIGIT | SYMBOL_CHAR)*
+  : (ALPHA | SYMBOL_CHAR) (ALPHA | DIGIT | SYMBOL_CHAR)+
+  | ALPHA
+  | SYMBOL_CHAR_NOUNDERSCORE
   ;
 
 /**
@@ -703,14 +843,14 @@ DECIMAL_LITERAL
 /**
  * Matches a hexadecimal constant.
  */
- HEX_LITERAL
+HEX_LITERAL
   : '#x' HEX_DIGIT+
   ;
 
 /**
  * Matches a binary constant.
  */
- BINARY_LITERAL
+BINARY_LITERAL
   : '#b' ('0' | '1')+
   ;
 
@@ -730,7 +870,6 @@ COMMENT
   : ';' (~('\n' | '\r'))* { SKIP(); }
   ;
 
-
 /**
  * Matches any letter ('a'-'z' and 'A'-'Z').
  */
@@ -750,11 +889,15 @@ fragment HEX_DIGIT : DIGIT | 'a'..'f' | 'A'..'F';
 /**
  * Matches the characters that may appear in a "symbol" (i.e., an identifier)
  */
-fragment SYMBOL_CHAR
-  : '+' | '-' | '/' | '*' | '=' | '%' | '?' | '!' | '.' | '$' | '_' | '~'
+fragment SYMBOL_CHAR_NOUNDERSCORE
+  : '+' | '-' | '/' | '*' | '=' | '%' | '?' | '!' | '.' | '$' | '~'
   | '&' | '^' | '<' | '>' | '@'
   ;
 
+fragment SYMBOL_CHAR
+  : SYMBOL_CHAR_NOUNDERSCORE | '_'
+  ;
+
 /**
  * Matches an allowed escaped character.
  */
index e41e0e26a7e1126c8c73732defd2ef295b802e7b..03b901164e41cfcd441bc663ab28d3d18f22a42d 100644 (file)
@@ -82,6 +82,9 @@ void Smt2::addTheory(Theory theory) {
     addArithmeticOperators();
     break;
 
+  case THEORY_BITVECTORS:
+    break;
+
   default:
     Unhandled(theory);
   }
@@ -134,6 +137,10 @@ void Smt2::setLogic(const std::string& name) {
     addOperator(kind::APPLY_UF);
     break;
 
+  case Smt::QF_BV:
+    addTheory(THEORY_BITVECTORS);
+    break;
+
   case Smt::AUFLIA:
   case Smt::AUFLIRA:
   case Smt::AUFNIRA:
@@ -141,7 +148,6 @@ void Smt2::setLogic(const std::string& name) {
   case Smt::UFNIA:
   case Smt::QF_AUFBV:
   case Smt::QF_AUFLIA:
-  case Smt::QF_BV:
     Unhandled(name);
   }
 }
index 5aff8ebba7b71d88bdf1aa6c5f88b7fb844b9a7c..1e36b211d058fc6340b73f264e3bf9b8cc2cb9c3 100644 (file)
@@ -176,6 +176,9 @@ void Smt2Printer::toStream(std::ostream& out, TNode n,
     } else {
       out << "(...)";
     }
+    if(n.getNumChildren() > 0) {
+      out << ' ';
+    }
   }
   for(TNode::iterator i = n.begin(),
         iend = n.end();
index b320d9584c50f3f33de8f49ec58ebd438b402a82..3e844ef79b5bbc4ca100e331a5fa28a9d48ed068 100644 (file)
@@ -3,7 +3,7 @@ AM_CPPFLAGS = \
        -D __STDC_LIMIT_MACROS \
        -D __STDC_FORMAT_MACROS \                       
        -I@srcdir@/ -I@srcdir@/../.. -I@builddir@/../.. -I@srcdir@/../../include
-AM_CXXFLAGS = -Wall -Wno-parentheses -Wno-unknown-pragmas $(FLAG_VISIBILITY_HIDDEN) -DNDEBUG
+AM_CXXFLAGS = -Wall -Wno-parentheses -Wno-unknown-pragmas $(FLAG_VISIBILITY_HIDDEN)
 
 noinst_LTLIBRARIES = libminisat.la
 libminisat_la_SOURCES = \
index cc81ea5c64f34a20c65631d0fc0ef15077b9d7c1..88df366e2526633967a54edebca333035ff91065 100644 (file)
@@ -53,12 +53,13 @@ class CnfStream;
 /** Type of the SAT variables */
 typedef Minisat::Var SatVariable;
 
-/** Type of the Sat literals */
+/** Type of the SAT literals */
 typedef Minisat::Lit SatLiteral;
 
 /** Type of the SAT clauses */
 typedef Minisat::vec<SatLiteral> SatClause;
 
+/** Type of a SAT variable assignment (T, F, unknown) */
 typedef Minisat::lbool SatLiteralValue;
 
 /**
index dfa81cb3fae923981f4d35029804f6332899b8f0..4b40e582cd9c855341530f96c0c58521b4a2cdef 100644 (file)
@@ -55,8 +55,8 @@ using namespace CVC4::theory::arith;
 struct SlackAttrID;
 typedef expr::Attribute<SlackAttrID, Node> Slack;
 
-TheoryArith::TheoryArith(context::Context* c, OutputChannel& out) :
-  Theory(THEORY_ARITH, c, out),
+TheoryArith::TheoryArith(context::Context* c, OutputChannel& out, Valuation valuation) :
+  Theory(THEORY_ARITH, c, out, valuation),
   d_partialModel(c),
   d_userVariables(),
   d_diseq(c),
@@ -497,7 +497,7 @@ void TheoryArith::propagate(Effort e) {
   }
 }
 
-Node TheoryArith::getValue(TNode n, Valuation* valuation) {
+Node TheoryArith::getValue(TNode n) {
   NodeManager* nodeManager = NodeManager::currentNM();
 
   switch(n.getKind()) {
@@ -508,7 +508,7 @@ Node TheoryArith::getValue(TNode n, Valuation* valuation) {
       Node eq = d_removedRows.find(var)->second;
       Assert(n == eq[0]);
       Node rhs = eq[1];
-      return getValue(rhs, valuation);
+      return getValue(rhs);
     }
 
     DeltaRational drat = d_partialModel.getAssignment(var);
@@ -521,7 +521,7 @@ Node TheoryArith::getValue(TNode n, Valuation* valuation) {
 
   case kind::EQUAL: // 2 args
     return nodeManager->
-      mkConst( valuation->getValue(n[0]) == valuation->getValue(n[1]) );
+      mkConst( d_valuation.getValue(n[0]) == d_valuation.getValue(n[1]) );
 
   case kind::PLUS: { // 2+ args
     Rational value(0);
@@ -529,7 +529,7 @@ Node TheoryArith::getValue(TNode n, Valuation* valuation) {
             iend = n.end();
           i != iend;
           ++i) {
-      value += valuation->getValue(*i).getConst<Rational>();
+      value += d_valuation.getValue(*i).getConst<Rational>();
     }
     return nodeManager->mkConst(value);
   }
@@ -540,7 +540,7 @@ Node TheoryArith::getValue(TNode n, Valuation* valuation) {
             iend = n.end();
           i != iend;
           ++i) {
-      value *= valuation->getValue(*i).getConst<Rational>();
+      value *= d_valuation.getValue(*i).getConst<Rational>();
     }
     return nodeManager->mkConst(value);
   }
@@ -554,24 +554,24 @@ Node TheoryArith::getValue(TNode n, Valuation* valuation) {
     Unreachable();
 
   case kind::DIVISION: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<Rational>() /
-                                 valuation->getValue(n[1]).getConst<Rational>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<Rational>() /
+                                 d_valuation.getValue(n[1]).getConst<Rational>() );
 
   case kind::LT: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<Rational>() <
-                                 valuation->getValue(n[1]).getConst<Rational>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<Rational>() <
+                                 d_valuation.getValue(n[1]).getConst<Rational>() );
 
   case kind::LEQ: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<Rational>() <=
-                                 valuation->getValue(n[1]).getConst<Rational>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<Rational>() <=
+                                 d_valuation.getValue(n[1]).getConst<Rational>() );
 
   case kind::GT: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<Rational>() >
-                                 valuation->getValue(n[1]).getConst<Rational>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<Rational>() >
+                                 d_valuation.getValue(n[1]).getConst<Rational>() );
 
   case kind::GEQ: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<Rational>() >=
-                                 valuation->getValue(n[1]).getConst<Rational>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<Rational>() >=
+                                 d_valuation.getValue(n[1]).getConst<Rational>() );
 
   default:
     Unhandled(n.getKind());
index 07ba08e9c22f6894879c07e568c48b55d2480069..11cbfb4256bf676fb54e1a4bf3a63136b488cc5d 100644 (file)
@@ -144,7 +144,7 @@ private:
   SimplexDecisionProcedure d_simplex;
 
 public:
-  TheoryArith(context::Context* c, OutputChannel& out);
+  TheoryArith(context::Context* c, OutputChannel& out, Valuation valuation);
   ~TheoryArith();
 
   /**
@@ -161,7 +161,7 @@ public:
 
   void notifyEq(TNode lhs, TNode rhs);
 
-  Node getValue(TNode n, Valuation* valuation);
+  Node getValue(TNode n);
 
   void shutdown(){ }
 
index d45320266948126c1bd03e9064ed2ca135011f44..8b625613a81a02c4c42869835f6d242d56418248 100644 (file)
@@ -30,8 +30,8 @@ using namespace CVC4::theory;
 using namespace CVC4::theory::arrays;
 
 
-TheoryArrays::TheoryArrays(Context* c, OutputChannel& out) :
-  Theory(THEORY_ARRAY, c, out)
+TheoryArrays::TheoryArrays(Context* c, OutputChannel& out, Valuation valuation) :
+  Theory(THEORY_ARRAY, c, out, valuation)
 {
 }
 
@@ -60,7 +60,7 @@ void TheoryArrays::check(Effort e) {
   Debug("arrays") << "TheoryArrays::check(): done" << endl;
 }
 
-Node TheoryArrays::getValue(TNode n, Valuation* valuation) {
+Node TheoryArrays::getValue(TNode n) {
   NodeManager* nodeManager = NodeManager::currentNM();
 
   switch(n.getKind()) {
@@ -70,7 +70,7 @@ Node TheoryArrays::getValue(TNode n, Valuation* valuation) {
 
   case kind::EQUAL: // 2 args
     return nodeManager->
-      mkConst( valuation->getValue(n[0]) == valuation->getValue(n[1]) );
+      mkConst( d_valuation.getValue(n[0]) == d_valuation.getValue(n[1]) );
 
   default:
     Unhandled(n.getKind());
index 5a63fd26c364a530692d1ea0536ce89ec6405d11..64fdd83035cf1751d72b7ba3284d1c6b4f922b3f 100644 (file)
@@ -31,7 +31,7 @@ namespace arrays {
 
 class TheoryArrays : public Theory {
 public:
-  TheoryArrays(context::Context* c, OutputChannel& out);
+  TheoryArrays(context::Context* c, OutputChannel& out, Valuation valuation);
   ~TheoryArrays();
   void preRegisterTerm(TNode n) { }
   void registerTerm(TNode n) { }
@@ -43,7 +43,7 @@ public:
   void check(Effort e);
   void propagate(Effort e) { }
   void explain(TNode n) { }
-  Node getValue(TNode n, Valuation* valuation);
+  Node getValue(TNode n);
   void shutdown() { }
   std::string identify() const { return std::string("TheoryArrays"); }
 };/* class TheoryArrays */
index 44f5d60a62f673536c9af9987836d84cb309ef7a..878b184782132aaab752a5cb2934eb0fcd8e0c28 100644 (file)
@@ -24,7 +24,7 @@ namespace CVC4 {
 namespace theory {
 namespace booleans {
 
-Node TheoryBool::getValue(TNode n, Valuation* valuation) {
+Node TheoryBool::getValue(TNode n) {
   NodeManager* nodeManager = NodeManager::currentNM();
 
   switch(n.getKind()) {
@@ -38,14 +38,14 @@ Node TheoryBool::getValue(TNode n, Valuation* valuation) {
     Unreachable();
 
   case kind::NOT: // 1 arg
-    return nodeManager->mkConst(! valuation->getValue(n[0]).getConst<bool>());
+    return nodeManager->mkConst(! d_valuation.getValue(n[0]).getConst<bool>());
 
   case kind::AND: { // 2+ args
     for(TNode::iterator i = n.begin(),
             iend = n.end();
           i != iend;
           ++i) {
-      if(! valuation->getValue(*i).getConst<bool>()) {
+      if(! d_valuation.getValue(*i).getConst<bool>()) {
         return nodeManager->mkConst(false);
       }
     }
@@ -53,19 +53,19 @@ Node TheoryBool::getValue(TNode n, Valuation* valuation) {
   }
 
   case kind::IFF: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<bool>() ==
-                                 valuation->getValue(n[1]).getConst<bool>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<bool>() ==
+                                 d_valuation.getValue(n[1]).getConst<bool>() );
 
   case kind::IMPLIES: // 2 args
-    return nodeManager->mkConst( (! valuation->getValue(n[0]).getConst<bool>()) ||
-                                 valuation->getValue(n[1]).getConst<bool>() );
+    return nodeManager->mkConst( (! d_valuation.getValue(n[0]).getConst<bool>()) ||
+                                 d_valuation.getValue(n[1]).getConst<bool>() );
 
   case kind::OR: { // 2+ args
     for(TNode::iterator i = n.begin(),
             iend = n.end();
           i != iend;
           ++i) {
-      if(valuation->getValue(*i).getConst<bool>()) {
+      if(d_valuation.getValue(*i).getConst<bool>()) {
         return nodeManager->mkConst(true);
       }
     }
@@ -73,16 +73,16 @@ Node TheoryBool::getValue(TNode n, Valuation* valuation) {
   }
 
   case kind::XOR: // 2 args
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<bool>() !=
-                                 valuation->getValue(n[1]).getConst<bool>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<bool>() !=
+                                 d_valuation.getValue(n[1]).getConst<bool>() );
 
   case kind::ITE: // 3 args
     // all ITEs should be gone except (bool,bool,bool) ones
     Assert( n[1].getType() == nodeManager->booleanType() &&
             n[2].getType() == nodeManager->booleanType() );
-    return nodeManager->mkConst( valuation->getValue(n[0]).getConst<bool>() ?
-                                 valuation->getValue(n[1]).getConst<bool>() :
-                                 valuation->getValue(n[2]).getConst<bool>() );
+    return nodeManager->mkConst( d_valuation.getValue(n[0]).getConst<bool>() ?
+                                 d_valuation.getValue(n[1]).getConst<bool>() :
+                                 d_valuation.getValue(n[2]).getConst<bool>() );
 
   default:
     Unhandled(n.getKind());
index 4120159df473c6ec9c924bcd1104b6f8e4924d19..dfcdd22b822c7383aeee760cc89546499387a89a 100644 (file)
@@ -30,8 +30,8 @@ namespace booleans {
 
 class TheoryBool : public Theory {
 public:
-  TheoryBool(context::Context* c, OutputChannel& out) :
-    Theory(THEORY_BOOL, c, out) {
+  TheoryBool(context::Context* c, OutputChannel& out, Valuation valuation) :
+    Theory(THEORY_BOOL, c, out, valuation) {
   }
 
   void preRegisterTerm(TNode n) {
@@ -43,7 +43,7 @@ public:
     Debug("bool") << "bool: end preRegisterTerm(" << n << ")" << std::endl;
   }
 
-  Node getValue(TNode n, Valuation* valuation);
+  Node getValue(TNode n);
 
   std::string identify() const { return std::string("TheoryBool"); }
 };
index a276fa0ce8b98e85d5fed38e968c2a4c2f5c12b3..1c779bd79a610b99be51f11db448b8bd8ffb4368 100644 (file)
@@ -26,7 +26,7 @@ namespace CVC4 {
 namespace theory {
 namespace builtin {
 
-Node TheoryBuiltin::getValue(TNode n, Valuation* valuation) {
+Node TheoryBuiltin::getValue(TNode n) {
   switch(n.getKind()) {
 
   case kind::VARIABLE:
@@ -39,7 +39,7 @@ Node TheoryBuiltin::getValue(TNode n, Valuation* valuation) {
     Assert(n[0].getKind() == kind::TUPLE &&
            n[1].getKind() == kind::TUPLE);
     return NodeManager::currentNM()->
-      mkConst( getValue(n[0], valuation) == getValue(n[1], valuation) );
+      mkConst( getValue(n[0]) == getValue(n[1]) );
   }
 
   case kind::TUPLE: { // 2+ args
@@ -48,7 +48,7 @@ Node TheoryBuiltin::getValue(TNode n, Valuation* valuation) {
           iend = n.end();
         i != iend;
         ++i) {
-      nb << valuation->getValue(*i);
+      nb << d_valuation.getValue(*i);
     }
     return Node(nb);
   }
index 5b981032612ba51411ab3732f1d1842b6f1e447a..4e62401ff7456cebcc61933d6c7ede8496c4c787 100644 (file)
@@ -29,9 +29,9 @@ namespace builtin {
 
 class TheoryBuiltin : public Theory {
 public:
-  TheoryBuiltin(context::Context* c, OutputChannel& out) :
-    Theory(THEORY_BUILTIN, c, out) {}
-  Node getValue(TNode n, Valuation* valuation);
+  TheoryBuiltin(context::Context* c, OutputChannel& out, Valuation valuation) :
+    Theory(THEORY_BUILTIN, c, out, valuation) {}
+  Node getValue(TNode n);
   std::string identify() const { return std::string("TheoryBuiltin"); }
 };/* class TheoryBuiltin */
 
index 258345ad81aef82e15c2f9d56f924ca0582d6bc9..e106f3b8401df7d41d3479233123d7f923204fcb 100644 (file)
@@ -155,7 +155,7 @@ bool TheoryBV::triggerEquality(size_t triggerId) {
   return true;
 }
 
-Node TheoryBV::getValue(TNode n, Valuation* valuation) {
+Node TheoryBV::getValue(TNode n) {
   NodeManager* nodeManager = NodeManager::currentNM();
 
   switch(n.getKind()) {
@@ -165,7 +165,7 @@ Node TheoryBV::getValue(TNode n, Valuation* valuation) {
 
   case kind::EQUAL: // 2 args
     return nodeManager->
-      mkConst( valuation->getValue(n[0]) == valuation->getValue(n[1]) );
+      mkConst( d_valuation.getValue(n[0]) == d_valuation.getValue(n[1]) );
 
   default:
     Unhandled(n.getKind());
index f2c2fa332d606b8a16dc1f47c2f6db7ea50dffe9..d65f0388ba81fde9c85324d81ef684201a379249 100644 (file)
@@ -103,8 +103,8 @@ private:
 
 public:
 
-  TheoryBV(context::Context* c, OutputChannel& out) :
-    Theory(THEORY_BV, c, out), d_eqEngine(*this, c, "theory::bv::EqualityEngine"), d_sliceManager(*this, c), d_assertions(c), d_disequalities(c) {
+  TheoryBV(context::Context* c, OutputChannel& out, Valuation valuation) :
+    Theory(THEORY_BV, c, out, valuation), d_eqEngine(*this, c, "theory::bv::EqualityEngine"), d_sliceManager(*this, c), d_assertions(c), d_disequalities(c) {
   }
 
   BvEqualityEngine& getEqualityEngine() {
@@ -123,7 +123,7 @@ public:
 
   void explain(TNode n);
 
-  Node getValue(TNode n, Valuation* valuation);
+  Node getValue(TNode n);
 
   std::string identify() const { return std::string("TheoryBV"); }
 };/* class TheoryBV */
index bdf1c8d516c06efe5b8654d0435e6c3128051b3a..7af5b44969b3321b24a3d90bc128f7a79fef16db 100644 (file)
@@ -28,7 +28,7 @@ namespace CVC4 {
 namespace theory {
 namespace bv {
 
-class AllRewriteRules;
+struct AllRewriteRules;
 
 class TheoryBVRewriter {
 
index 620c70710d86024e7a2e553db6df7c3478fbaf57..72341869d1b80b656b88d0e84fa7f2f98b959032 100644 (file)
@@ -23,6 +23,7 @@
 
 #include "expr/node.h"
 #include "expr/attribute.h"
+#include "theory/valuation.h"
 #include "theory/output_channel.h"
 #include "context/context.h"
 #include "context/cdlist.h"
@@ -37,10 +38,11 @@ namespace CVC4 {
 class TheoryEngine;
 
 namespace theory {
-  class Valuation;
-}/* CVC4::theory namespace */
 
-namespace theory {
+/** Tag for the "newFact()-has-been-called-in-this-context" flag on Nodes */
+struct AssertedAttrTag {};
+/** The "newFact()-has-been-called-in-this-context" flag on Nodes */
+typedef CVC4::expr::CDAttribute<AssertedAttrTag, bool> Asserted;
 
 /**
  * Base class for T-solvers.  Abstract DPLL(T).
@@ -88,16 +90,15 @@ protected:
   /**
    * Construct a Theory.
    */
-  Theory(TheoryId id, context::Context* ctxt, OutputChannel& out) throw() :
+  Theory(TheoryId id, context::Context* ctxt, OutputChannel& out, Valuation valuation) throw() :
     d_id(id),
     d_context(ctxt),
     d_facts(ctxt),
     d_factsHead(ctxt, 0),
-    d_out(&out) {
+    d_out(&out),
+    d_valuation(valuation) {
   }
 
-
-
   /**
    * This is called at shutdown time by the TheoryEngine, just before
    * destruction.  It is important because there are destruction
@@ -114,10 +115,11 @@ protected:
    */
   OutputChannel* d_out;
 
-  /** Tag for the "preRegisterTerm()-has-been-called" flag on Nodes */
-  struct PreRegistered {};
-  /** The "preRegisterTerm()-has-been-called" flag on Nodes */
-  typedef CVC4::expr::Attribute<PreRegistered, bool> PreRegisteredAttr;
+  /**
+   * The valuation proxy for the Theory to communicate back with the
+   * theory engine (and other theories).
+   */
+  Valuation d_valuation;
 
   /**
    * Returns the next atom in the assertFact() queue.  Guarantees that
@@ -135,6 +137,26 @@ protected:
     return fact;
   }
 
+  /**
+   * Provides access to the facts queue, primarily intended for theory
+   * debugging purposes.
+   *
+   * @return the iterator to the beginning of the fact queue
+   */
+  context::CDList<Node>::const_iterator facts_begin() const {
+    return d_facts.begin();
+  }
+
+  /**
+   * Provides access to the facts queue, primarily intended for theory
+   * debugging purposes.
+   *
+   * @return the iterator to the end of the fact queue
+   */
+  context::CDList<Node>::const_iterator facts_end() const {
+    return d_facts.end();
+  }
+
 public:
 
   static inline TheoryId theoryOf(TypeNode typeNode) {
@@ -345,7 +367,7 @@ public:
    * and suspect this situation is the case, return Node::null()
    * rather than throwing an exception.
    */
-  virtual Node getValue(TNode n, Valuation* valuation) {
+  virtual Node getValue(TNode n) {
     Unimplemented("Theory %s doesn't support Theory::getValue interface",
                   identify().c_str());
     return Node::null();
index f8eece3df0a068d63cae4881f855b1dbbee18e4d..2411956f568ac13fa0e16baf40a967149025bddd 100644 (file)
@@ -36,18 +36,18 @@ using namespace CVC4::theory;
 
 namespace CVC4 {
 
+namespace theory {
+
 /** Tag for the "registerTerm()-has-been-called" flag on Nodes */
-struct Registered {};
+struct RegisteredAttrTag {};
 /** The "registerTerm()-has-been-called" flag on Nodes */
-typedef CVC4::expr::CDAttribute<Registered, bool> RegisteredAttr;
-
-namespace theory {
+typedef CVC4::expr::CDAttribute<RegisteredAttrTag, bool> RegisteredAttr;
 
-struct PreRegisteredTag {};
-typedef expr::Attribute<PreRegisteredTag, bool> PreRegistered;
+struct PreRegisteredAttrTag {};
+typedef expr::Attribute<PreRegisteredAttrTag, bool> PreRegistered;
 
-struct IteRewriteTag {};
-typedef expr::Attribute<IteRewriteTag, Node> IteRewriteAttr;
+struct IteRewriteAttrTag {};
+typedef expr::Attribute<IteRewriteAttrTag, Node> IteRewriteAttr;
 
 }/* CVC4::theory namespace */
 
@@ -136,7 +136,6 @@ TheoryEngine::TheoryEngine(context::Context* ctxt, const Options& opts) :
   d_theoryRegistration(opts.theoryRegistration),
   d_hasShutDown(false),
   d_incomplete(ctxt, false),
-  d_valuation(this),
   d_opts(opts),
   d_statistics() {
 
@@ -347,7 +346,7 @@ Node TheoryEngine::getValue(TNode node) {
   }
 
   // otherwise ask the theory-in-charge
-  return theoryOf(node)->getValue(node, &d_valuation);
+  return theoryOf(node)->getValue(node);
 }/* TheoryEngine::getValue(TNode node) */
 
 bool TheoryEngine::presolve() {
index 7553b1f0cfdc1c83ff72c8c05d444bf3b23a6e5b..787323495a8223cf7205100d38dd4ccd4cfdb826 100644 (file)
@@ -150,12 +150,6 @@ class TheoryEngine {
    */
   context::CDO<bool> d_incomplete;
 
-  /**
-   * A "valuation proxy" for this TheoryEngine.  Used only in getValue()
-   * for decoupled Theory-to-TheoryEngine communication.
-   */
-  theory::Valuation d_valuation;
-
   /**
    * Replace ITE forms in a node.
    */
@@ -180,7 +174,7 @@ public:
    */
   template <class TheoryClass>
   void addTheory() {
-    TheoryClass* theory = new TheoryClass(d_context, d_theoryOut);
+    TheoryClass* theory = new TheoryClass(d_context, d_theoryOut, theory::Valuation(this));
     d_theoryTable[theory->getId()] = theory;
     d_sharedTermManager->registerTheory(static_cast<TheoryClass*>(theory));
 
@@ -258,6 +252,12 @@ public:
   inline void assertFact(TNode node) {
     Debug("theory") << "TheoryEngine::assertFact(" << node << ")" << std::endl;
 
+    // Mark it as asserted in this context
+    //
+    // [MGD] removed for now, this appears to have a nontrivial
+    // performance penalty
+    // node.setAttribute(theory::Asserted(), true);
+
     // Get the atom
     TNode atom = node.getKind() == kind::NOT ? node[0] : node;
 
index 5d4d44d0a9f290ed63c52ae2a0838bf81eee2936..e15467bff1bc45f06b38b41ee879b64cc9cb3abc 100644 (file)
@@ -31,8 +31,8 @@ using namespace CVC4::theory;
 using namespace CVC4::theory::uf;
 using namespace CVC4::theory::uf::morgan;
 
-TheoryUFMorgan::TheoryUFMorgan(Context* ctxt, OutputChannel& out) :
-  TheoryUF(ctxt, out),
+TheoryUFMorgan::TheoryUFMorgan(Context* ctxt, OutputChannel& out, Valuation valuation) :
+  TheoryUF(ctxt, out, valuation),
   d_assertions(ctxt),
   d_ccChannel(this),
   d_cc(ctxt, &d_ccChannel),
@@ -567,7 +567,7 @@ void TheoryUFMorgan::notifyRestart() {
   Debug("uf") << "uf: end notifyDecisionLevelZero()" << endl;
 }
 
-Node TheoryUFMorgan::getValue(TNode n, Valuation* valuation) {
+Node TheoryUFMorgan::getValue(TNode n) {
   NodeManager* nodeManager = NodeManager::currentNM();
 
   switch(n.getKind()) {
@@ -585,7 +585,7 @@ Node TheoryUFMorgan::getValue(TNode n, Valuation* valuation) {
 
   case kind::EQUAL: // 2 args
     return nodeManager->
-      mkConst( valuation->getValue(n[0]) == valuation->getValue(n[1]) );
+      mkConst( d_valuation.getValue(n[0]) == d_valuation.getValue(n[1]) );
 
   default:
     Unhandled(n.getKind());
index 47c860c9adc6cdef6687d6be39baf46f543c0f61..c2feef349084da90a58b5a3e8e990b56beca7a13 100644 (file)
@@ -132,7 +132,7 @@ private:
 public:
 
   /** Constructs a new instance of TheoryUF w.r.t. the provided context.*/
-  TheoryUFMorgan(context::Context* ctxt, OutputChannel& out);
+  TheoryUFMorgan(context::Context* ctxt, OutputChannel& out, Valuation valuation);
 
   /** Destructor for UF theory, cleans up memory and statistics. */
   ~TheoryUFMorgan();
@@ -214,7 +214,7 @@ public:
    * Overloads Node getValue(TNode n); from theory.h.
    * See theory/theory.h for more information about this method.
    */
-  Node getValue(TNode n, Valuation* valuation);
+  Node getValue(TNode n);
 
   std::string identify() const { return std::string("TheoryUFMorgan"); }
 
index be3d7ac69116188e271b91353488937c7cd6f4ff..9746b38ab1a1cbcbddd0b2f505720fcb53c9da10 100644 (file)
@@ -37,8 +37,8 @@ class TheoryUF : public Theory {
 public:
 
   /** Constructs a new instance of TheoryUF w.r.t. the provided context.*/
-  TheoryUF(context::Context* ctxt, OutputChannel& out)
-    : Theory(THEORY_UF, ctxt, out) {}
+  TheoryUF(context::Context* ctxt, OutputChannel& out, Valuation valuation)
+    : Theory(THEORY_UF, ctxt, out, valuation) { }
 
 };/* class TheoryUF */
 
index db0574d4fd94e854e81193282011b429622ad0c6..ef17044264fde1c06b00396a177f9a2f7fd49344 100644 (file)
@@ -27,8 +27,8 @@ using namespace CVC4::theory;
 using namespace CVC4::theory::uf;
 using namespace CVC4::theory::uf::tim;
 
-TheoryUFTim::TheoryUFTim(Context* c, OutputChannel& out) :
-  TheoryUF(c, out),
+TheoryUFTim::TheoryUFTim(Context* c, OutputChannel& out, Valuation valuation) :
+  TheoryUF(c, out, valuation),
   d_assertions(c),
   d_pending(c),
   d_currentPendingIdx(c,0),
index d07f49f037b4e560a7304d3b4cee54467ee9e722..70c60728f618427dcd0b77c2fcd1b0274b244fc5 100644 (file)
@@ -85,13 +85,11 @@ private:
 public:
 
   /** Constructs a new instance of TheoryUF w.r.t. the provided context.*/
-  TheoryUFTim(context::Context* c, OutputChannel& out);
+  TheoryUFTim(context::Context* c, OutputChannel& out, Valuation valuation);
 
   /** Destructor for the TheoryUF object. */
   ~TheoryUFTim();
 
-
-
   /**
    * Registers a previously unseen [in this context] node n.
    * For TheoryUF, this sets up and maintains invaraints about
@@ -150,7 +148,7 @@ public:
    * Overloads Node getValue(TNode n); from theory.h.
    * See theory/theory.h for more information about this method.
    */
-  Node getValue(TNode n, Valuation* valuation) {
+  Node getValue(TNode n) {
     Unimplemented("TheoryUFTim doesn't support model generation");
   }
 
index e370752b68bbb473611cbe1d78275cdf240949dd..98e1c8b861f2a92b3f4dca92e228a7ed8f8454ff 100644 (file)
@@ -2,15 +2,15 @@ SUBDIRS = unit system regress .
 
 MAKEFLAGS = -k
 
-.PHONY: units regress regress0 regress1 regress2 regress3
-units regress regress0 regress1 regress2 regress3:
+.PHONY: units systemtests regress regress0 regress1 regress2 regress3
+units systemtests regress regress0 regress1 regress2 regress3:
        @$(MAKE) check-pre; \
        for dir in $(SUBDIRS); do \
                test $$dir = . || (cd $$dir && $(MAKE) $(AM_MAKEFLAGS) $@); \
        done; \
        $(MAKE) check-local
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: test
 test: check
 
@@ -37,6 +37,9 @@ check-local:
        if test -s "unit/test-suite.log"; then :; else \
                echo "$${red}Unit tests did not run; maybe there were compilation problems ?$$std"; \
         fi; \
+       if test -s "system/test-suite.log"; then :; else \
+               echo "$${red}System tests did not run; maybe there were compilation problems ?$$std"; \
+        fi; \
        for dir in $(subdirs_to_check); do \
                log=$$dir/test-suite.log; \
                if test -s "$$log"; then \
index 3867ee860829c32eb982f987713dd461d83dc45f..37f474cfc53ff212c68c4f3979c158cdf61ee173 100644 (file)
@@ -12,13 +12,13 @@ regress3: regress0 regress1 regress2
 regress0 regress1 regress2 regress3:
        -cd $@ && $(MAKE) check
 
-# synonyms for "check"
+# synonyms for "checK" in this directory in this directory
 .PHONY: regress test
 regress test: check
 
 # no-ops here
-.PHONY: units
-units:
+.PHONY: units systemtests
+units systemtests:
 
 EXTRA_DIST = \
        run_regression \
index 37020d48e50c4ebc5db8cb7a50444b23daaebbcd..dbc49367831ccc900fb85067b487ebb3a08cf84a 100644 (file)
@@ -84,7 +84,6 @@ BUG_TESTS = \
        bug167.smt \
        bug168.smt \
        bug187.smt2 \
-       bug216.smt2 \
        bug220.smt2 \
        bug239.smt \
        buggy-ite.smt2
@@ -92,6 +91,7 @@ BUG_TESTS = \
 TESTS =        $(SMT_TESTS) $(SMT2_TESTS) $(CVC_TESTS) $(BUG_TESTS)
 
 EXTRA_DIST = $(TESTS) \
+       bug216.smt2 \
        bug216.smt2.expect
 
 if CVC4_BUILD_PROFILE_COMPETITION
@@ -104,7 +104,7 @@ endif
 EXTRA_DIST += \
        error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index aca076d9fdc6f153a4f7864afa000a992865e3ee..83078c177b0dd6da3ebebcc17c980db0b3776789 100644 (file)
@@ -23,7 +23,7 @@ EXTRA_DIST = $(TESTS)
 #EXTRA_DIST += \
 #      error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index e204a29b5ff1064cad9a1051fee4a858f7ceb1d5..19d45840357addbc72e103b7dd6ceee198871ed1 100644 (file)
@@ -41,7 +41,7 @@ TESTS =       \
        equality-00.smt \
        equality-01.smt \
        equality-02.smt \
-  equality-05.smt \
+       equality-05.smt \
        bv_eq_diamond10.smt \
        slice-01.smt \
        slice-02.smt \
@@ -67,13 +67,13 @@ TESTS =     \
        a78test0002.smt \
        a95test0002.smt \
        bitvec0.smt \
-       bitvec2.smt \
+       bitvec2.smt
+
+EXTRA_DIST = $(TESTS) \
        bitvec3.smt \
-       bitvec5.smt 
-                       
-EXTRA_DIST = $(TESTS)
+       bitvec5.smt
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index bc99f81af18bb96dda6ccccb7be01aa9dc904a0b..65a009aa2d5b12190d7b0717946e0457ad46ecaf 100644 (file)
@@ -21,7 +21,7 @@ TESTS =       $(SMT_TESTS) $(SMT2_TESTS) $(CVC_TESTS) $(BUG_TESTS)
 
 EXTRA_DIST = $(TESTS)
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index 88defc40bad4aada85de93e62ff1db88af943325..36de2ceb3ea5d838d59b7b572415f2c258c0d9ed 100644 (file)
@@ -35,7 +35,7 @@ EXTRA_DIST = $(TESTS)
 #EXTRA_DIST += \
 #      error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index ee365e79d450dc8fcf475cbcc4255fc218ff3412..223f2f9ee1a2f888283ae1a74337440b7fcda636 100644 (file)
@@ -9,14 +9,14 @@ MAKEFLAGS = -k
 
 # Regression tests for SMT inputs
 CVC_TESTS = \
-       test.00.cvc \
-       test.01.cvc
+       test.00.cvc
 
 TESTS =        $(SMT_TESTS) $(SMT2_TESTS) $(CVC_TESTS) $(BUG_TESTS)
 
-EXTRA_DIST = $(TESTS)
+EXTRA_DIST = $(TESTS) \
+       test.01.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index 2e05386e005f1ec9fa10fa9f343bcad720204d83..06f45bca2a405d46ed5e7c2fd48843d357455b5c 100644 (file)
@@ -41,7 +41,7 @@ EXTRA_DIST = $(TESTS)
 #EXTRA_DIST += \
 #      error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index 3ebd95257f0e19cd80bd07bf01bb968434538307..2f81b04eba91216ca94852a6460e59dd557d6ada 100644 (file)
@@ -27,7 +27,7 @@ BUG_TESTS =
 
 TESTS =        $(SMT_TESTS) $(SMT2_TESTS) $(CVC_TESTS) $(BUG_TESTS)
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress0 test
 regress regress0 test: check
 
index 10fe5f01a0bd50264a8706e0897761eb28e8e01c..d58debe828226325d061d3d1019690d2e1eda39d 100644 (file)
@@ -26,7 +26,7 @@ EXTRA_DIST = $(TESTS)
 #EXTRA_DIST += \
 #      error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress1 test
 regress regress1 test: check
 
index 4bdff93d1b530888f53c1eb00019f29906f265e4..e23579fc7b9b3e217ec9108f197a90fa5f36553d 100644 (file)
@@ -12,7 +12,7 @@ TESTS =       \
 
 EXTRA_DIST = $(TESTS)
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress1 test
 regress regress1 test: check
 
index 28a814274e705418258e2d2ef35f7d7d9869194e..77d9ef158a31889c45371e54f593356ecf61774a 100644 (file)
@@ -36,7 +36,7 @@ EXTRA_DIST = $(TESTS)
 #EXTRA_DIST += \
 #      error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress2 test
 regress regress2 test: check
 
index fca3c4ef825b3b71517dac7453cea010745c272b..ada9664d3226df2806a84930d7c00d9a38ebfeba 100644 (file)
@@ -25,7 +25,7 @@ EXTRA_DIST = $(TESTS)
 #EXTRA_DIST += \
 #      error.cvc
 
-# synonyms for "check"
+# synonyms for "checK" in this directory
 .PHONY: regress regress3 test
 regress regress3 test: check
 
index 954798e6c8d404ad16d8d7da15d1cae1ccf6ccbb..7e01923402bb10cfd19301dd43e6e8f1a80d172c 100644 (file)
@@ -1,5 +1,7 @@
 TESTS_ENVIRONMENT =
-TESTS =
+TESTS = \
+       boilerplate \
+       ouroborous
 
 # Things that aren't tests but that tests rely on and need to
 # go into the distribution
@@ -28,20 +30,43 @@ else
 system_LINK = $(CXXLINK)
 endif
 
+AM_CPPFLAGS = \
+       -I. \
+       "-I@top_srcdir@/src/include" \
+       "-I@top_srcdir@/lib" \
+       "-I@top_srcdir@/src" \
+       "-I@top_builddir@/src" \
+       "-I@top_srcdir@/src/prop/minisat" \
+       -D __STDC_LIMIT_MACROS \
+       -D __STDC_FORMAT_MACROS \
+       $(TEST_CPPFLAGS)
+LIBADD = \
+       @abs_top_builddir@/src/parser/libcvc4parser.la \
+       @abs_top_builddir@/src/libcvc4.la
+
 # WHEN SYSTEM TESTS ARE ADDED, BUILD LIKE THIS:
-# system_test: system_test.cpp
-#      $(AM_V_CXX)$(LTCXXCOMPILE) $(AM_CXXFLAGS) -c -o $@.lo $<
-#      $(AM_V_CXXLD)$(system_LINK) $(AM_LDFLAGS) $@.lo
+$(TESTS:%=%.lo): %.lo: %.cpp
+       $(AM_V_CXX)$(LTCXXCOMPILE) $(AM_CXXFLAGS) -c -o $@ $+
+$(TESTS): %: %.lo $(LIBADD)
+       $(AM_V_CXXLD)$(system_LINK) $(LIBADD) $(AM_LDFLAGS) $<
+
+# trick automake into setting LTCXXCOMPILE, CXXLINK, etc.
+if CVC4_FALSE
+noinst_LTLIBRARIES = libdummy.la
+nodist_libdummy_la_SOURCES = ouroborous.cpp
+libdummy_la_LIBADD = @abs_top_builddir@/src/libcvc4.la
+endif
 
 # rebuild tests if a library changes
-$(TESTS):: $(TEST_DEPS)
+#$(TESTS):: $(TEST_DEPS)
 
+MAKEFLAGS = -k
 export VERBOSE = 1
 
-# synonyms for "check"
-.PHONY: test
-test: check
+# synonyms for "checK" in this directory in this directory
+.PHONY: test systemtests
+test systemtests: check
 
 # no-ops here
-.PHONY: units regress regress0 regress1 regress2 regress3s
+.PHONY: units regress regress0 regress1 regress2 regress3
 units regress regress0 regress1 regress2 regress3:
diff --git a/test/system/boilerplate.cpp b/test/system/boilerplate.cpp
new file mode 100644 (file)
index 0000000..89d5174
--- /dev/null
@@ -0,0 +1,38 @@
+/*********************                                                        */
+/*! \file boilerplate.cpp
+ ** \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, 2011  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 A simple start-up/tear-down test for CVC4.
+ **
+ ** This simple test just makes sure that the public interface is
+ ** minimally functional.  It is useful as a template to use for other
+ ** system tests.
+ **/
+
+#include <iostream>
+#include <sstream>
+
+#include "expr/expr.h"
+#include "smt/smt_engine.h"
+
+using namespace CVC4;
+using namespace std;
+
+int main() {
+  ExprManager em;
+  Options opts;
+  SmtEngine smt(&em, opts);
+  Result r = smt.query(em.mkConst(true));
+
+  return r == Result::VALID ? 0 : 1;
+}
+
diff --git a/test/system/ouroborous.cpp b/test/system/ouroborous.cpp
new file mode 100644 (file)
index 0000000..4473b42
--- /dev/null
@@ -0,0 +1,103 @@
+/*********************                                                        */
+/*! \file ouroborous.cpp
+ ** \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, 2011  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 "Ouroborous" test: does CVC4 read its own output?
+ **
+ ** The "Ouroborous" test, named after the serpent that swallows its own
+ ** tail, ensures that CVC4 can parse some input, output it again (in any
+ ** of its languages) and then parse it again.  The result of the first
+ ** parse must be equal to the result of the second parse (up to renaming
+ ** variables), or the test fails.
+ **/
+
+#include <iostream>
+#include <sstream>
+#include <string>
+
+#include "expr/expr.h"
+#include "expr/command.h"
+#include "parser/parser.h"
+#include "parser/parser_builder.h"
+
+using namespace CVC4;
+using namespace CVC4::parser;
+using namespace CVC4::language;
+using namespace std;
+
+const string declarations = "\
+(declare-sort U 0)\n\
+(declare-fun f (U) U)\n\
+(declare-fun x () U)\n\
+(declare-fun y () U)\n\
+(assert (= (f x) x))\n\
+";
+
+int runTest();
+
+int main() {
+  try {
+    return runTest();
+  } catch(Exception& e) {
+    cerr << e << endl;
+  } catch(...) {
+    cerr << "non-cvc4 exception thrown." << endl;
+  }
+  return 1;
+}
+
+string translate(Parser* parser, string in, InputLanguage inlang, OutputLanguage outlang) {
+  cout << "==============================================" << endl
+       << "translating from " << inlang << " to " << outlang << " this string:" << endl
+       << in << endl;
+  parser->setInput(Input::newStringInput(inlang, in, "internal-buffer"));
+  stringstream ss;
+  ss << Expr::setlanguage(outlang) << parser->nextExpression();
+  AlwaysAssert(parser->nextExpression().isNull(), "next expr should be null");
+  AlwaysAssert(parser->done(), "parser should be done");
+  string s = ss.str();
+  cout << "got this:" << endl
+       << s << endl
+       << "==============================================" << endl;
+  return s;
+}
+
+int runTest() {
+  ExprManager em;
+  Parser* parser =
+    ParserBuilder(em, "internal-buffer")
+      .withStringInput(declarations)
+      .withInputLanguage(input::LANG_SMTLIB_V2)
+      .build();
+
+  // we don't need to execute them, but we DO need to parse them to
+  // get the declarations
+  while(Command* c = parser->nextCommand()) {
+    delete c;
+  }
+
+  AlwaysAssert(parser->done(), "parser should be done");
+
+  string instr = "(= (f (f y)) x)";
+  string smt2 = translate(parser, instr, input::LANG_SMTLIB_V2, output::LANG_SMTLIB_V2);
+  string smt1 = translate(parser, smt2, input::LANG_SMTLIB_V2, output::LANG_SMTLIB);
+  //string cvc = translate(parser, smt1, input::LANG_SMTLIB, output::LANG_CVC4);
+  //string out = translate(parser, cvc, input::LANG_CVC4, output::LANG_SMTLIB_V2);
+  string out = smt1;
+
+  AlwaysAssert(out == smt2, "differences in output");
+
+  delete parser;
+
+  return 0;
+}
+
index 725d4a4bbbd4caef4f85f677eef0ff27ae931372..eb70935e71baf20e577b0de3170ae5bfe09ecf25 100644 (file)
@@ -172,7 +172,7 @@ nodist_libdummy_la_SOURCES = expr/node_black.cpp
 libdummy_la_LIBADD = @abs_top_builddir@/src/libcvc4.la
 endif
 
-# synonyms for "check"
+# synonyms for "checK" in this directory in this directory
 .PHONY: units test
 units test: check
 
index a121029f3c94317178e357a3c015f1294ad3d607..3dbee87eb14505c4aaf52fd24b74aff906acc3e2 100644 (file)
@@ -26,6 +26,7 @@
 #include "expr/node_manager.h"
 #include "expr/attribute.h"
 #include "expr/node.h"
+#include "theory/theory.h"
 #include "theory/theory_engine.h"
 #include "theory/uf/theory_uf.h"
 #include "util/Assert.h"
@@ -108,17 +109,11 @@ public:
     //TS_ASSERT_LESS_THAN(theory::uf::ECAttr::s_id, lastId);
 
     lastId = attr::LastAttributeId<bool, false>::s_id;
-    TS_ASSERT_LESS_THAN(theory::Theory::PreRegisteredAttr::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag1::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag2::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag3::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag4::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag5::s_id, lastId);
-    TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id, TestFlag1::s_id);
-    TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id, TestFlag2::s_id);
-    TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id, TestFlag3::s_id);
-    TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id, TestFlag4::s_id);
-    TS_ASSERT_DIFFERS(theory::Theory::PreRegisteredAttr::s_id, TestFlag5::s_id);
     TS_ASSERT_DIFFERS(TestFlag1::s_id, TestFlag2::s_id);
     TS_ASSERT_DIFFERS(TestFlag1::s_id, TestFlag3::s_id);
     TS_ASSERT_DIFFERS(TestFlag1::s_id, TestFlag4::s_id);
@@ -131,12 +126,15 @@ public:
     TS_ASSERT_DIFFERS(TestFlag4::s_id, TestFlag5::s_id);
 
     lastId = attr::LastAttributeId<bool, true>::s_id;
-//    TS_ASSERT_LESS_THAN(TheoryEngine::RegisteredAttr::s_id, lastId);
+    TS_ASSERT_LESS_THAN(theory::Asserted::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag1cd::s_id, lastId);
     TS_ASSERT_LESS_THAN(TestFlag2cd::s_id, lastId);
-//    TS_ASSERT_DIFFERS(TheoryEngine::RegisteredAttr::s_id, TestFlag1cd::s_id);
-//    TS_ASSERT_DIFFERS(TheoryEngine::RegisteredAttr::s_id, TestFlag2cd::s_id);
+    TS_ASSERT_DIFFERS(theory::Asserted::s_id, TestFlag1cd::s_id);
+    TS_ASSERT_DIFFERS(theory::Asserted::s_id, TestFlag2cd::s_id);
     TS_ASSERT_DIFFERS(TestFlag1cd::s_id, TestFlag2cd::s_id);
+    cout << "A: " << theory::Asserted::s_id << endl;
+    cout << "1: " << TestFlag1cd::s_id << endl;
+    cout << "2: " << TestFlag2cd::s_id << endl;
 
     lastId = attr::LastAttributeId<Node, false>::s_id;
 //    TS_ASSERT_LESS_THAN(theory::PreRewriteCache::s_id, lastId);
@@ -156,27 +154,27 @@ public:
   }
 
   void testCDAttributes() {
-    //Debug.on("boolattr");
+    //Debug.on("cdboolattr");
 
     Node a = d_nm->mkVar(*d_booleanType);
     Node b = d_nm->mkVar(*d_booleanType);
     Node c = d_nm->mkVar(*d_booleanType);
 
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(! b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
     d_ctxt->push(); // level 1
 
     // test that all boolean flags are FALSE to start
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(! b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
     // test that they all HAVE the boolean attributes
@@ -186,96 +184,96 @@ public:
 
     // test two-arg version of hasAttribute()
     bool bb = false;
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(a.getAttribute(TestFlag1cd(), bb));
     TS_ASSERT(! bb);
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(b.getAttribute(TestFlag1cd(), bb));
     TS_ASSERT(! bb);
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdboolattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(c.getAttribute(TestFlag1cd(), bb));
     TS_ASSERT(! bb);
 
     // setting boolean flags
-    Debug("boolattr", "set flag 1 on a to T\n");
+    Debug("cdboolattr", "set flag 1 on a to T\n");
     a.setAttribute(TestFlag1cd(), true);
-    Debug("boolattr", "set flag 1 on b to F\n");
+    Debug("cdboolattr", "set flag 1 on b to F\n");
     b.setAttribute(TestFlag1cd(), false);
-    Debug("boolattr", "set flag 1 on c to F\n");
+    Debug("cdboolattr", "set flag 1 on c to F\n");
     c.setAttribute(TestFlag1cd(), false);
 
-    Debug("boolattr", "get flag 1 on a (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be T)\n");
     TS_ASSERT(a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(! b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
     d_ctxt->push(); // level 2
 
-    Debug("boolattr", "get flag 1 on a (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be T)\n");
     TS_ASSERT(a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(! b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
-    Debug("boolattr", "set flag 1 on a to F\n");
+    Debug("cdbootattr", "set flag 1 on a to F\n");
     a.setAttribute(TestFlag1cd(), false);
-    Debug("boolattr", "set flag 1 on b to T\n");
+    Debug("cdbootattr", "set flag 1 on b to T\n");
     b.setAttribute(TestFlag1cd(), true);
 
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be T)\n");
     TS_ASSERT(b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
     d_ctxt->push(); // level 3
 
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be T)\n");
     TS_ASSERT(b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
-    Debug("boolattr", "set flag 1 on c to T\n");
+    Debug("cdbootattr", "set flag 1 on c to T\n");
     c.setAttribute(TestFlag1cd(), true);
 
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be T)\n");
     TS_ASSERT(b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be T)\n");
     TS_ASSERT(c.getAttribute(TestFlag1cd()));
 
     d_ctxt->pop(); // level 2
 
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be T)\n");
     TS_ASSERT(b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
     d_ctxt->pop(); // level 1
 
-    Debug("boolattr", "get flag 1 on a (should be T)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be T)\n");
     TS_ASSERT(a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(! b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
     d_ctxt->pop(); // level 0
 
-    Debug("boolattr", "get flag 1 on a (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on a (should be F)\n");
     TS_ASSERT(! a.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on b (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on b (should be F)\n");
     TS_ASSERT(! b.getAttribute(TestFlag1cd()));
-    Debug("boolattr", "get flag 1 on c (should be F)\n");
+    Debug("cdbootattr", "get flag 1 on c (should be F)\n");
     TS_ASSERT(! c.getAttribute(TestFlag1cd()));
 
 #ifdef CVC4_ASSERTIONS
@@ -284,7 +282,7 @@ public:
   }
 
   void testAttributes() {
-    //Debug.on("boolattr");
+    //Debug.on("bootattr");
 
     Node a = d_nm->mkVar(*d_booleanType);
     Node b = d_nm->mkVar(*d_booleanType);
index 4aee8060fea6c7deeeb72ed1278becd52ee281f2..9de8f94b40265183d151089eaf0701fb41a977b7 100644 (file)
@@ -96,7 +96,7 @@ public:
     d_nm = new NodeManager(d_ctxt);
     d_scope = new NodeManagerScope(d_nm);
     d_outputChannel.clear();
-    d_arith = new TheoryArith(d_ctxt, d_outputChannel);
+    d_arith = new TheoryArith(d_ctxt, d_outputChannel, Valuation(NULL));
 
     preregistered = new std::set<Node>();
 
index 18408acd3a1b4c1bd37f8f0c71340c68bafc0e58..a362a597c1795532aa3724350bbf3f83625d0f39 100644 (file)
@@ -104,8 +104,8 @@ public:
   set<Node> d_registered;
   vector<Node> d_getSequence;
 
-  DummyTheory(Context* ctxt, OutputChannel& out) :
-    Theory(theory::THEORY_BUILTIN, ctxt, out) {
+  DummyTheory(Context* ctxt, OutputChannel& out, Valuation valuation) :
+    Theory(theory::THEORY_BUILTIN, ctxt, out, valuation) {
   }
 
   void registerTerm(TNode n) {
@@ -142,7 +142,7 @@ public:
   void preRegisterTerm(TNode n) {}
   void propagate(Effort level) {}
   void explain(TNode n, Effort level) {}
-  Node getValue(TNode n, Valuation* valuation) { return Node::null(); }
+  Node getValue(TNode n) { return Node::null(); }
   string identify() const { return "DummyTheory"; }
 };
 
@@ -165,7 +165,7 @@ public:
     d_ctxt = new Context;
     d_nm = new NodeManager(d_ctxt);
     d_scope = new NodeManagerScope(d_nm);
-    d_dummy = new DummyTheory(d_ctxt, d_outputChannel);
+    d_dummy = new DummyTheory(d_ctxt, d_outputChannel, Valuation(NULL));
     d_outputChannel.clear();
     atom0 = d_nm->mkConst(true);
     atom1 = d_nm->mkConst(false);
index 5915ac1f7624e4bdf3a02dfd27491c9f70778f34..f99698204c309a71490e9d56352e6d84dd18bbf4 100644 (file)
@@ -107,8 +107,8 @@ class FakeTheory : public Theory {
   // static std::deque<RewriteItem> s_expected;
 
 public:
-  FakeTheory(context::Context* ctxt, OutputChannel& out) :
-    Theory(theoryId, ctxt, out)
+  FakeTheory(context::Context* ctxt, OutputChannel& out, Valuation valuation) :
+    Theory(theoryId, ctxt, out, valuation)
   { }
 
   /** Register an expected rewrite call */
@@ -212,7 +212,7 @@ public:
   void check(Theory::Effort) { Unimplemented(); }
   void propagate(Theory::Effort) { Unimplemented(); }
   void explain(TNode, Theory::Effort) { Unimplemented(); }
-  Node getValue(TNode n, Valuation* valuation) { return Node::null(); }
+  Node getValue(TNode n) { return Node::null(); }
 };/* class FakeTheory */
 
 
index 19b289ae74f33b8c0784cbcde55799201b643a6a..1940bc199ca0230334018777b4021df4c391452c 100644 (file)
@@ -61,7 +61,7 @@ public:
     d_nm = new NodeManager(d_ctxt);
     d_scope = new NodeManagerScope(d_nm);
     d_outputChannel.clear();
-    d_euf = new TheoryUFTim(d_ctxt, d_outputChannel);
+    d_euf = new TheoryUFTim(d_ctxt, d_outputChannel, Valuation(NULL));
 
     d_booleanType = new TypeNode(d_nm->booleanType());
   }