diff options
author | ajreynol <andrew.j.reynolds@gmail.com> | 2015-06-27 09:30:06 +0200 |
---|---|---|
committer | ajreynol <andrew.j.reynolds@gmail.com> | 2015-06-27 09:30:06 +0200 |
commit | 65c2e1688d83dfeb913b689c10d9b43c5dc89cc0 (patch) | |
tree | f552414624cd7259e638b6edc0c7a710a4215138 /src/theory/quantifiers | |
parent | e4cff69e3b565e928dbf04960249477ce2c9ef6b (diff) |
Refactor various corner cases of fmf, quantifiers modules. Enable cbqi2 by default on pure quantified arithmetic. Fix bug in sort inference related to mixed real/int, add regression.
Diffstat (limited to 'src/theory/quantifiers')
-rw-r--r-- | src/theory/quantifiers/instantiation_engine.cpp | 5 | ||||
-rw-r--r-- | src/theory/quantifiers/model_builder.cpp | 12 | ||||
-rw-r--r-- | src/theory/quantifiers/model_builder.h | 4 | ||||
-rw-r--r-- | src/theory/quantifiers/model_engine.cpp | 68 | ||||
-rw-r--r-- | src/theory/quantifiers/options | 4 | ||||
-rw-r--r-- | src/theory/quantifiers/quant_util.h | 2 | ||||
-rw-r--r-- | src/theory/quantifiers/term_database.cpp | 6 | ||||
-rw-r--r-- | src/theory/quantifiers/term_database.h | 2 |
8 files changed, 49 insertions, 54 deletions
diff --git a/src/theory/quantifiers/instantiation_engine.cpp b/src/theory/quantifiers/instantiation_engine.cpp index 4fbf298f4..631216507 100644 --- a/src/theory/quantifiers/instantiation_engine.cpp +++ b/src/theory/quantifiers/instantiation_engine.cpp @@ -66,11 +66,10 @@ void InstantiationEngine::finishInit(){ //counterexample-based quantifier instantiation if( options::cbqi() ){ - if( !options::cbqi2() || options::cbqi.wasSetByUser() ){ + if( !options::cbqi2() ){ d_i_splx = new InstStrategySimplex( (arith::TheoryArith*)d_quantEngine->getTheoryEngine()->theoryOf( THEORY_ARITH ), d_quantEngine ); d_instStrategies.push_back( d_i_splx ); - } - if( options::cbqi2() ){ + }else{ d_i_cegqi = new InstStrategyCegqi( d_quantEngine ); d_instStrategies.push_back( d_i_cegqi ); } diff --git a/src/theory/quantifiers/model_builder.cpp b/src/theory/quantifiers/model_builder.cpp index 53f55e70b..e297e138c 100644 --- a/src/theory/quantifiers/model_builder.cpp +++ b/src/theory/quantifiers/model_builder.cpp @@ -176,7 +176,7 @@ void QModelBuilderIG::processBuildModel( TheoryModel* m, bool fullModel ) { } //if applicable, find exceptions to model via inst-gen - if( optInstGen() ){ + if( options::fmfInstGen() ){ d_didInstGen = true; d_instGenMatches = 0; d_numQuantSat = 0; @@ -201,7 +201,7 @@ void QModelBuilderIG::processBuildModel( TheoryModel* m, bool fullModel ) { }else{ d_numQuantNoSelForm++; } - if( optOneQuantPerRoundInstGen() && lems>0 ){ + if( options::fmfInstGenOneQuantPerRound() && lems>0 ){ break; } }else if( d_quant_sat.find( f )!=d_quant_sat.end() ){ @@ -341,14 +341,6 @@ bool QModelBuilderIG::hasConstantDefinition( Node n ){ return false; } -bool QModelBuilderIG::optInstGen(){ - return options::fmfInstGen(); -} - -bool QModelBuilderIG::optOneQuantPerRoundInstGen(){ - return options::fmfInstGenOneQuantPerRound(); -} - QModelBuilderIG::Statistics::Statistics(): d_num_quants_init("QModelBuilderIG::Number_Quantifiers", 0), d_num_partial_quants_init("QModelBuilderIG::Number_Partial_Quantifiers", 0), diff --git a/src/theory/quantifiers/model_builder.h b/src/theory/quantifiers/model_builder.h index d9ed3f092..8e84f15e2 100644 --- a/src/theory/quantifiers/model_builder.h +++ b/src/theory/quantifiers/model_builder.h @@ -123,10 +123,6 @@ public: QModelBuilderIG( context::Context* c, QuantifiersEngine* qe ); virtual ~QModelBuilderIG() throw() {} public: - //whether to add inst-gen lemmas - virtual bool optInstGen(); - //whether to only consider only quantifier per round of inst-gen - virtual bool optOneQuantPerRoundInstGen(); /** statistics class */ class Statistics { public: diff --git a/src/theory/quantifiers/model_engine.cpp b/src/theory/quantifiers/model_engine.cpp index ce780a29b..2ad8be3a1 100644 --- a/src/theory/quantifiers/model_engine.cpp +++ b/src/theory/quantifiers/model_engine.cpp @@ -157,15 +157,19 @@ int ModelEngine::checkModel(){ if( it->first.isSort() ){ Trace("model-engine") << "Cardinality( " << it->first << " )" << " = " << it->second.size() << std::endl; if( Trace.isOn("model-engine-debug") ){ - Trace("model-engine-debug") << " "; - Node mbt = d_quantEngine->getTermDatabase()->getModelBasisTerm(it->first); + Trace("model-engine-debug") << " Reps : "; + for( size_t i=0; i<it->second.size(); i++ ){ + Trace("model-engine-debug") << it->second[i] << " "; + } + Trace("model-engine-debug") << std::endl; + Trace("model-engine-debug") << " Term reps : "; for( size_t i=0; i<it->second.size(); i++ ){ - //Trace("model-engine-debug") << it->second[i] << " "; Node r = d_quantEngine->getEqualityQuery()->getInternalRepresentative( it->second[i], Node::null(), 0 ); Trace("model-engine-debug") << r << " "; } Trace("model-engine-debug") << std::endl; - Trace("model-engine-debug") << " Model basis term : " << mbt << std::endl; + Node mbt = d_quantEngine->getTermDatabase()->getModelBasisTerm(it->first); + Trace("model-engine-debug") << " Basis term : " << mbt << std::endl; } } } @@ -200,6 +204,7 @@ int ModelEngine::checkModel(){ for( int i=0; i<fm->getNumAssertedQuantifiers(); i++ ){ Node f = fm->getAssertedQuantifier( i ); bool isAx = getTermDatabase()->isQAttrAxiom( f ); + Trace("fmf-exh-inst") << "-> Exhaustive instantiate " << f << ", effort = " << e << "..." << std::endl; //determine if we should check this quantifier if( ( ( effort==1 && ( options::axiomInstMode()==AXIOM_INST_MODE_DEFAULT || isAx ) ) || ( effort==0 && !isAx ) ) && mb->isQuantifierActive( f ) ){ exhaustiveInstantiate( f, e ); @@ -214,7 +219,7 @@ int ModelEngine::checkModel(){ break; } }else{ - Trace("inst-fmf-ei") << "-> Inactive : " << f << std::endl; + Trace("fmf-exh-inst") << "-> Inactive : " << f << std::endl; } } } @@ -240,43 +245,46 @@ void ModelEngine::exhaustiveInstantiate( Node f, int effort ){ mb->d_addedLemmas = 0; mb->d_incomplete_check = false; if( mb->doExhaustiveInstantiation( d_quantEngine->getModel(), f, effort ) ){ - Trace("inst-fmf-ei") << "-> Builder determined instantiation(s)." << std::endl; + Trace("fmf-exh-inst") << "-> Builder determined instantiation(s)." << std::endl; d_triedLemmas += mb->d_triedLemmas; d_addedLemmas += mb->d_addedLemmas; d_incomplete_check = d_incomplete_check || mb->d_incomplete_check; d_statistics.d_mbqi_inst_lemmas += mb->d_addedLemmas; }else{ - Trace("inst-fmf-ei") << "-> Exhaustive instantiate " << f << ", effort = " << effort << "..." << std::endl; - Debug("inst-fmf-ei") << " Instantiation Constants: "; + Trace("fmf-exh-inst-debug") << " Instantiation Constants: "; for( size_t i=0; i<f[0].getNumChildren(); i++ ){ - Debug("inst-fmf-ei") << d_quantEngine->getTermDatabase()->getInstantiationConstant( f, i ) << " "; + Trace("fmf-exh-inst-debug") << d_quantEngine->getTermDatabase()->getInstantiationConstant( f, i ) << " "; } - Debug("inst-fmf-ei") << std::endl; + Trace("fmf-exh-inst-debug") << std::endl; //create a rep set iterator and iterate over the (relevant) domain of the quantifier RepSetIterator riter( d_quantEngine, &(d_quantEngine->getModel()->d_rep_set) ); if( riter.setQuantifier( f ) ){ - Debug("inst-fmf-ei") << "Begin instantiation..." << std::endl; - int triedLemmas = 0; - int addedLemmas = 0; - while( !riter.isFinished() && ( addedLemmas==0 || !options::fmfOneInstPerRound() ) ){ - //instantiation was not shown to be true, construct the match - InstMatch m( f ); - for( int i=0; i<riter.getNumTerms(); i++ ){ - m.set( d_quantEngine, riter.d_index_order[i], riter.getTerm( i ) ); - } - Debug("fmf-model-eval") << "* Add instantiation " << m << std::endl; - triedLemmas++; - //add as instantiation - if( d_quantEngine->addInstantiation( f, m ) ){ - addedLemmas++; - }else{ - Debug("fmf-model-eval") << "* Failed Add instantiation " << m << std::endl; + Trace("fmf-exh-inst") << "...exhaustive instantiation incomplete=" << riter.d_incomplete << "..." << std::endl; + if( !riter.d_incomplete || options::fmfFullSaturate() ){ + int triedLemmas = 0; + int addedLemmas = 0; + while( !riter.isFinished() && ( addedLemmas==0 || !options::fmfOneInstPerRound() ) ){ + //instantiation was not shown to be true, construct the match + InstMatch m( f ); + for( int i=0; i<riter.getNumTerms(); i++ ){ + m.set( d_quantEngine, riter.d_index_order[i], riter.getTerm( i ) ); + } + Debug("fmf-model-eval") << "* Add instantiation " << m << std::endl; + triedLemmas++; + //add as instantiation + if( d_quantEngine->addInstantiation( f, m ) ){ + addedLemmas++; + }else{ + Debug("fmf-model-eval") << "* Failed Add instantiation " << m << std::endl; + } + riter.increment(); } - riter.increment(); + d_addedLemmas += addedLemmas; + d_triedLemmas += triedLemmas; + d_statistics.d_exh_inst_lemmas += addedLemmas; } - d_addedLemmas += addedLemmas; - d_triedLemmas += triedLemmas; - d_statistics.d_exh_inst_lemmas += addedLemmas; + }else{ + Assert( riter.d_incomplete ); } //if the iterator is incomplete, we will return unknown instead of sat if no instantiations are added this round d_incomplete_check = d_incomplete_check || riter.d_incomplete; diff --git a/src/theory/quantifiers/options b/src/theory/quantifiers/options index fe81df7f8..2af66e60a 100644 --- a/src/theory/quantifiers/options +++ b/src/theory/quantifiers/options @@ -137,8 +137,10 @@ option fmfOneQuantPerRound --mbqi-one-quant-per-round bool :default false option fmfInstEngine --fmf-inst-engine bool :default false use instantiation engine in conjunction with finite model finding +option fmfFullSaturate --fmf-full-saturate bool :default false + instantiate with all known ground terms for infinite domain quantifiers when finite model finding option fmfInstGen --fmf-inst-gen bool :default true - disable Inst-Gen instantiation techniques for finite model finding + disable Inst-Gen instantiation techniques for finite model finding option fmfInstGenOneQuantPerRound --fmf-inst-gen-one-quant-per-round bool :default false only perform Inst-Gen instantiation techniques on one quantifier per round option fmfFreshDistConst --fmf-fresh-dc bool :default false diff --git a/src/theory/quantifiers/quant_util.h b/src/theory/quantifiers/quant_util.h index ca24de5f7..5e0f511e0 100644 --- a/src/theory/quantifiers/quant_util.h +++ b/src/theory/quantifiers/quant_util.h @@ -110,8 +110,6 @@ public: virtual eq::EqualityEngine* getEngine() = 0; /** get the equivalence class of a */ virtual void getEquivalenceClass( Node a, std::vector< Node >& eqc ) = 0; - - virtual void setLiberal( bool l ) = 0; };/* class EqualityQuery */ diff --git a/src/theory/quantifiers/term_database.cpp b/src/theory/quantifiers/term_database.cpp index 2671f616b..20d622122 100644 --- a/src/theory/quantifiers/term_database.cpp +++ b/src/theory/quantifiers/term_database.cpp @@ -409,7 +409,7 @@ bool TermDb::isInstClosure( Node r ) { return d_iclosure_processed.find( r )!=d_iclosure_processed.end(); } -//checks whether a type is reasonably small enough such that all of its domain elements can be enumerated +//checks whether a type is not Array and is reasonably small enough (<1000) such that all of its domain elements can be enumerated bool TermDb::mayComplete( TypeNode tn ) { std::map< TypeNode, bool >::iterator it = d_may_complete.find( tn ); if( it==d_may_complete.end() ){ @@ -1756,13 +1756,13 @@ Node TermDbSygus::getNormalized( TypeNode t, Node prog, bool do_pre_norm, bool d } } -int TermDbSygus::getTermSize( Node n ){ +int TermDbSygus::getSygusTermSize( Node n ){ if( isVar( n ) ){ return 0; }else{ int sum = 0; for( unsigned i=0; i<n.getNumChildren(); i++ ){ - sum += getTermSize( n[i] ); + sum += getSygusTermSize( n[i] ); } return 1+sum; } diff --git a/src/theory/quantifiers/term_database.h b/src/theory/quantifiers/term_database.h index b7fa4e999..1ede29c12 100644 --- a/src/theory/quantifiers/term_database.h +++ b/src/theory/quantifiers/term_database.h @@ -465,7 +465,7 @@ public: Node builtinToSygusConst( Node c, TypeNode tn, int rcons_depth = 0 ); Node getSygusNormalized( Node n, std::map< TypeNode, int >& var_count, std::map< Node, Node >& subs ); Node getNormalized( TypeNode t, Node prog, bool do_pre_norm = false, bool do_post_norm = true ); - int getTermSize( Node n ); + int getSygusTermSize( Node n ); /** given a term, construct an equivalent smaller one that respects syntax */ Node minimizeBuiltinTerm( Node n ); /** given a term, expand it into more basic components */ |