}else{
//first, try from relevant domain
RelevantDomain * rd = d_quantEngine->getRelevantDomain();
- for( unsigned r=0; r<2; r++ ){
- if( rd || r==1 ){
+ unsigned rstart = options::fullSaturateQuantRd() ? 0 : 1;
+ for( unsigned r=rstart; r<2; r++ ){
+ if( rd || r>0 ){
if( r==0 ){
Trace("inst-alg") << "-> Relevant domain instantiate " << f << "..." << std::endl;
}else{
- Trace("inst-alg") << "-> Guess instantiate " << f << "..." << std::endl;
+ Trace("inst-alg") << "-> Ground term instantiate " << f << "..." << std::endl;
}
rd->compute();
unsigned final_max_i = 0;
}
}
if( r==0 ){
+ //complete guess
if( d_guessed.find( f )==d_guessed.end() ){
Trace("inst-alg") << "-> Guess instantiate " << f << "..." << std::endl;
d_guessed[f] = true;
}
}
}
+ //term enumerator?
}
return STATUS_UNKNOWN;
}
option fullSaturateQuant --full-saturate-quant bool :default false
when all other quantifier instantiation strategies fail, instantiate with ground terms from relevant domain, then arbitrary ground terms before answering unknown
+option fullSaturateQuantRd --full-saturate-quant-rd bool :default true
+ whether to use relevant domain first for full saturation instantiation strategy
option literalMatchMode --literal-matching=MODE CVC4::theory::quantifiers::LiteralMatchMode :default CVC4::theory::quantifiers::LITERAL_MATCH_NONE :include "theory/quantifiers/modes.h" :handler CVC4::theory::quantifiers::stringToLiteralMatchMode :handler-include "theory/quantifiers/options_handlers.h" :predicate CVC4::theory::quantifiers::checkLiteralMatchMode :predicate-include "theory/quantifiers/options_handlers.h"
choose literal matching mode
bool rec = false;
if( d_processed.find( n )==d_processed.end() ){
d_processed.insert(n);
- d_type_map[ n.getType() ].push_back( n );
- //if this is an atomic trigger, consider adding it
- //Call the children?
- if( inst::Trigger::isAtomicTrigger( n ) ){
- if( !TermDb::hasInstConstAttr(n) ){
+ if( !TermDb::hasInstConstAttr(n) ){
+ Trace("term-db-debug") << "register term : " << n << std::endl;
+ d_type_map[ n.getType() ].push_back( n );
+ //if this is an atomic trigger, consider adding it
+ //Call the children?
+ if( inst::Trigger::isAtomicTrigger( n ) ){
Trace("term-db") << "register term in db " << n << std::endl;
Node op = getOperator( n );
/*
d_iclosure_processed.insert( n );
rec = true;
}
- if( rec ){
+ if( rec && n.getKind()!=FORALL ){
for( size_t i=0; i<n.getNumChildren(); i++ ){
addTerm( n[i], added, withinQuant, withinInstClosure );
}
Trace("quant-engine-debug") << " lemmas waiting = " << d_lemmas_waiting.size() << std::endl;
}
Trace("quant-engine-debug") << " Theory engine finished : " << !d_te->needCheck() << std::endl;
+ Trace("quant-engine-debug") << " Needs model effort : " << needsModelE << std::endl;
Trace("quant-engine-debug") << "Resetting all modules..." << std::endl;
}
if( Trace.isOn("quant-engine-ee") ){
for( int i=0; i<(int)d_modules.size(); i++ ){
d_modules[i]->assertNode( f );
}
+ addTermToDatabase( d_term_db->getInstConstantBody( f ), true );
}
}
}