Type enumerators take optional argument indicating fixed cardinalities of uninterpret...
authorajreynol <andrew.j.reynolds@gmail.com>
Fri, 15 Jan 2016 22:57:56 +0000 (23:57 +0100)
committerajreynol <andrew.j.reynolds@gmail.com>
Fri, 15 Jan 2016 22:57:56 +0000 (23:57 +0100)
15 files changed:
src/theory/arith/type_enumerator.h
src/theory/arrays/type_enumerator.h
src/theory/booleans/type_enumerator.h
src/theory/builtin/type_enumerator.h
src/theory/bv/type_enumerator.h
src/theory/datatypes/type_enumerator.cpp
src/theory/datatypes/type_enumerator.h
src/theory/mktheorytraits
src/theory/quantifiers/model_engine.cpp
src/theory/sets/theory_sets_type_enumerator.h
src/theory/strings/type_enumerator.h
src/theory/theory_model.cpp
src/theory/theory_model.h
src/theory/type_enumerator.h
src/theory/type_enumerator_template.cpp

index c4501fc43656d4a26d73e902edcb9e5d76a2a219..dc2b6f1156505e1323b211741d053544c119cf08 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -34,7 +34,7 @@ class RationalEnumerator : public TypeEnumeratorBase<RationalEnumerator> {
 
 public:
 
-  RationalEnumerator(TypeNode type) throw(AssertionException) :
+  RationalEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<RationalEnumerator>(type),
     d_rat(0) {
     Assert(type.getKind() == kind::TYPE_CONSTANT &&
@@ -81,7 +81,7 @@ class IntegerEnumerator : public TypeEnumeratorBase<IntegerEnumerator> {
 
 public:
 
-  IntegerEnumerator(TypeNode type) throw(AssertionException) :
+  IntegerEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<IntegerEnumerator>(type),
     d_int(0) {
     Assert(type.getKind() == kind::TYPE_CONSTANT &&
@@ -115,7 +115,7 @@ class SubrangeEnumerator : public TypeEnumeratorBase<SubrangeEnumerator> {
 
 public:
 
-  SubrangeEnumerator(TypeNode type) throw(AssertionException) :
+  SubrangeEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<SubrangeEnumerator>(type),
     d_int(0),
     d_bounds(type.getConst<SubrangeBounds>()),
index 2c6fc56abb45aff0cc903a8671d8a814d3836428..ace23eb82f19094bb1d177b95137c031e0a79828 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: Clark Barrett
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -29,6 +29,8 @@ namespace theory {
 namespace arrays {
 
 class ArrayEnumerator : public TypeEnumeratorBase<ArrayEnumerator> {
+  /** type properties */
+  TypeEnumeratorProperties * d_tep;
   TypeEnumerator d_index;
   TypeNode d_constituentType;
   NodeManager* d_nm;
@@ -39,9 +41,10 @@ class ArrayEnumerator : public TypeEnumeratorBase<ArrayEnumerator> {
 
 public:
 
-  ArrayEnumerator(TypeNode type) throw(AssertionException) :
+  ArrayEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<ArrayEnumerator>(type),
-    d_index(type.getArrayIndexType()),
+    d_tep(tep),
+    d_index(type.getArrayIndexType(), tep),
     d_constituentType(type.getArrayConstituentType()),
     d_nm(NodeManager::currentNM()),
     d_indexVec(),
@@ -50,8 +53,9 @@ public:
     d_arrayConst()
   {
     d_indexVec.push_back(*d_index);
-    d_constituentVec.push_back(new TypeEnumerator(d_constituentType));
+    d_constituentVec.push_back(new TypeEnumerator(d_constituentType, d_tep));
     d_arrayConst = d_nm->mkConst(ArrayStoreAll(type.toType(), (*(*d_constituentVec.back())).toExpr()));
+    Trace("array-type-enum") << "Array const : " << d_arrayConst << std::endl;
   }
 
   // An array enumerator could be large, and generally you don't want to
@@ -59,6 +63,7 @@ public:
   // by the TypeEnumerator framework.
   ArrayEnumerator(const ArrayEnumerator& ae) throw() :
     TypeEnumeratorBase<ArrayEnumerator>(ae.d_nm->mkArrayType(ae.d_index.getType(), ae.d_constituentType)),
+    d_tep(ae.d_tep),
     d_index(ae.d_index),
     d_constituentType(ae.d_constituentType),
     d_nm(ae.d_nm),
@@ -122,7 +127,7 @@ public:
         return *this;
       }
       d_indexVec.push_back(*d_index);
-      d_constituentVec.push_back(new TypeEnumerator(d_constituentType));
+      d_constituentVec.push_back(new TypeEnumerator(d_constituentType, d_tep));
       ++(*d_constituentVec.back());
       if (d_constituentVec.back()->isFinished()) {
         Trace("array-type-enum") << "operator++ finished!" << std::endl;
@@ -132,7 +137,7 @@ public:
     }
 
     while (d_constituentVec.size() < d_indexVec.size()) {
-      d_constituentVec.push_back(new TypeEnumerator(d_constituentType));
+      d_constituentVec.push_back(new TypeEnumerator(d_constituentType, d_tep));
     }
 
     Trace("array-type-enum") << "operator++ returning, **this = " << **this << std::endl;
index 34b1401e82cad7f4524f2b456799716d9da2887c..3849f8435737b5a129d08fd57e3c9127bdc4c85e 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -32,7 +32,7 @@ class BooleanEnumerator : public TypeEnumeratorBase<BooleanEnumerator> {
 
 public:
 
-  BooleanEnumerator(TypeNode type) :
+  BooleanEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) :
     TypeEnumeratorBase<BooleanEnumerator>(type),
     d_value(FALSE) {
     Assert(type.getKind() == kind::TYPE_CONSTANT &&
index 635cf7dc78b2f93129beb61976ae9a21da2c07fd..5ef0e4ab8eeecd46429f5aa4014f373aff084371 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -31,16 +31,32 @@ namespace builtin {
 
 class UninterpretedSortEnumerator : public TypeEnumeratorBase<UninterpretedSortEnumerator> {
   Integer d_count;
-
+  bool d_has_fixed_bound;
+  Integer d_fixed_bound;
 public:
 
-  UninterpretedSortEnumerator(TypeNode type) throw(AssertionException) :
+  UninterpretedSortEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<UninterpretedSortEnumerator>(type),
     d_count(0) {
     Assert(type.getKind() == kind::SORT_TYPE);
+    d_has_fixed_bound = false;
+    Trace("uf-type-enum") << "UF enum " << type << ", tep = " << tep << std::endl;
+    if( tep && tep->d_fixed_usort_card ){
+      d_has_fixed_bound = true;
+      std::map< TypeNode, Integer >::iterator it = tep->d_fixed_card.find( type );
+      if( it!=tep->d_fixed_card.end() ){
+        d_fixed_bound = it->second;
+      }else{
+        d_fixed_bound = Integer(1);
+      }
+      Trace("uf-type-enum") << "...fixed bound : " << d_fixed_bound << std::endl;
+    }
   }
 
-  Node operator*() throw() {
+  Node operator*() throw(NoMoreValuesException) {
+    if(isFinished()) {
+      throw NoMoreValuesException(getType());
+    }
     return NodeManager::currentNM()->mkConst(UninterpretedConstant(getType().toType(), d_count));
   }
 
@@ -50,7 +66,11 @@ public:
   }
 
   bool isFinished() throw() {
-    return false;
+    if( d_has_fixed_bound ){
+      return d_count>=d_fixed_bound;
+    }else{
+      return false;
+    }
   }
 
 };/* class UninterpretedSortEnumerator */
index db98ef66bd9d9a450fb033ab0857ca49b736e76f..da06b1152a47cae2bec5a4ab134d3efc9e32c5a0 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -35,7 +35,7 @@ class BitVectorEnumerator : public TypeEnumeratorBase<BitVectorEnumerator> {
 
 public:
 
-  BitVectorEnumerator(TypeNode type) throw(AssertionException) :
+  BitVectorEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<BitVectorEnumerator>(type),
     d_size(type.getBitVectorSize()),
     d_bits(0) {
index 26689c81a375ae2b36996c5120ab73a9214c6d8e..57d16d31cc113c96bfe71d8d1b65db2adba74771 100644 (file)
@@ -35,10 +35,10 @@ Node DatatypesEnumerator::getTermEnum( TypeNode tn, unsigned i ){
        d_te_index[tn] = tei;
        if( tn.isDatatype() && d_has_debruijn ){
          //must indicate that this is a child enumerator (do not normalize constants for it)
-         DatatypesEnumerator * dte = new DatatypesEnumerator( tn, true );
+         DatatypesEnumerator * dte = new DatatypesEnumerator( tn, true, d_tep );
          d_children.push_back( TypeEnumerator( dte ) );
        }else{
-         d_children.push_back( TypeEnumerator( tn ) );
+         d_children.push_back( TypeEnumerator( tn, d_tep ) );
        }
        d_terms[tn].push_back( *d_children[tei] );
      }else{
index 0e5aad64045fba1d471a0892e81d869930ac1fa6..67dabafe4f7dc46cc6bd22c26d455b6fc981bf99 100644 (file)
@@ -30,6 +30,8 @@ namespace datatypes {
 
 
 class DatatypesEnumerator : public TypeEnumeratorBase<DatatypesEnumerator> {
+  /** type properties */
+  TypeEnumeratorProperties * d_tep;
   /** The datatype we're enumerating */
   const Datatype& d_datatype;
   /** extra cons */
@@ -78,15 +80,17 @@ class DatatypesEnumerator : public TypeEnumeratorBase<DatatypesEnumerator> {
   void init();
 public:
 
-  DatatypesEnumerator(TypeNode type) throw() :
+  DatatypesEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw() :
     TypeEnumeratorBase<DatatypesEnumerator>(type),
+    d_tep(tep),
     d_datatype(DatatypeType(type.toType()).getDatatype()),
     d_type(type) {
     d_child_enum = false;
     init();
   }
-  DatatypesEnumerator(TypeNode type, bool childEnum) throw() :
+  DatatypesEnumerator(TypeNode type, bool childEnum, TypeEnumeratorProperties * tep = NULL) throw() :
     TypeEnumeratorBase<DatatypesEnumerator>(type),
+    d_tep(tep),
     d_datatype(DatatypeType(type.toType()).getDatatype()),
     d_type(type) {
     d_child_enum = childEnum;
@@ -94,6 +98,7 @@ public:
   }
   DatatypesEnumerator(const DatatypesEnumerator& de) throw() :
     TypeEnumeratorBase<DatatypesEnumerator>(de.getType()),
+    d_tep(de.d_tep),
     d_datatype(de.d_datatype),
     d_type(de.d_type),
     d_ctor(de.d_ctor),
@@ -172,13 +177,14 @@ public:
 };/* DatatypesEnumerator */
 
 class TupleEnumerator : public TypeEnumeratorBase<TupleEnumerator> {
+  TypeEnumeratorProperties * d_tep;
   TypeEnumerator** d_enumerators;
 
   /** Allocate and initialize the delegate enumerators */
   void newEnumerators() {
     d_enumerators = new TypeEnumerator*[getType().getNumChildren()];
     for(size_t i = 0; i < getType().getNumChildren(); ++i) {
-      d_enumerators[i] = new TypeEnumerator(getType()[i]);
+      d_enumerators[i] = new TypeEnumerator(getType()[i], d_tep);
     }
   }
 
@@ -194,14 +200,15 @@ class TupleEnumerator : public TypeEnumeratorBase<TupleEnumerator> {
 
 public:
 
-  TupleEnumerator(TypeNode type) throw() :
-    TypeEnumeratorBase<TupleEnumerator>(type) {
+  TupleEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw() :
+    TypeEnumeratorBase<TupleEnumerator>(type), d_tep(tep) {
     Assert(type.isTuple());
     newEnumerators();
   }
 
   TupleEnumerator(const TupleEnumerator& te) throw() :
     TypeEnumeratorBase<TupleEnumerator>(te.getType()),
+    d_tep(te.d_tep),
     d_enumerators(NULL) {
 
     if(te.d_enumerators != NULL) {
@@ -236,7 +243,7 @@ public:
     size_t i;
     for(i = 0; i < getType().getNumChildren(); ++i) {
       if(d_enumerators[i]->isFinished()) {
-        *d_enumerators[i] = TypeEnumerator(getType()[i]);
+        *d_enumerators[i] = TypeEnumerator(getType()[i], d_tep);
       } else {
         ++*d_enumerators[i];
         return *this;
@@ -255,6 +262,7 @@ public:
 };/* TupleEnumerator */
 
 class RecordEnumerator : public TypeEnumeratorBase<RecordEnumerator> {
+  TypeEnumeratorProperties * d_tep;
   TypeEnumerator** d_enumerators;
 
   /** Allocate and initialize the delegate enumerators */
@@ -279,14 +287,15 @@ class RecordEnumerator : public TypeEnumeratorBase<RecordEnumerator> {
 
 public:
 
-  RecordEnumerator(TypeNode type) throw() :
-    TypeEnumeratorBase<RecordEnumerator>(type) {
+  RecordEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw() :
+    TypeEnumeratorBase<RecordEnumerator>(type), d_tep(tep) {
     Assert(type.isRecord());
     newEnumerators();
   }
 
   RecordEnumerator(const RecordEnumerator& re) throw() :
     TypeEnumeratorBase<RecordEnumerator>(re.getType()),
+    d_tep(re.d_tep),
     d_enumerators(NULL) {
 
     if(re.d_enumerators != NULL) {
index d6725997da98a7705edb0424787dce26c4772917..b6162ec3806f1f51e057594b38f7458403fb6a88 100755 (executable)
@@ -234,14 +234,14 @@ function enumerator {
 #line $lineno \"$kf\"
     case $1:
 #line $lineno \"$kf\"
-      return new $2(type);
+      return new $2(type, tep);
 "
   elif expr "$type_kinds" : '.* '"$1"' ' &>/dev/null; then
     mk_type_enumerator_cases="${mk_type_enumerator_cases}
 #line $lineno \"$kf\"
   case kind::$1:
 #line $lineno \"$kf\"
-    return new $2(type);
+    return new $2(type, tep);
 "
   else
     echo "$kf:$lineno: error: don't know anything about $1; enumerator must appear after definition" >&2
index eb827edc34bc841182ca270ef415c2caed3e861c..4b173c833445f6fef2cc85c4da1533d1bccb92f8 100644 (file)
@@ -232,7 +232,7 @@ bool ModelEngine::considerQuantifiedFormula( Node q ) {
       for( unsigned i=0; i<q[0].getNumChildren(); i++ ){
         TypeNode tn = q[0][i].getType();
         //we are allowed to assume the type is empty
-        if( d_quantEngine->getModel()->d_rep_set.getNumRelevantGroundReps( tn )==0 ){
+        if( tn.isSort() && d_quantEngine->getModel()->d_rep_set.getNumRelevantGroundReps( tn )==0 ){
           Trace("model-engine-debug") << "Empty domain quantified formula : " << q << std::endl;
           return false;
         }
index fa8f108c308fe8d6d54336af71c3dae6b8bdd35a..bb0e1794c7cd9cdd7402bc1462aca59917e65366 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Kshitij Bansal
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -32,6 +32,8 @@ namespace theory {
 namespace sets {
 
 class SetEnumerator : public TypeEnumeratorBase<SetEnumerator> {
+  /** type properties */
+  TypeEnumeratorProperties * d_tep;
   unsigned d_index;
   TypeNode d_constituentType;
   NodeManager* d_nm;
@@ -42,8 +44,9 @@ class SetEnumerator : public TypeEnumeratorBase<SetEnumerator> {
 
 public:
 
-  SetEnumerator(TypeNode type) throw(AssertionException) :
+  SetEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<SetEnumerator>(type),
+    d_tep(tep),
     d_index(0),
     d_constituentType(type.getSetElementType()),
     d_nm(NodeManager::currentNM()),
@@ -62,6 +65,7 @@ public:
   // by the TypeEnumerator framework.
   SetEnumerator(const SetEnumerator& ae) throw() :
     TypeEnumeratorBase<SetEnumerator>(ae.d_nm->mkSetType(ae.d_constituentType)),
+    d_tep(ae.d_tep),
     d_index(ae.d_index),
     d_constituentType(ae.d_constituentType),
     d_nm(ae.d_nm),
@@ -145,7 +149,7 @@ public:
 
     if (d_constituentVec.empty()) {
       ++d_index;
-      d_constituentVec.push_back(new TypeEnumerator(d_constituentType));
+      d_constituentVec.push_back(new TypeEnumerator(d_constituentType, d_tep));
     }
 
     while (d_constituentVec.size() < d_index) {
index cfc3fe02bd915c334efea025115b2cdf0aaee4ec..bdaa683c174e9471707597605ae97f9f13189ee7 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Tianyi Liang
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -40,7 +40,7 @@ class StringEnumerator : public TypeEnumeratorBase<StringEnumerator> {
   }
 public:
 
-  StringEnumerator(TypeNode type) throw(AssertionException) :
+  StringEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw(AssertionException) :
     TypeEnumeratorBase<StringEnumerator>(type) {
     Assert(type.getKind() == kind::TYPE_CONSTANT &&
            type.getConst<TypeConstant>() == STRING_TYPE);
index c6837ddf4079f1c742d05bc139e48ac184f2c002..5ddb1c31a7c943835f11eec830693080c7ff239a 100644 (file)
@@ -587,6 +587,14 @@ void TheoryEngineModelBuilder::buildModel(Model* m, bool fullModel)
   // Process all terms in the equality engine, store representatives for each EC
   std::map< Node, Node > assertedReps, constantReps;
   TypeSet typeConstSet, typeRepSet, typeNoRepSet;
+  TypeEnumeratorProperties tep;
+  if( options::finiteModelFind() ){
+    tep.d_fixed_usort_card = true;
+    for( std::map< TypeNode, unsigned >::iterator it = eqc_usort_count.begin(); it != eqc_usort_count.end(); ++it ){
+      tep.d_fixed_card[it->first] = Integer(it->second);
+    }
+    typeConstSet.setTypeEnumeratorProperties( &tep );
+  }
   std::set< TypeNode > allTypes;
   eqcs_i = eq::EqClassesIterator(tm->d_equalityEngine);
   for ( ; !eqcs_i.isFinished(); ++eqcs_i) {
@@ -810,14 +818,20 @@ void TheoryEngineModelBuilder::buildModel(Model* m, bool fullModel)
             do{
               n = typeConstSet.nextTypeEnum(t, true);
               //--- AJR: this code checks whether n is a legal value
+              Assert( !n.isNull() );
               success = true;
+              Trace("exc-value-debug") << "Check if excluded : " << n << std::endl;
               if( isUSortFiniteRestricted ){
+#ifdef CVC4_ASSERTIONS
                 //must not involve uninterpreted constants beyond cardinality bound (which assumed to coincide with #eqc)
+                //this is just an assertion now, since TypeEnumeratorProperties should ensure that only legal values are enumerated wrt this constraint.
                 std::map< Node, bool > visited;
                 success = !isExcludedUSortValue( eqc_usort_count, n, visited );
                 if( !success ){
                   Trace("exc-value") << "Excluded value for " << t << " : " << n << " due to out of range uninterpreted constant." << std::endl;
                 }
+                Assert( success );
+#endif
               }
               if( success && isCorecursive ){
                 if (repSet != NULL && !repSet->empty()) {
index 8ee4e843d17b3da43fd1d5c0a62ef6199890d765..e609bf703a11cc0a461b2b2cb02371562a48e212 100644 (file)
@@ -130,8 +130,10 @@ public:
 private:
   TypeSetMap d_typeSet;
   TypeToTypeEnumMap d_teMap;
+  TypeEnumeratorProperties * d_tep;
 
   public:
+  TypeSet() : d_tep(NULL) {}
   ~TypeSet() {
     iterator it;
     for (it = d_typeSet.begin(); it != d_typeSet.end(); ++it) {
@@ -146,7 +148,7 @@ private:
       }
     }
   }
-
+  void setTypeEnumeratorProperties( TypeEnumeratorProperties * tep ) { d_tep = tep; }
   void add(TypeNode t, TNode n)
   {
     iterator it = d_typeSet.find(t);
@@ -175,7 +177,7 @@ private:
     TypeEnumerator* te;
     TypeToTypeEnumMap::iterator it = d_teMap.find(t);
     if (it == d_teMap.end()) {
-      te = new TypeEnumerator(t);
+      te = new TypeEnumerator(t, d_tep);
       d_teMap[t] = te;
     }
     else {
index 015cbb28855e8a0f678d611631a03b138a068f3c..951967f50cc28d5a5c8e8f4297d61f45d9b8f998 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -62,6 +62,18 @@ public:
 
 };/* class TypeEnumeratorInterface */
 
+// AJR: This class stores particular information that is relevant to type enumeration.
+//      For finite model finding, we set d_fixed_usort=true,
+//      and store the finite cardinality bounds for each uninterpreted sort encountered in the model.
+class TypeEnumeratorProperties
+{
+public:
+  TypeEnumeratorProperties() : d_fixed_usort_card(false){}
+  Integer getFixedCardinality( TypeNode tn ) { return d_fixed_card[tn]; }
+  bool d_fixed_usort_card;
+  std::map< TypeNode, Integer > d_fixed_card;
+};
+
 template <class T>
 class TypeEnumeratorBase : public TypeEnumeratorInterface {
 public:
@@ -77,13 +89,13 @@ public:
 class TypeEnumerator {
   TypeEnumeratorInterface* d_te;
 
-  static TypeEnumeratorInterface* mkTypeEnumerator(TypeNode type)
+  static TypeEnumeratorInterface* mkTypeEnumerator(TypeNode type, TypeEnumeratorProperties * tep)
     throw(AssertionException);
 
 public:
 
-  TypeEnumerator(TypeNode type) throw() :
-    d_te(mkTypeEnumerator(type)) {
+  TypeEnumerator(TypeNode type, TypeEnumeratorProperties * tep = NULL) throw() :
+    d_te(mkTypeEnumerator(type, tep)) {
   }
 
   TypeEnumerator(const TypeEnumerator& te) :
index f0eafed18c5bb3bb9279c588c03f6dbcc1969581..6f9b565bf1f8be6e3bdc473953ff3bfbbafa4bb0 100644 (file)
@@ -3,7 +3,7 @@
  ** \verbatim
  ** Original author: Morgan Deters
  ** Major contributors: none
- ** Minor contributors (to current version): none
+ ** Minor contributors (to current version): Andrew Reynolds
  ** This file is part of the CVC4 project.
  ** Copyright (c) 2009-2014  New York University and The University of Iowa
  ** See the file COPYING in the top-level source directory for licensing
@@ -29,7 +29,7 @@ using namespace std;
 namespace CVC4 {
 namespace theory {
 
-TypeEnumeratorInterface* TypeEnumerator::mkTypeEnumerator(TypeNode type) throw(AssertionException) {
+TypeEnumeratorInterface* TypeEnumerator::mkTypeEnumerator(TypeNode type, TypeEnumeratorProperties * tep) throw(AssertionException) {
   switch(type.getKind()) {
   case kind::TYPE_CONSTANT:
     switch(type.getConst<TypeConstant>()) {