#include "theory/quantifiers/fun_def_process.h"
#include "theory/quantifiers/macros.h"
#include "theory/quantifiers/quantifiers_rewriter.h"
-#include "theory/sep/theory_sep.h"
#include "theory/sort_inference.h"
#include "theory/strings/theory_strings.h"
#include "theory/substitutions.h"
dumpAssertions("post-bv-to-bool", d_assertions);
Trace("smt") << "POST bvToBool" << endl;
}
- if( d_smt.d_logic.isTheoryEnabled(THEORY_SEP) ) {
- //separation logic solver needs to register the entire input
- ((theory::sep::TheorySep*)d_smt.d_theoryEngine->theoryOf(THEORY_SEP))->processAssertions( d_assertions.ref() );
- }
if( d_smt.d_logic.isQuantified() ){
Trace("smt-proc") << "SmtEnginePrivate::processAssertions() : pre-quant-preprocess" << endl;
- //remove rewrite rules
- for( unsigned i=0; i < d_assertions.size(); i++ ) {
- if( d_assertions[i].getKind() == kind::REWRITE_RULE ){
- Node prev = d_assertions[i];
- Trace("quantifiers-rewrite-debug") << "Rewrite rewrite rule " << prev << "..." << std::endl;
- d_assertions.replace(i, Rewriter::rewrite( quantifiers::QuantifiersRewriter::rewriteRewriteRule( d_assertions[i] ) ) );
- Trace("quantifiers-rewrite") << "*** rr-rewrite " << prev << endl;
- Trace("quantifiers-rewrite") << " ...got " << d_assertions[i] << endl;
- }
- }
dumpAssertions("pre-skolem-quant", d_assertions);
- if( options::preSkolemQuant() ){
- //apply pre-skolemization to existential quantifiers
- for (unsigned i = 0; i < d_assertions.size(); ++ i) {
- Node prev = d_assertions[i];
- Node next = quantifiers::QuantifiersRewriter::preprocess( prev );
- if( next!=prev ){
- d_assertions.replace(i, Rewriter::rewrite( next ));
- Trace("quantifiers-preprocess") << "*** Pre-skolemize " << prev << endl;
- Trace("quantifiers-preprocess") << " ...got " << d_assertions[i] << endl;
- }
+ //remove rewrite rules, apply pre-skolemization to existential quantifiers
+ for (unsigned i = 0; i < d_assertions.size(); ++ i) {
+ Node prev = d_assertions[i];
+ Node next = quantifiers::QuantifiersRewriter::preprocess( prev );
+ if( next!=prev ){
+ d_assertions.replace( i, Rewriter::rewrite( next ) );
+ Trace("quantifiers-preprocess") << "*** Pre-skolemize " << prev << endl;
+ Trace("quantifiers-preprocess") << " ...got " << d_assertions[i] << endl;
}
}
dumpAssertions("post-skolem-quant", d_assertions);
m->addSubstitution(eager_atom, atom);
}
}
-
+
+ //notify theory engine new preprocessed assertions
+ d_smt.d_theoryEngine->notifyPreprocessedAssertions( d_assertions.ref() );
+
// Push the formula to decision engine
if(noConflict) {
Chat() << "pushing to decision engine..." << endl;
Trace("smt-proc") << "SmtEnginePrivate::processAssertions() end" << endl;
dumpAssertions("post-everything", d_assertions);
-
- //set instantiation level of everything to zero
- if( options::instLevelInputOnly() && options::instMaxLevel()!=-1 ){
- for( unsigned i=0; i < d_assertions.size(); i++ ) {
- theory::QuantifiersEngine::setInstantiationLevelAttr( d_assertions[i], 0 );
- }
- }
-
// Push the formula to SAT
{
Chat() << "converting to CNF..." << endl;
Node QuantifiersRewriter::preprocess( Node n, bool isInst ) {
Node prev = n;
- if( options::preSkolemQuant() ){
- if( !isInst || !options::preSkolemQuantNested() ){
- Trace("quantifiers-preprocess-debug") << "Pre-skolemize " << n << "..." << std::endl;
- //apply pre-skolemization to existential quantifiers
- std::vector< TypeNode > fvTypes;
- std::vector< TNode > fvs;
- n = quantifiers::QuantifiersRewriter::preSkolemizeQuantifiers( prev, true, fvTypes, fvs );
+ if( n.getKind() == kind::REWRITE_RULE ){
+ n = quantifiers::QuantifiersRewriter::rewriteRewriteRule( n );
+ }else{
+ if( options::preSkolemQuant() ){
+ if( !isInst || !options::preSkolemQuantNested() ){
+ Trace("quantifiers-preprocess-debug") << "Pre-skolemize " << n << "..." << std::endl;
+ //apply pre-skolemization to existential quantifiers
+ std::vector< TypeNode > fvTypes;
+ std::vector< TNode > fvs;
+ n = quantifiers::QuantifiersRewriter::preSkolemizeQuantifiers( prev, true, fvTypes, fvs );
+ }
}
}
if( n!=prev ){
- Trace("quantifiers-preprocess") << "Preprocess " << prev<< std::endl;
+ Trace("quantifiers-preprocess") << "Preprocess " << prev << std::endl;
Trace("quantifiers-preprocess") << "..returned " << n << std::endl;
}
return n;
}
}
+void TheoryQuantifiers::ppNotifyAssertions( std::vector< Node >& assertions ) {
+ getQuantifiersEngine()->ppNotifyAssertions( assertions );
+}
+
Node TheoryQuantifiers::getValue(TNode n) {
//NodeManager* nodeManager = NodeManager::currentNM();
switch(n.getKind()) {
void notifyEq(TNode lhs, TNode rhs);
void preRegisterTerm(TNode n);
void presolve();
+ void ppNotifyAssertions( std::vector< Node >& assertions );
void check(Effort e);
Node getNextDecisionRequest();
Node getValue(TNode n);
}
}
+void QuantifiersEngine::ppNotifyAssertions( std::vector< Node >& assertions ) {
+ if( options::instLevelInputOnly() && options::instMaxLevel()!=-1 ){
+ for( unsigned i=0; i<assertions.size(); i++ ) {
+ setInstantiationLevelAttr( assertions[i], 0 );
+ }
+ }
+}
+
void QuantifiersEngine::check( Theory::Effort e ){
CodeTimer codeTimer(d_statistics.d_time);
if( !getMasterEqualityEngine()->consistent() ){
InstLevelAttribute ila;
n.setAttribute(ila,level);
Trace("inst-level-debug") << "Set instantiation level " << n << " to " << level << std::endl;
- }
- Assert( n.getNumChildren()==qn.getNumChildren() );
- for( unsigned i=0; i<n.getNumChildren(); i++ ){
- setInstantiationLevelAttr( n[i], qn[i], level );
+ Assert( n.getNumChildren()==qn.getNumChildren() );
+ for( unsigned i=0; i<n.getNumChildren(); i++ ){
+ setInstantiationLevelAttr( n[i], qn[i], level );
+ }
}
}
}
InstLevelAttribute ila;
n.setAttribute(ila,level);
Trace("inst-level-debug") << "Set instantiation level " << n << " to " << level << std::endl;
- }
- for( unsigned i=0; i<n.getNumChildren(); i++ ){
- setInstantiationLevelAttr( n[i], level );
+ for( unsigned i=0; i<n.getNumChildren(); i++ ){
+ setInstantiationLevelAttr( n[i], level );
+ }
}
}
void finishInit();
/** presolve */
void presolve();
+ /** notify preprocessed assertion */
+ void ppNotifyAssertions( std::vector< Node >& assertions );
/** check at level */
void check( Theory::Effort e );
/** notify that theories were combined */
}
//must process assertions at preprocess so that quantified assertions are processed properly
-void TheorySep::processAssertions( std::vector< Node >& assertions ) {
+void TheorySep::ppNotifyAssertions( std::vector< Node >& assertions ) {
d_pp_nils.clear();
std::map< Node, bool > visited;
for( unsigned i=0; i<assertions.size(); i++ ){
PPAssertStatus ppAssert(TNode in, SubstitutionMap& outSubstitutions);
Node ppRewrite(TNode atom);
- void processAssertions( std::vector< Node >& assertions );
+ void ppNotifyAssertions( std::vector< Node >& assertions );
/////////////////////////////////////////////////////////////////////////////
// T-PROPAGATION / REGISTRATION
/////////////////////////////////////////////////////////////////////////////
* Don't preprocess subterm of this term
*/
virtual bool ppDontRewriteSubterm(TNode atom) { return false; }
+
+ /** notify preprocessed assertions
+ * Called on new assertions after preprocessing before they are asserted to theory engine.
+ * Should not modify assertions.
+ */
+ virtual void ppNotifyAssertions( std::vector< Node >& assertions ) {}
/**
* A Theory is called with presolve exactly one time per user
return d_ppCache[assertion];
}
+void TheoryEngine::notifyPreprocessedAssertions( std::vector< Node >& assertions ){
+ // call all the theories
+ for(TheoryId theoryId = theory::THEORY_FIRST; theoryId < theory::THEORY_LAST; ++theoryId) {
+ if(d_theoryTable[theoryId]) {
+ theoryOf(theoryId)->ppNotifyAssertions( assertions );
+ }
+ }
+}
+
bool TheoryEngine::markPropagation(TNode assertion, TNode originalAssertion, theory::TheoryId toTheoryId, theory::TheoryId fromTheoryId) {
// What and where we are asserting
*/
Node preprocess(TNode node);
+
+ /**
+ * Notify (preprocessed) assertions
+ */
+ void notifyPreprocessedAssertions( std::vector< Node >& assertions );
+
/**
* Return whether or not we are incomplete (in the current context).
*/