void RepSet::add( TypeNode tn, Node n ){ //for now, do not add array constants FIXME if( tn.isArray() ){ std::vector< Node > cache; if( containsStoreAll( n, cache ) ){ return; } } Trace("rsi-debug") << "Add rep #" << d_type_reps[tn].size() << " for " << tn << " : " << n << std::endl; Assert( n.getType().isSubtypeOf( tn ) ); d_tmap[ n ] = (int)d_type_reps[tn].size(); d_type_reps[tn].push_back( n ); }
bool TermEnumeration::isClosedEnumerableType(TypeNode tn) { std::unordered_map<TypeNode, bool, TypeNodeHashFunction>::iterator it = d_typ_closed_enum.find(tn); if (it == d_typ_closed_enum.end()) { d_typ_closed_enum[tn] = true; bool ret = true; if (tn.isArray() || tn.isSort() || tn.isCodatatype() || tn.isFunction()) { ret = false; } else if (tn.isSet()) { ret = isClosedEnumerableType(tn.getSetElementType()); } else if (tn.isDatatype()) { const Datatype& dt = ((DatatypeType)(tn).toType()).getDatatype(); for (unsigned i = 0; i < dt.getNumConstructors(); i++) { for (unsigned j = 0; j < dt[i].getNumArgs(); j++) { TypeNode ctn = TypeNode::fromType(dt[i][j].getRangeType()); if (tn != ctn && !isClosedEnumerableType(ctn)) { ret = false; break; } } if (!ret) { break; } } } // other parametric sorts go here d_typ_closed_enum[tn] = ret; return ret; } else { return it->second; } }