diff --git a/src/duality/duality_rpfp.cpp b/src/duality/duality_rpfp.cpp index e09278dd4..550f94f2d 100755 --- a/src/duality/duality_rpfp.cpp +++ b/src/duality/duality_rpfp.cpp @@ -2847,7 +2847,12 @@ namespace Duality { } void RPFP::InterpolateByCases(Node *root, Node *node){ + timer_start("InterpolateByCases"); bool axioms_added = false; + hash_set axioms_needed; + const std::vector &theory = ls->get_axioms(); + for(unsigned i = 0; i < theory.size(); i++) + axioms_needed.insert(theory[i]); aux_solver.push(); AddEdgeToSolver(node->Outgoing); node->Annotation.SetEmpty(); @@ -2869,7 +2874,17 @@ namespace Duality { check_result foo = Check(root); if(foo != unsat) throw "should be unsat"; - AddToProofCore(*core); + + std::vector assumps, axioms_to_add; + slvr().get_proof().get_assumptions(assumps); + for(unsigned i = 0; i < assumps.size(); i++){ + (*core).insert(assumps[i]); + if(axioms_needed.find(assumps[i]) != axioms_needed.end()){ + axioms_to_add.push_back(assumps[i]); + axioms_needed.erase(assumps[i]); + } + } + // AddToProofCore(*core); Transformer old_annot = node->Annotation; SolveSingleNode(root,node); @@ -2882,6 +2897,9 @@ namespace Duality { node->Annotation.Formula = node->Annotation.Formula.simplify(); } + for(unsigned i = 0; i < axioms_to_add.size(); i++) + aux_solver.add(axioms_to_add[i]); + if(node->Annotation.IsEmpty()){ if(!axioms_added){ // add the axioms in the off chance they are useful @@ -2906,6 +2924,7 @@ namespace Duality { delete proof_core; // shouldn't happen proof_core = core; aux_solver.pop(1); + timer_stop("InterpolateByCases"); } void RPFP::Generalize(Node *root, Node *node){ diff --git a/src/duality/duality_wrapper.cpp b/src/duality/duality_wrapper.cpp index cf2c803cb..345fef562 100755 --- a/src/duality/duality_wrapper.cpp +++ b/src/duality/duality_wrapper.cpp @@ -43,7 +43,8 @@ namespace Duality { if(models) p.set_bool("model", true); p.set_bool("unsat_core", true); - p.set_bool("mbqi",true); + bool mbqi = c.get_config().get().get_bool("mbqi",true); + p.set_bool("mbqi",mbqi); // just to test p.set_str("mbqi.id","itp"); // use mbqi for quantifiers in interpolants p.set_uint("mbqi.max_iterations",1); // use mbqi for quantifiers in interpolants if(true || extensional) diff --git a/src/duality/duality_wrapper.h b/src/duality/duality_wrapper.h index 2b0045023..febc3f1f1 100755 --- a/src/duality/duality_wrapper.h +++ b/src/duality/duality_wrapper.h @@ -182,6 +182,7 @@ namespace Duality { void set(char const * param, char const * value) { m_config.set(param,value); } void set(char const * param, bool value) { m_config.set(param,value); } void set(char const * param, int value) { m_config.set(param,value); } + config &get_config() {return m_config;} symbol str_symbol(char const * s); symbol int_symbol(int n); diff --git a/src/muz/base/fixedpoint_params.pyg b/src/muz/base/fixedpoint_params.pyg index e09e1307b..5eec77f39 100644 --- a/src/muz/base/fixedpoint_params.pyg +++ b/src/muz/base/fixedpoint_params.pyg @@ -74,6 +74,7 @@ def_module_params('fixedpoint', ('stratified_inlining', BOOL, False, 'DUALITY: Use stratified inlining'), ('recursion_bound', UINT, UINT_MAX, 'DUALITY: Recursion bound for stratified inlining'), ('profile', BOOL, False, 'DUALITY: profile run time'), + ('mbqi', BOOL, True, 'DUALITY: use model-based quantifier instantion'), ('dump_aig', SYMBOL, '', 'Dump clauses in AIG text format (AAG) to the given file name'), )) diff --git a/src/muz/duality/duality_dl_interface.cpp b/src/muz/duality/duality_dl_interface.cpp index 248aca163..e7c7976f6 100755 --- a/src/muz/duality/duality_dl_interface.cpp +++ b/src/muz/duality/duality_dl_interface.cpp @@ -141,6 +141,7 @@ lbool dl_interface::query(::expr * query) { // make a new problem and solver _d = alloc(duality_data,m_ctx.get_manager()); + _d->ctx.set("mbqi",m_ctx.get_params().mbqi()); _d->ls = alloc(RPFP::iZ3LogicSolver,_d->ctx); _d->rpfp = alloc(RPFP,_d->ls);