diff --git a/src/duality/duality.h b/src/duality/duality.h index cde703617..72d72ac6b 100644 --- a/src/duality/duality.h +++ b/src/duality/duality.h @@ -782,6 +782,9 @@ namespace Duality { struct ReallyBad { }; + // throw when greedy reduction fails + struct greedy_reduce_failed {}; + /** Pop a scope (see Push). Note, you cannot pop axioms. */ void Pop(int num_scopes); diff --git a/src/duality/duality_rpfp.cpp b/src/duality/duality_rpfp.cpp index 897bc521f..9da720ccc 100755 --- a/src/duality/duality_rpfp.cpp +++ b/src/duality/duality_rpfp.cpp @@ -2870,10 +2870,10 @@ namespace Duality { lits = assumps; std::copy(core.begin(),core.end(),std::inserter(lits,lits.end())); - for(int k = 0; k < 100; k++) // keep trying, maybe MBQI will do something! + for(int k = 0; k < 4; k++) // keep trying, maybe MBQI will do something! if((res = CheckCore(lits,full_core)) == unsat) goto is_unsat; - throw "should be unsat"; + throw greedy_reduce_failed(); } is_unsat: FilterCore(core,full_core); @@ -3084,8 +3084,18 @@ namespace Duality { } } // AddToProofCore(*core); - SolveSingleNode(root,node); - + + try { + SolveSingleNode(root,node); + } + catch (char const *msg){ + // This happens if interpolation fails + Pop(1); + is.pop(1); + delete core; + timer_stop("InterpolateByCases"); + throw msg; + } { expr itp = GetAnnotation(node); dualModel = is.get_model(); // TODO: what does this mean? diff --git a/src/duality/duality_solver.cpp b/src/duality/duality_solver.cpp index 4568ea913..d935c2655 100644 --- a/src/duality/duality_solver.cpp +++ b/src/duality/duality_solver.cpp @@ -2295,6 +2295,10 @@ namespace Duality { reporter->Message(std::string("interpolation failure:") + msg); throw DoRestart(); } + catch(const RPFP::greedy_reduce_failed &){ + // if we couldn't reduce, just continue (maybe should restart?) + reporter->Message("interpolant verification failed"); + } if(RecordUpdate(node)){ update_count++; total_updates++; diff --git a/src/interp/iz3proof_itp.cpp b/src/interp/iz3proof_itp.cpp index 046b0b7f1..507096340 100755 --- a/src/interp/iz3proof_itp.cpp +++ b/src/interp/iz3proof_itp.cpp @@ -562,7 +562,10 @@ class iz3proof_itp_impl : public iz3proof_itp { else res = clone(e,args); } catch (const cannot_simplify &){ - res = clone(e,args); + if(g == sum) + res = clone(e,args); + else + throw "interpolation failure"; } } return res;