MINISAT::UnsoundSimpSolver newS;
#endif
+ if(bm->UserFlags.num_absrefine_flag
+ && !bm->UserFlags.arrayread_refinement_flag)
+ {
+ res =
+ Ctr_Example->UserGuided_AbsRefine(newS,
+ orig_input);
+ return res;
+ }
+
if (bm->UserFlags.arrayread_refinement_flag)
{
bm->counterexample_checking_during_refinement = true;
letmgr = new LETMgr(ASTUndefined);
runTimes = new RunTimes();
_current_query = ASTUndefined;
+ UserFlags.num_absrefine = 2;
}
//Return ptr to let-variables manager (see parser/let-funcs.h)
namespace BEEV
{
-
/******************************************************************
* Abstraction Refinement related functions
******************************************************************/
return arraywrite_axiom;
}//end of Create_ArrayWriteAxioms()
-
//UserGuided abstraction refinement
SOLVER_RETURN_TYPE
AbsRefine_CounterExample::
FatalError("UserGuided_AbsRefine: Something is seriously wrong."\
"The input set is empty");
}
- ASTNode sureAddInput = (v.size() == 1) ? v[0] : bm->CreateNode(AND, v);
+ ASTNode sureAddInput =
+ (v.size() == 1) ? v[0] : bm->CreateNode(AND, v);
SOLVER_RETURN_TYPE res = SOLVER_UNDECIDED;
res = CallSAT_ResultCheck(SatSolver, sureAddInput, original_input);
}
//Do refinement here
-
+ if(AND != original_input.GetKind())
+ {
+ FatalError("UserGuided_AbsRefine: The input must be an AND");
+ }
+ ASTVec RefineFormulasVec;
+ ASTVec RemainingFormulasVec;
+ for(int count=0; count < bm->UserFlags.num_absrefine; count++)
+ {
+ RemainingFormulasVec.clear();
+ RemainingFormulasVec.push_back(ASTTrue);
+ RefineFormulasVec.clear();
+ RefineFormulasVec.push_back(ASTTrue);
+ ASTVec InputKids = original_input.GetChildren();
+ for(ASTVec::iterator it = InputKids.begin(), itend = InputKids.end();
+ it!=itend;it++)
+ {
+ ClearComputeFormulaMap();
+ if(ASTFalse == ComputeFormulaUsingModel(*it))
+ {
+ RefineFormulasVec.push_back(*it);
+ }
+ else
+ {
+ RemainingFormulasVec.push_back(*it);
+ }
+ }
+ ASTNode RefineFormulas =
+ (RefineFormulasVec.size() == 1) ?
+ RefineFormulasVec[0] : bm->CreateNode(AND, RefineFormulasVec);
+ res = CallSAT_ResultCheck(SatSolver, RefineFormulas, original_input);
+ if(SOLVER_UNDECIDED != res)
+ {
+ return res;
+ }
+ }
+ ASTNode RemainingFormulas =
+ (RemainingFormulasVec.size() == 1) ?
+ RemainingFormulasVec[0] : bm->CreateNode(AND, RemainingFormulasVec);
+ res = CallSAT_ResultCheck(SatSolver, RemainingFormulas, original_input);
return res;
} //End of UserGuided_AbsRefine()
extern int cvcparse(void*);
extern int smtparse(void*);
-void vc_setFlags(VC vc, char c) {
+void vc_setFlags(VC vc, char c, int num_absrefine) {
bmstar b = (bmstar)(((stpstar)vc)->bm);
std::string helpstring =
break;
case 'f':
b->UserFlags.num_absrefine_flag = true;
- //b->UserFlags.num_absrefine = atoi(argv[++i]);
+ b->UserFlags.num_absrefine = num_absrefine;
break;
case 'h':
fprintf(stderr,BEEV::usage,BEEV::prog);
/////////////////////////////////////////////////////////////////////////////
//! Assert a new formula in the current context.
/*! The formula must have Boolean type. */
-void vc_assertFormula(VC vc, Expr e, int absrefine_num) {
+void vc_assertFormula(VC vc, Expr e, int absrefine_bucket_num) {
nodestar a = (nodestar)e;
bmstar b = (bmstar)(((stpstar)vc)->bm);
BEEV::FatalError("Trying to assert a NON formula: ",*a);
BVTypeCheck(*a);
- b->AddAssert(*a);
+ b->AddAssert(*a, absrefine_bucket_num);
}
// h : help
// s : stats
// v : print nodes
- void vc_setFlags(VC vc, char c);
+ void vc_setFlags(VC vc, char c, int num_absrefine=0);
//! Flags can be NULL
VC vc_createValidityChecker(void);
//! Assert a new formula in the current context.
/*! The formula must have Boolean type. */
- void vc_assertFormula(VC vc, Expr e, int absrefine_num=0);
+ void vc_assertFormula(VC vc, Expr e, int absrefine_bucket_num=0);
//! Simplify e with respect to the current context
Expr vc_simplify(VC vc, Expr e);