return _current_query;
}
+ // return a vector of the levels.
+ // before returning any vector with >1 nodes is turned into a conjunct.
+ const ASTVec STPMgr::getVectorOfAsserts()
+ {
+ vector<ASTVec *>::iterator it = _asserts.begin();
+ vector<ASTVec *>::iterator itend = _asserts.end();
+
+ ASTVec result;
+ for(; it != itend; it++)
+ {
+ ASTVec& a = (**it);
+ if (a.size() ==0)
+ a.push_back(ASTTrue);
+ else if (a.size() > 1)
+ {
+ ASTNode conjunct = defaultNodeFactory->CreateNode(AND,a);
+ a.resize(0);
+ a.push_back(conjunct);
+ }
+
+ result.push_back(a[0]);
+ }
+
+ return result;
+ }
+
const ASTVec
STPMgr::GetAsserts(void)
{
{(*it)->iteration = 0;}
}
+ int getAssertLevel()
+ {
+ return _asserts.size();
+ }
+
private:
// Stack of Logical Context. each entry in the stack is a logical
void Push(void);
const ASTNode PopQuery();
const ASTNode GetQuery();
- const ASTVec GetAsserts(void);
+ const ASTVec GetAsserts();
+ const ASTVec getVectorOfAsserts();
+
//add a query/assertion to the current logical context
void AddQuery(const ASTNode& q);
namespace BEEV
{
-
-
-// Does some simple caching of prior results.
+ // Does some simple caching of prior results.
+ // Assumes that there is one node for each level!!!
void
- Cpp_interface::checkSat(vector<ASTVec> & assertionsSMT2)
+ Cpp_interface::checkSat(const ASTVec & assertionsSMT2)
{
bm.GetRunTimes()->stop(RunTimes::Parsing);
+
assert(assertionsSMT2.size() == cache.size());
Entry& cacheEntry = cache.back();
- //cerr << "------------" << endl;
- //printStatus();
-
if ((cacheEntry.result == SOLVER_SATISFIABLE || cacheEntry.result == SOLVER_UNSATISFIABLE)
- && (assertionsSMT2.back().size() ==1 && assertionsSMT2.back()[0] == cacheEntry.node))
+ && (assertionsSMT2.back() == cacheEntry.node))
{ // If we already know the answer then return.
if (bm.UserFlags.quick_statistics_flag)
{
bm.ClearAllTables();
GlobalSTP->ClearAllTables();
- // Loop through the set of assertions converting them to single nodes..
- ASTVec v;
- for (int i = 0; i < assertionsSMT2.size(); i++)
- {
- if (assertionsSMT2[i].size() == 1)
- {}
- else if (assertionsSMT2[i].size() == 0)
- assertionsSMT2[i].push_back(bm.ASTTrue);
- else
- {
- ASTNode v = parserInterface->CreateNode(AND, assertionsSMT2[i]);
- assertionsSMT2[i].clear();
- assertionsSMT2[i].push_back(v);
- }
- assert(assertionsSMT2[i].size() ==1);
- v.push_back(assertionsSMT2[i][0]);
- }
-
ASTNode query;
- if (v.size() > 1)
- query = parserInterface->CreateNode(AND, v);
- else if (v.size() > 0)
- query = v[0];
+ if (assertionsSMT2.size() >= 1)
+ query = parserInterface->CreateNode(AND, assertionsSMT2);
+ else if (assertionsSMT2.size() == 1)
+ query = assertionsSMT2[0];
else
query = bm.ASTTrue;
if (last_result ==SOLVER_SATISFIABLE || last_result ==SOLVER_UNSATISFIABLE)
{
Entry e(last_result);
- e.node = assertionsSMT2.back()[0];
+ e.node = assertionsSMT2.back();
cacheEntry = e;
assert (!cacheEntry.node.IsNull());
}
vector<Entry> cache;
vector<vector<ASTNode> > symbols;
+ void checkInvariant()
+ {
+ assert(bm.getAssertLevel() == cache.size());
+ assert(bm.getAssertLevel() == symbols.size());
+ }
public:
LETMgr letMgr;
{
assert(nf != NULL);
alreadyWarned = false;
+
cache.push_back(Entry(SOLVER_UNDECIDED));
symbols.push_back(ASTVec());
+
+ if (bm.getVectorOfAsserts().size() ==0)
+ bm.Push();
+
print_success = false;
}
return bm.GetAsserts();
}
+ const ASTVec
+ getAssertVector(void)
+ {
+ return bm.getVectorOfAsserts();
+ }
+
UserDefinedFlags&
getUserFlags()
{
if (symbols.size() == 1)
FatalError("Can't pop away the default base element.");
+ bm.Pop();
+
assert(symbols.size() == cache.size());
cache.erase(cache.end() - 1);
ASTVec & current = symbols.back();
for (int i = 0; i < current.size(); i++)
letMgr._parser_symbol_table.erase(current[i]);
symbols.erase(symbols.end() - 1);
+ checkInvariant();
}
void
else
cache.push_back(Entry(SOLVER_UNDECIDED));
+ bm.Push();
symbols.push_back(ASTVec());
assert(symbols.size() == cache.size());
+ checkInvariant();
}
void
}
void
- checkSat(vector<ASTVec> & assertionsSMT2);
+ checkSat(const ASTVec & assertionsSMT2);
void
cleanUp()
using namespace BEEV;
extern int smtparse(void*);
-extern int smt2parse(void*);
+extern int smt2parse();
extern int cvcparse(void*);
extern int cvclex_destroy(void);
extern int smtlex_destroy(void);
extern int smt2lex_destroy(void);
-extern vector<ASTVec> assertionsSMT2;
// callback for SIGALRM.
void handle_time_out(int parameter){
smtparse((void*) AssertsQuery);
smtlex_destroy();
} else if (bm->UserFlags.smtlib2_parser_flag) {
- assertionsSMT2.push_back(ASTVec());
- smt2parse((void*) AssertsQuery);
- //parserInterface->letMgr.cleanupParserSymbolTable();
+ smt2parse();
smt2lex_destroy();
} else {
cvcparse((void*) AssertsQuery);
return 1;
}
- ASTNode querysmt2;
- vector<ASTVec> assertionsSMT2;
-
+
#define YYLTYPE_IS_TRIVIAL 1
#define YYMAXDEPTH 104857600
#define YYERROR_VERBOSE 1
#define YY_EXIT_FAILURE -1
-#define YYPARSE_PARAM AssertsQuery
+
%}
%union {
%%
cmd: commands END
{
- querysmt2 = ASTNode();
- assertionsSMT2.clear();
parserInterface->cleanUp();
YYACCEPT;
}
cmdi:
LPAREN_TOK EXIT_TOK RPAREN_TOK
{
- querysmt2 = ASTNode();
- assertionsSMT2.clear();
parserInterface->cleanUp();
YYACCEPT;
}
| LPAREN_TOK CHECK_SAT_TOK RPAREN_TOK
{
- parserInterface->checkSat(assertionsSMT2);
+ parserInterface->checkSat(parserInterface->getAssertVector());
}
|
LPAREN_TOK LOGIC_TOK STRING_TOK RPAREN_TOK
for (int i=0; i < $3;i++)
{
parserInterface->push();
- assertionsSMT2.push_back(ASTVec());
}
parserInterface->success();
}
| LPAREN_TOK POP_TOK NUMERAL_TOK RPAREN_TOK
{
for (int i=0; i < $3;i++)
- {
parserInterface->pop();
- assertionsSMT2.erase(assertionsSMT2.end()-1);
- }
parserInterface->success();
}
| LPAREN_TOK DECLARE_FUNCTION_TOK var_decl RPAREN_TOK
}
| LPAREN_TOK FORMULA_TOK an_formula RPAREN_TOK
{
- assertionsSMT2.back().push_back(*$3);
+ parserInterface->AddAssert(*$3);
parserInterface->deleteNode($3);
parserInterface->success();
}