The Tuesday Afternoon Catch-All Commit (TACAC):
authorMorgan Deters <mdeters@gmail.com>
Wed, 26 Sep 2012 03:07:01 +0000 (03:07 +0000)
committerMorgan Deters <mdeters@gmail.com>
Wed, 26 Sep 2012 03:07:01 +0000 (03:07 +0000)
* --early-exit and --no-early-exit command line options (the former is default for all builds except debug builds)

* New SEXPR kind for doing lists of things (we previously used TUPLEs for this purpose, but TUPLEs will be used in future by the datatypes theory, and so cannot have function symbols in them, etc.).

* SMT-LIB compliant output for (set-option :produce-unsat-cores true) and (get-unsat-core)

(this commit was certified error- and warning-free by the test-and-commit script.)

14 files changed:
src/expr/command.cpp
src/expr/expr_manager_template.cpp
src/expr/expr_manager_template.h
src/expr/mkmetakind
src/expr/node_manager.h
src/expr/type.cpp
src/expr/type.h
src/expr/type_node.cpp
src/expr/type_node.h
src/main/driver_unified.cpp
src/main/options
src/smt/options_handlers.h
src/theory/builtin/kinds
src/theory/builtin/theory_builtin_type_rules.h

index 8b61e92d3d5b2cd0f1e0863e6a2546b12231f378..99662cb99bbdd655b70b3858595ac6341f5cf458 100644 (file)
@@ -960,7 +960,7 @@ void GetUnsatCoreCommand::invoke(SmtEngine* smtEngine) throw() {
     d_commandStatus = new CommandFailure(e.what());
   }
   */
-  d_commandStatus = new CommandFailure("unsat cores not supported yet");
+  d_commandStatus = new CommandUnsupported();
 }
 
 void GetUnsatCoreCommand::printResult(std::ostream& out) const throw() {
index 5e1ec02217aa370a96fb54608ce5039976ffb6a9..516930bcda825dfd627884e9b2b1ac2df0b503d8 100644 (file)
@@ -507,7 +507,7 @@ FunctionType ExprManager::mkPredicateType(const std::vector<Type>& sorts) {
 
 TupleType ExprManager::mkTupleType(const std::vector<Type>& types) {
   NodeManagerScope nms(d_nodeManager);
-  Assert( types.size() >= 2 );
+  Assert( types.size() >= 1 );
   std::vector<TypeNode> typeNodes;
   for (unsigned i = 0, i_end = types.size(); i < i_end; ++ i) {
      typeNodes.push_back(*types[i].d_typeNode);
@@ -515,6 +515,15 @@ TupleType ExprManager::mkTupleType(const std::vector<Type>& types) {
   return TupleType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkTupleType(typeNodes))));
 }
 
+SExprType ExprManager::mkSExprType(const std::vector<Type>& types) {
+  NodeManagerScope nms(d_nodeManager);
+  std::vector<TypeNode> typeNodes;
+  for (unsigned i = 0, i_end = types.size(); i < i_end; ++ i) {
+     typeNodes.push_back(*types[i].d_typeNode);
+  }
+  return SExprType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkSExprType(typeNodes))));
+}
+
 BitVectorType ExprManager::mkBitVectorType(unsigned size) const {
   NodeManagerScope nms(d_nodeManager);
   return BitVectorType(Type(d_nodeManager, new TypeNode(d_nodeManager->mkBitVectorType(size))));
index e20edfb42eb268f1e2bd7321024590e15ca1c5ac..460e3f1dc1f39e5e0a73339b40724760cba5589a 100644 (file)
@@ -345,10 +345,17 @@ public:
   /**
    * Make a tuple type with types from
    * <code>types[0..types.size()-1]</code>.  <code>types</code> must
-   * have at least 2 elements.
+   * have at least one element.
    */
   TupleType mkTupleType(const std::vector<Type>& types);
 
+  /**
+   * Make a symbolic expressiontype with types from
+   * <code>types[0..types.size()-1]</code>.  <code>types</code> may
+   * have any number of elements.
+   */
+  SExprType mkSExprType(const std::vector<Type>& types);
+
   /** Make a type representing a bit-vector of the given size. */
   BitVectorType mkBitVectorType(unsigned size) const;
 
index 647c1af8ed88c3491883dc6cdd0d1ae79f5e63d6..4582bfeda8f75b016fe3f9a2b95a3b3e56008de2 100755 (executable)
@@ -302,11 +302,6 @@ function register_metakind {
     exit 1
   fi
 
-  if [ $mk = OPERATOR -a $lb = 0 ]; then
-    echo "$kf:$lineno: error in range \`$nc' for \`$k': $mk-kinded kinds must always take at least one child" >&2
-    exit 1
-  fi
-
   metakind_lbchildren="${metakind_lbchildren}
     $lb, /* $k */"
   metakind_ubchildren="${metakind_ubchildren}
index 4a05b174df7ea7178d49348f6f3a51cb8f33401c..8e61415e8722d6baaac55cc321402669ed6bbb4f 100644 (file)
@@ -711,14 +711,24 @@ public:
 
   /**
    * Make a tuple type with types from
-   * <code>types</code>. <code>types</code> must have at least two
-   * elements.
+   * <code>types</code>. <code>types</code> must have at least one
+   * element.
    *
    * @param types a vector of types
    * @returns the tuple type (types[0], ..., types[n])
    */
   inline TypeNode mkTupleType(const std::vector<TypeNode>& types);
 
+  /**
+   * Make a symbolic expression type with types from
+   * <code>types</code>. <code>types</code> may have any number of
+   * elements.
+   *
+   * @param types a vector of types
+   * @returns the symbolic expression type (types[0], ..., types[n])
+   */
+  inline TypeNode mkSExprType(const std::vector<TypeNode>& types);
+
   /** Make the type of bitvectors of size <code>size</code> */
   inline TypeNode mkBitVectorType(unsigned size);
 
@@ -1060,6 +1070,14 @@ inline TypeNode NodeManager::mkTupleType(const std::vector<TypeNode>& types) {
   return mkTypeNode(kind::TUPLE_TYPE, typeNodes);
 }
 
+inline TypeNode NodeManager::mkSExprType(const std::vector<TypeNode>& types) {
+  std::vector<TypeNode> typeNodes;
+  for (unsigned i = 0; i < types.size(); ++ i) {
+    typeNodes.push_back(types[i]);
+  }
+  return mkTypeNode(kind::SEXPR_TYPE, typeNodes);
+}
+
 inline TypeNode NodeManager::mkBitVectorType(unsigned size) {
   return TypeNode(mkTypeConst<BitVectorSize>(BitVectorSize(size)));
 }
index b55d33dcf1dda2a045023334583b70b045eac719..5a00a538ceb51b78e293f0e10dcc70381ccabe2f 100644 (file)
@@ -347,6 +347,19 @@ Type::operator TupleType() const throw(AssertionException) {
   return TupleType(*this);
 }
 
+/** Is this a symbolic expression type? */
+bool Type::isSExpr() const {
+  NodeManagerScope nms(d_nodeManager);
+  return d_typeNode->isSExpr();
+}
+
+/** Cast to a symbolic expression type */
+Type::operator SExprType() const throw(AssertionException) {
+  NodeManagerScope nms(d_nodeManager);
+  Assert(isNull() || isSExpr());
+  return SExprType(*this);
+}
+
 /** Is this an array type? */
 bool Type::isArray() const {
   NodeManagerScope nms(d_nodeManager);
@@ -441,6 +454,18 @@ vector<Type> TupleType::getTypes() const {
   return types;
 }
 
+vector<Type> SExprType::getTypes() const {
+  NodeManagerScope nms(d_nodeManager);
+  vector<Type> types;
+  vector<TypeNode> typeNodes = d_typeNode->getSExprTypes();
+  vector<TypeNode>::iterator it = typeNodes.begin();
+  vector<TypeNode>::iterator it_end = typeNodes.end();
+  for(; it != it_end; ++ it) {
+    types.push_back(makeType(*it));
+  }
+  return types;
+}
+
 string SortType::getName() const {
   NodeManagerScope nms(d_nodeManager);
   return d_typeNode->getAttribute(expr::VarNameAttr());
@@ -533,6 +558,11 @@ TupleType::TupleType(const Type& t) throw(AssertionException) :
   Assert(isNull() || isTuple());
 }
 
+SExprType::SExprType(const Type& t) throw(AssertionException) :
+  Type(t) {
+  Assert(isNull() || isSExpr());
+}
+
 ArrayType::ArrayType(const Type& t) throw(AssertionException) :
   Type(t) {
   Assert(isNull() || isArray());
index 513a4d60a0b870a58c4971b1b6ff55db66b42255..caaf256f5e1bfcb614dfcefdb446157c20fbf24e 100644 (file)
@@ -57,6 +57,7 @@ class SelectorType;
 class TesterType;
 class FunctionType;
 class TupleType;
+class SExprType;
 class SortType;
 class SortConstructorType;
 class PredicateSubtype;
@@ -318,6 +319,18 @@ public:
    */
   operator TupleType() const throw(AssertionException);
 
+  /**
+   * Is this a symbolic expression type?
+   * @return true if the type is a symbolic expression type
+   */
+  bool isSExpr() const;
+
+  /**
+   * Cast this type to a symbolic expression type
+   * @return the SExprType
+   */
+  operator SExprType() const throw(AssertionException);
+
   /**
    * Is this an array type?
    * @return true if the type is a array type
@@ -513,6 +526,20 @@ public:
   std::vector<Type> getTypes() const;
 };/* class TupleType */
 
+/**
+ * Class encapsulating a tuple type.
+ */
+class CVC4_PUBLIC SExprType : public Type {
+
+public:
+
+  /** Construct from the base type */
+  SExprType(const Type& type = Type()) throw(AssertionException);
+
+  /** Get the constituent types */
+  std::vector<Type> getTypes() const;
+};/* class SExprType */
+
 /**
  * Class encapsulating an array type.
  */
index e35d55e285fcbe73e8de6c353c2154a09249a4bd..2676fd6b24ffbbfc2f55ff2c732e505f53238935 100644 (file)
@@ -144,7 +144,6 @@ std::vector<TypeNode> TypeNode::getParamTypes() const {
   return params;
 }
 
-/** Is this a tuple type? */
 vector<TypeNode> TypeNode::getTupleTypes() const {
   Assert(isTuple());
   vector<TypeNode> types;
@@ -154,6 +153,15 @@ vector<TypeNode> TypeNode::getTupleTypes() const {
   return types;
 }
 
+vector<TypeNode> TypeNode::getSExprTypes() const {
+  Assert(isSExpr());
+  vector<TypeNode> types;
+  for(unsigned i = 0, i_end = getNumChildren(); i < i_end; ++i) {
+    types.push_back((*this)[i]);
+  }
+  return types;
+}
+
 /** Is this an instantiated datatype type */
 bool TypeNode::isInstantiatedDatatype() const {
   if(getKind() == kind::DATATYPE_TYPE) {
index af073457520c0bb6a217ff1ff56424228634a0a2..a0397e0bd80f937f854e729b3b74dcc86c8eb558 100644 (file)
@@ -541,6 +541,12 @@ public:
   /** Get the constituent types of a tuple type */
   std::vector<TypeNode> getTupleTypes() const;
 
+  /** Is this a symbolic expression type? */
+  bool isSExpr() const;
+
+  /** Get the constituent types of a symbolic expression type */
+  std::vector<TypeNode> getSExprTypes() const;
+
   /** Is this a bit-vector type */
   bool isBitVector() const;
 
@@ -873,6 +879,12 @@ inline bool TypeNode::isTuple() const {
     ( isPredicateSubtype() && getSubtypeBaseType().isTuple() );
 }
 
+/** Is this a symbolic expression type? */
+inline bool TypeNode::isSExpr() const {
+  return getKind() == kind::SEXPR_TYPE ||
+    ( isPredicateSubtype() && getSubtypeBaseType().isSExpr() );
+}
+
 /** Is this a sort kind */
 inline bool TypeNode::isSort() const {
   return ( getKind() == kind::SORT_TYPE && !hasAttribute(expr::SortArityAttr()) ) ||
index 4ac137ef137bf699cc008b8d6fab86611af37871..20b4c2bc28144e9e42643081c94a2c011493b847 100644 (file)
@@ -314,5 +314,16 @@ int runCvc4(int argc, char* argv[], Options& opts) {
   if(opts[options::statistics]) {
     cmdExecutor.flushStatistics(*opts[options::err]);
   }
+
+#ifdef CVC4_DEBUG
+  if(opts[options::earlyExit] && opts.wasSetByUser(options::earlyExit)) {
+    _exit(returnValue);
+  }
+#else /* CVC4_DEBUG */
+  if(opts[options::earlyExit]) {
+    _exit(returnValue);
+  }
+#endif /* CVC4_DEBUG */
+
   return returnValue;
 }
index 47d8da59856de1cd28e7dae170c85005d201dd25..58ea5e54498dc91b32cfbf71967d22f3257b6a2d 100644 (file)
@@ -19,6 +19,9 @@ option - --show-debug-tags void :handler CVC4::main::showDebugTags :handler-incl
 option - --show-trace-tags void :handler CVC4::main::showTraceTags :handler-include "main/options_handlers.h"
  show all available tags for tracing
 
+expert-option earlyExit --early-exit bool :default true
+ do not run destructors at exit; default on except in debug mode
+
 # portfolio options
 option printWinner bool
  enable printing the winning thread (pcvc4 only)
index 4f214ddd15bcbb417e1d6a3fd0e1eefed8fb1788..7d5dd56c9dcdb205f00c71379c83aa6e5d929822 100644 (file)
@@ -288,7 +288,7 @@ inline void proofEnabledBuild(std::string option, bool value, SmtEngine* smt) th
 
 inline void unsatCoresEnabledBuild(std::string option, bool value, SmtEngine* smt) throw(OptionException) {
   if(value) {
-    throw OptionException("CVC4 does not yet have support for unsatisfiable cores");
+    throw UnrecognizedOptionException("CVC4 does not yet have support for unsatisfiable cores");
   }
 }
 
index 8eff22ed45d99d471dcbc4f356ff8ac0b0300744..86efac2f08e7ed47b852ef7728553c1a6fa6dcdb 100644 (file)
@@ -290,6 +290,7 @@ variable VARIABLE "variable"
 variable BOUND_VARIABLE "bound variable"
 variable SKOLEM "skolem var"
 operator TUPLE 1: "a tuple"
+operator SEXPR 0: "a symbolic expression"
 
 operator LAMBDA 2 "lambda"
 
@@ -313,6 +314,14 @@ well-founded TUPLE_TYPE \
     "::CVC4::theory::builtin::TupleProperties::isWellFounded(%TYPE%)" \
     "::CVC4::theory::builtin::TupleProperties::mkGroundTerm(%TYPE%)" \
     "theory/builtin/theory_builtin_type_rules.h"
+operator SEXPR_TYPE 0: "symbolic expression type"
+cardinality SEXPR_TYPE \
+    "::CVC4::theory::builtin::SExprProperties::computeCardinality(%TYPE%)" \
+    "theory/builtin/theory_builtin_type_rules.h"
+well-founded SEXPR_TYPE \
+    "::CVC4::theory::builtin::SExprProperties::isWellFounded(%TYPE%)" \
+    "::CVC4::theory::builtin::SExprProperties::mkGroundTerm(%TYPE%)" \
+    "theory/builtin/theory_builtin_type_rules.h"
 
 # These will eventually move to a theory of strings.
 #
@@ -335,6 +344,7 @@ typerule APPLY ::CVC4::theory::builtin::ApplyTypeRule
 typerule EQUAL ::CVC4::theory::builtin::EqualityTypeRule
 typerule DISTINCT ::CVC4::theory::builtin::DistinctTypeRule
 typerule TUPLE ::CVC4::theory::builtin::TupleTypeRule
+typerule SEXPR ::CVC4::theory::builtin::SExprTypeRule
 typerule LAMBDA ::CVC4::theory::builtin::LambdaTypeRule
 construle LAMBDA ::CVC4::theory::builtin::LambdaTypeRule
 typerule CHAIN ::CVC4::theory::builtin::ChainTypeRule
index 97af23f67a727e68782f6df17823d5af3dd5aafa..939c52f31174fdcfc20f07eea310cbe1ac4861ac 100644 (file)
@@ -117,7 +117,6 @@ public:
   }
 };/* class DistinctTypeRule */
 
-
 class TupleTypeRule {
 public:
   inline static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check) {
@@ -131,6 +130,19 @@ public:
   }
 };/* class TupleTypeRule */
 
+class SExprTypeRule {
+public:
+  inline static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check) {
+    std::vector<TypeNode> types;
+    for(TNode::iterator child_it = n.begin(), child_it_end = n.end();
+        child_it != child_it_end;
+        ++child_it) {
+      types.push_back((*child_it).getType(check));
+    }
+    return nodeManager->mkSExprType(types);
+  }
+};/* class SExprTypeRule */
+
 class UninterpretedConstantTypeRule {
 public:
   inline static TypeNode computeType(NodeManager* nodeManager, TNode n, bool check) {
@@ -300,6 +312,58 @@ public:
   }
 };/* class TupleProperties */
 
+class SExprProperties {
+public:
+  inline static Cardinality computeCardinality(TypeNode type) {
+    // Don't assert this; allow other theories to use this cardinality
+    // computation.
+    //
+    // Assert(type.getKind() == kind::SEXPR_TYPE);
+
+    Cardinality card(1);
+    for(TypeNode::iterator i = type.begin(),
+          i_end = type.end();
+        i != i_end;
+        ++i) {
+      card *= (*i).getCardinality();
+    }
+
+    return card;
+  }
+
+  inline static bool isWellFounded(TypeNode type) {
+    // Don't assert this; allow other theories to use this
+    // wellfoundedness computation.
+    //
+    // Assert(type.getKind() == kind::SEXPR_TYPE);
+
+    for(TypeNode::iterator i = type.begin(),
+          i_end = type.end();
+        i != i_end;
+        ++i) {
+      if(! (*i).isWellFounded()) {
+        return false;
+      }
+    }
+
+    return true;
+  }
+
+  inline static Node mkGroundTerm(TypeNode type) {
+    Assert(type.getKind() == kind::SEXPR_TYPE);
+
+    std::vector<Node> children;
+    for(TypeNode::iterator i = type.begin(),
+          i_end = type.end();
+        i != i_end;
+        ++i) {
+      children.push_back((*i).mkGroundTerm());
+    }
+
+    return NodeManager::currentNM()->mkNode(kind::SEXPR, children);
+  }
+};/* class SExprProperties */
+
 class SubtypeProperties {
 public: