if( n.getType().isSubtypeOf( d_match_pattern_type ) ){
TNode nh = d_qe->getTermDatabase()->getEligibleTermInEqc( n );
if( !nh.isNull() ){
- if( options::instMaxLevel()!=-1 ){
+ if( options::instMaxLevel()!=-1 || options::lteRestrictInstClosure() ){
nh = d_qe->getEqualityQuery()->getInternalRepresentative( nh, d_f, d_index );
+ //don't consider this if already the instantiation is ineligible
+ if( !d_qe->getTermDatabase()->isTermEligibleForInstantiation( nh, d_f, false ) ){
+ nh = Node::null();
+ }
+ }
+ if( !nh.isNull() ){
+ d_firstTime = false;
+ //an equivalence class with the same type as the pattern, return it
+ return nh;
}
- d_firstTime = false;
- //an equivalence class with the same type as the pattern, return it
- return nh;
}
}
}
//int e_use = d_quantEngine->getRelevance( f )==-1 ? e - 1 : e;
int e_use = e;
if( e_use>=0 ){
+ Trace("inst-engine-debug") << "inst-engine : " << f << std::endl;
//check each instantiation strategy
for( size_t i=0; i<d_instStrategies.size(); ++i ){
InstStrategy* is = d_instStrategies[i];
void QuantifiersEngine::debugPrintEqualityEngine( const char * c ) {
eq::EqualityEngine* ee = getMasterEqualityEngine();
eq::EqClassesIterator eqcs_i = eq::EqClassesIterator( ee );
+ std::map< TypeNode, int > typ_num;
while( !eqcs_i.isFinished() ){
TNode r = (*eqcs_i);
+ TypeNode tr = r.getType();
+ if( typ_num.find( tr )==typ_num.end() ){
+ typ_num[tr] = 0;
+ }
+ typ_num[tr]++;
bool firstTime = true;
Trace(c) << " " << r;
Trace(c) << " : { ";
++eqcs_i;
}
Trace(c) << std::endl;
+ for( std::map< TypeNode, int >::iterator it = typ_num.begin(); it != typ_num.end(); ++it ){
+ Trace(c) << "# eqc for " << it->first << " : " << it->second << std::endl;
+ }
}
void EqualityQueryQuantifiersEngine::reset(){