int InstStrategyCegqi::process( Node f, Theory::Effort effort, int e ) { if( e<2 ){ return STATUS_UNFINISHED; }else if( e==2 ){ CegInstantiator * cinst; std::map< Node, CegInstantiator * >::iterator it = d_cinst.find( f ); if( it==d_cinst.end() ){ cinst = new CegInstantiator( d_quantEngine, d_out ); if( d_n_delta.isNull() ){ d_n_delta = NodeManager::currentNM()->mkSkolem( "delta", NodeManager::currentNM()->realType(), "delta for cegqi inst strategy" ); Node delta_lem = NodeManager::currentNM()->mkNode( GT, d_n_delta, NodeManager::currentNM()->mkConst( Rational( 0 ) ) ); d_quantEngine->getOutputChannel().lemma( delta_lem ); } cinst->d_n_delta = d_n_delta; for( int i=0; i<d_quantEngine->getTermDatabase()->getNumInstantiationConstants( f ); i++ ){ cinst->d_vars.push_back( d_quantEngine->getTermDatabase()->getInstantiationConstant( f, i ) ); } d_cinst[f] = cinst; }else{ cinst = it->second; } if( d_check_delta_lemma ){ Trace("inst-alg") << "-> Get delta lemmas for cegqi..." << std::endl; d_check_delta_lemma = false; std::vector< Node > dlemmas; cinst->getDeltaLemmas( dlemmas ); Trace("inst-alg") << "...got " << dlemmas.size() << " delta lemmas." << std::endl; if( !dlemmas.empty() ){ bool addedLemma = false; for( unsigned i=0; i<dlemmas.size(); i++ ){ if( addLemma( dlemmas[i] ) ){ addedLemma = true; } } if( addedLemma ){ return STATUS_UNKNOWN; } } } Trace("inst-alg") << "-> Run cegqi for " << f << std::endl; d_curr_quant = f; cinst->check(); d_curr_quant = Node::null(); } return STATUS_UNKNOWN; }