示例#1
0
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;
}