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 fullSaturateInst --fs-inst bool :default false
+option fullSaturateInterleave --fs-interleave bool :default false
interleave full saturate instantiation with other techniques
option literalMatchMode --literal-matching=MODE CVC4::theory::quantifiers::LiteralMatchMode :default CVC4::theory::quantifiers::LITERAL_MATCH_USE :include "options/quantifiers_modes.h" :handler stringToLiteralMatchMode :predicate checkLiteralMatchMode
only add one instantiation per quantifier per round for mbqi
option fmfOneQuantPerRound --mbqi-one-quant-per-round bool :default false
only add instantiations for one quantifier per round for mbqi
+option mbqiInterleave --mbqi-interleave bool :default false
+ interleave model-based quantifier instantiation with other techniques
option fmfInstEngine --fmf-inst-engine bool :default false :read-write
use instantiation engine in conjunction with finite model finding
}
bool FullSaturation::needsCheck( Theory::Effort e ){
- if( options::fullSaturateInst() ){
+ if( options::fullSaturateInterleave() ){
if( d_quantEngine->getInstWhenNeedsCheck( e ) ){
return true;
}
void FullSaturation::check( Theory::Effort e, unsigned quant_e ) {
bool doCheck = false;
bool fullEffort = false;
- if( options::fullSaturateInst() ){
+ if( options::fullSaturateInterleave() ){
//we only add when interleaved with other strategies
doCheck = quant_e==QuantifiersEngine::QEFFORT_STANDARD && d_quantEngine->hasAddedLemma();
}
if( Trace.isOn("fs-engine") ){
Trace("fs-engine") << "Added lemmas = " << addedLemmas << std::endl;
double clSet2 = double(clock())/double(CLOCKS_PER_SEC);
- Trace("fs-engine") << "Finished instantiation engine, time = " << (clSet2-clSet) << std::endl;
+ Trace("fs-engine") << "Finished full saturation engine, time = " << (clSet2-clSet) << std::endl;
}
}
}
}
unsigned ModelEngine::needsModel( Theory::Effort e ) {
- return QuantifiersEngine::QEFFORT_MODEL;
+ if( options::mbqiInterleave() ){
+ return QuantifiersEngine::QEFFORT_STANDARD;
+ }else{
+ return QuantifiersEngine::QEFFORT_MODEL;
+ }
}
void ModelEngine::reset_round( Theory::Effort e ) {
}
void ModelEngine::check( Theory::Effort e, unsigned quant_e ){
- if( quant_e==QuantifiersEngine::QEFFORT_MODEL ){
+ bool doCheck = false;
+ if( options::mbqiInterleave() ){
+ doCheck = quant_e==QuantifiersEngine::QEFFORT_STANDARD && d_quantEngine->hasAddedLemma();
+ }
+ if( !doCheck ){
+ doCheck = quant_e==QuantifiersEngine::QEFFORT_MODEL;
+ }
+ if( doCheck ){
Assert( !d_quantEngine->inConflict() );
int addedLemmas = 0;
FirstOrderModel* fm = d_quantEngine->getModel();
d_modules.push_back( d_uee );
}
//full saturation : instantiate from relevant domain, then arbitrary terms
- if( options::fullSaturateQuant() || options::fullSaturateInst() ){
+ if( options::fullSaturateQuant() || options::fullSaturateInterleave() ){
d_fs = new quantifiers::FullSaturation( this );
d_modules.push_back( d_fs );
needsRelDom = true;