summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/theory/combination_engine.cpp12
-rw-r--r--src/theory/combination_engine.h7
-rw-r--r--src/theory/ee_manager.h14
-rw-r--r--src/theory/ee_manager_distributed.cpp70
-rw-r--r--src/theory/ee_manager_distributed.h5
-rw-r--r--src/theory/ee_setup_info.h10
-rw-r--r--src/theory/quantifiers/cegqi/ceg_instantiator.cpp7
-rw-r--r--src/theory/quantifiers/ematching/candidate_generator.cpp12
-rw-r--r--src/theory/quantifiers/ematching/ho_trigger.cpp8
-rw-r--r--src/theory/quantifiers/ematching/inst_match_generator.cpp26
-rw-r--r--src/theory/quantifiers/ematching/inst_match_generator_multi.cpp15
-rw-r--r--src/theory/quantifiers/ematching/inst_match_generator_simple.cpp14
-rw-r--r--src/theory/quantifiers/ematching/instantiation_engine.cpp7
-rw-r--r--src/theory/quantifiers/ematching/trigger.cpp2
-rw-r--r--src/theory/quantifiers/ematching/var_match_generator.cpp2
-rw-r--r--src/theory/quantifiers/equality_query.cpp74
-rw-r--r--src/theory/quantifiers/equality_query.h36
-rw-r--r--src/theory/quantifiers/fmf/full_model_check.cpp2
-rw-r--r--src/theory/quantifiers/fmf/model_engine.cpp3
-rw-r--r--src/theory/quantifiers/inst_match.cpp32
-rw-r--r--src/theory/quantifiers/inst_match.h13
-rw-r--r--src/theory/quantifiers/inst_match_trie.cpp14
-rw-r--r--src/theory/quantifiers/inst_match_trie.h1
-rw-r--r--src/theory/quantifiers/inst_strategy_enumerative.cpp4
-rw-r--r--src/theory/quantifiers/quant_conflict_find.cpp2
-rw-r--r--src/theory/quantifiers/quant_util.cpp8
-rw-r--r--src/theory/quantifiers/quant_util.h26
-rw-r--r--src/theory/quantifiers/relevant_domain.cpp7
-rw-r--r--src/theory/quantifiers/relevant_domain.h2
-rw-r--r--src/theory/quantifiers/term_database.cpp174
-rw-r--r--src/theory/quantifiers/term_database.h97
-rw-r--r--src/theory/quantifiers/theory_quantifiers.cpp9
-rw-r--r--src/theory/quantifiers/theory_quantifiers.h2
-rw-r--r--src/theory/quantifiers_engine.cpp29
-rw-r--r--src/theory/quantifiers_engine.h17
-rw-r--r--src/theory/theory_engine.cpp3
-rw-r--r--src/theory/theory_state.cpp20
-rw-r--r--src/theory/theory_state.h2
38 files changed, 315 insertions, 473 deletions
diff --git a/src/theory/combination_engine.cpp b/src/theory/combination_engine.cpp
index 5e242659f..71eac49a0 100644
--- a/src/theory/combination_engine.cpp
+++ b/src/theory/combination_engine.cpp
@@ -77,21 +77,11 @@ const EeTheoryInfo* CombinationEngine::getEeTheoryInfo(TheoryId tid) const
return d_eemanager->getEeTheoryInfo(tid);
}
-eq::EqualityEngine* CombinationEngine::getCoreEqualityEngine()
-{
- return d_eemanager->getCoreEqualityEngine();
-}
-
void CombinationEngine::resetModel() { d_mmanager->resetModel(); }
void CombinationEngine::postProcessModel(bool incomplete)
{
- // should have a consistent core equality engine
- eq::EqualityEngine* mee = d_eemanager->getCoreEqualityEngine();
- if (mee != nullptr)
- {
- AlwaysAssert(mee->consistent());
- }
+ d_eemanager->notifyModel(incomplete);
// postprocess with the model
d_mmanager->postProcessModel(incomplete);
}
diff --git a/src/theory/combination_engine.h b/src/theory/combination_engine.h
index 4413da603..765a49d68 100644
--- a/src/theory/combination_engine.h
+++ b/src/theory/combination_engine.h
@@ -49,15 +49,8 @@ class CombinationEngine
/** Finish initialization */
void finishInit();
- //-------------------------- equality engine
/** Get equality engine theory information for theory with identifier tid. */
const EeTheoryInfo* getEeTheoryInfo(TheoryId tid) const;
- /**
- * Get the "core" equality engine. This is the equality engine that
- * quantifiers should use.
- */
- eq::EqualityEngine* getCoreEqualityEngine();
- //-------------------------- end equality engine
//-------------------------- model
/**
* Reset the model maintained by this class. This resets all local information
diff --git a/src/theory/ee_manager.h b/src/theory/ee_manager.h
index 6e40ceb7b..5b8dc3b93 100644
--- a/src/theory/ee_manager.h
+++ b/src/theory/ee_manager.h
@@ -73,17 +73,17 @@ class EqEngineManager
* Get the equality engine theory information for theory with the given id.
*/
const EeTheoryInfo* getEeTheoryInfo(TheoryId tid) const;
- /**
- * Get the core equality engine, which is the equality engine that the
- * quantifiers engine should use. This corresponds to the master equality
- * engine if eeMode is distributed, or the central equality engine if eeMode
- * is central.
- */
- virtual eq::EqualityEngine* getCoreEqualityEngine() = 0;
/** Allocate equality engine that is context-dependent on c with info esi */
eq::EqualityEngine* allocateEqualityEngine(EeSetupInfo& esi,
context::Context* c);
+ /**
+ * Notify this class that we are about to terminate with a model. This method
+ * is for debugging only.
+ *
+ * @param incomplete Whether we are answering "unknown" instead of "sat".
+ */
+ virtual void notifyModel(bool incomplete) {}
protected:
/** Reference to the theory engine */
diff --git a/src/theory/ee_manager_distributed.cpp b/src/theory/ee_manager_distributed.cpp
index 3fb5fc0ce..496b04a52 100644
--- a/src/theory/ee_manager_distributed.cpp
+++ b/src/theory/ee_manager_distributed.cpp
@@ -47,6 +47,19 @@ void EqEngineManagerDistributed::initializeTheories()
Unhandled() << "Expected shared solver to use equality engine";
}
+ const LogicInfo& logicInfo = d_te.getLogicInfo();
+ if (logicInfo.isQuantified())
+ {
+ // construct the master equality engine
+ Assert(d_masterEqualityEngine == nullptr);
+ QuantifiersEngine* qe = d_te.getQuantifiersEngine();
+ Assert(qe != nullptr);
+ d_masterEENotify.reset(new MasterNotifyClass(qe));
+ d_masterEqualityEngine.reset(new eq::EqualityEngine(*d_masterEENotify.get(),
+ d_te.getSatContext(),
+ "theory::master",
+ false));
+ }
// allocate equality engines per theory
for (TheoryId theoryId = theory::THEORY_FIRST;
theoryId != theory::THEORY_LAST;
@@ -63,48 +76,34 @@ void EqEngineManagerDistributed::initializeTheories()
EeSetupInfo esi;
if (!t->needsEqualityEngine(esi))
{
- // theory said it doesn't need an equality engine, skip
+ // the theory said it doesn't need an equality engine, skip
+ continue;
+ }
+ if (esi.d_useMaster)
+ {
+ // the theory said it wants to use the master equality engine
+ eet.d_usedEe = d_masterEqualityEngine.get();
continue;
}
// allocate the equality engine
eet.d_allocEe.reset(allocateEqualityEngine(esi, c));
// the theory uses the equality engine
eet.d_usedEe = eet.d_allocEe.get();
+ // if there is a master equality engine
+ if (d_masterEqualityEngine != nullptr)
+ {
+ // set the master equality engine of the theory's equality engine
+ eet.d_allocEe->setMasterEqualityEngine(d_masterEqualityEngine.get());
+ }
}
+}
- const LogicInfo& logicInfo = d_te.getLogicInfo();
- if (logicInfo.isQuantified())
+void EqEngineManagerDistributed::notifyModel(bool incomplete)
+{
+ // should have a consistent master equality engine
+ if (d_masterEqualityEngine.get() != nullptr)
{
- // construct the master equality engine
- Assert(d_masterEqualityEngine == nullptr);
- QuantifiersEngine* qe = d_te.getQuantifiersEngine();
- Assert(qe != nullptr);
- d_masterEENotify.reset(new MasterNotifyClass(qe));
- d_masterEqualityEngine.reset(new eq::EqualityEngine(*d_masterEENotify.get(),
- d_te.getSatContext(),
- "theory::master",
- false));
-
- for (TheoryId theoryId = theory::THEORY_FIRST;
- theoryId != theory::THEORY_LAST;
- ++theoryId)
- {
- Theory* t = d_te.theoryOf(theoryId);
- if (t == nullptr)
- {
- // theory not active, skip
- continue;
- }
- EeTheoryInfo& eet = d_einfo[theoryId];
- // Get the allocated equality engine, and connect it to the master
- // equality engine.
- eq::EqualityEngine* eeAlloc = eet.d_allocEe.get();
- if (eeAlloc != nullptr)
- {
- // set the master equality engine of the theory's equality engine
- eeAlloc->setMasterEqualityEngine(d_masterEqualityEngine.get());
- }
- }
+ AlwaysAssert(d_masterEqualityEngine->consistent());
}
}
@@ -114,10 +113,5 @@ void EqEngineManagerDistributed::MasterNotifyClass::eqNotifyNewClass(TNode t)
d_quantEngine->eqNotifyNewClass(t);
}
-eq::EqualityEngine* EqEngineManagerDistributed::getCoreEqualityEngine()
-{
- return d_masterEqualityEngine.get();
-}
-
} // namespace theory
} // namespace CVC4
diff --git a/src/theory/ee_manager_distributed.h b/src/theory/ee_manager_distributed.h
index c7c1e7f4c..9578706d9 100644
--- a/src/theory/ee_manager_distributed.h
+++ b/src/theory/ee_manager_distributed.h
@@ -52,8 +52,9 @@ class EqEngineManagerDistributed : public EqEngineManager
* per theories and connects them to a master equality engine.
*/
void initializeTheories() override;
- /** get the core equality engine */
- eq::EqualityEngine* getCoreEqualityEngine() override;
+ /** Notify model */
+ void notifyModel(bool incomplete) override;
+
private:
/** notify class for master equality engine */
class MasterNotifyClass : public theory::eq::EqualityEngineNotify
diff --git a/src/theory/ee_setup_info.h b/src/theory/ee_setup_info.h
index 78f2f211e..7770cfc49 100644
--- a/src/theory/ee_setup_info.h
+++ b/src/theory/ee_setup_info.h
@@ -37,13 +37,21 @@ class EqualityEngineNotify;
*/
struct EeSetupInfo
{
- EeSetupInfo() : d_notify(nullptr), d_constantsAreTriggers(true) {}
+ EeSetupInfo()
+ : d_notify(nullptr), d_constantsAreTriggers(true), d_useMaster(false)
+ {
+ }
/** The notification class of the theory */
eq::EqualityEngineNotify* d_notify;
/** The name of the equality engine */
std::string d_name;
/** Constants are triggers */
bool d_constantsAreTriggers;
+ /**
+ * Whether we want our state to use the master equality engine. This should
+ * be true exclusively for the theory of quantifiers.
+ */
+ bool d_useMaster;
};
} // namespace theory
diff --git a/src/theory/quantifiers/cegqi/ceg_instantiator.cpp b/src/theory/quantifiers/cegqi/ceg_instantiator.cpp
index a8632c02f..411ab36b9 100644
--- a/src/theory/quantifiers/cegqi/ceg_instantiator.cpp
+++ b/src/theory/quantifiers/cegqi/ceg_instantiator.cpp
@@ -663,9 +663,10 @@ bool CegInstantiator::constructInstantiation(SolvedForm& sf,
TypeNode pvtn = pv.getType();
TypeNode pvtnb = pvtn.getBaseType();
Node pvr = pv;
- if (d_qe->getMasterEqualityEngine()->hasTerm(pv))
+ eq::EqualityEngine* ee = d_qe->getState().getEqualityEngine();
+ if (ee->hasTerm(pv))
{
- pvr = d_qe->getMasterEqualityEngine()->getRepresentative(pv);
+ pvr = ee->getRepresentative(pv);
}
Trace("cegqi-inst-debug") << "[Find instantiation for " << pv
<< "], rep=" << pvr << ", instantiator is "
@@ -1306,7 +1307,7 @@ void CegInstantiator::processAssertions() {
d_curr_type_eqc.clear();
// must use master equality engine to avoid value instantiations
- eq::EqualityEngine* ee = d_qe->getMasterEqualityEngine();
+ eq::EqualityEngine* ee = d_qe->getState().getEqualityEngine();
//for each variable
for( unsigned i=0; i<d_vars.size(); i++ ){
diff --git a/src/theory/quantifiers/ematching/candidate_generator.cpp b/src/theory/quantifiers/ematching/candidate_generator.cpp
index 0fd5249e8..cdee268d6 100644
--- a/src/theory/quantifiers/ematching/candidate_generator.cpp
+++ b/src/theory/quantifiers/ematching/candidate_generator.cpp
@@ -59,7 +59,7 @@ void CandidateGeneratorQE::resetForOperator(Node eqc, Node op)
if( isExcludedEqc( eqc ) ){
d_mode = cand_term_none;
}else{
- eq::EqualityEngine* ee = d_qe->getEqualityQuery()->getEngine();
+ eq::EqualityEngine* ee = d_qe->getState().getEqualityEngine();
if( ee->hasTerm( eqc ) ){
TNodeTrie* tat = d_qe->getTermDatabase()->getTermArgTrie(eqc, op);
if( tat ){
@@ -93,6 +93,7 @@ Node CandidateGeneratorQE::getNextCandidate(){
Node CandidateGeneratorQE::getNextCandidateInternal()
{
if( d_mode==cand_term_db ){
+ eq::EqualityEngine* ee = d_qe->getState().getEqualityEngine();
Debug("cand-gen-qe") << "...get next candidate in tbd" << std::endl;
//get next candidate term in the uf term database
while( d_term_iter<d_term_iter_limit ){
@@ -103,7 +104,7 @@ Node CandidateGeneratorQE::getNextCandidateInternal()
if( d_exclude_eqc.empty() ){
return n;
}else{
- Node r = d_qe->getEqualityQuery()->getRepresentative( n );
+ Node r = ee->getRepresentative(n);
if( d_exclude_eqc.find( r )==d_exclude_eqc.end() ){
Debug("cand-gen-qe") << "...returning " << n << std::endl;
return n;
@@ -143,8 +144,9 @@ CandidateGenerator( qe ), d_match_pattern( mpat ){
}
void CandidateGeneratorQELitDeq::reset( Node eqc ){
- Node false_term = d_qe->getEqualityQuery()->getEngine()->getRepresentative( NodeManager::currentNM()->mkConst<bool>(false) );
- d_eqc_false = eq::EqClassIterator( false_term, d_qe->getEqualityQuery()->getEngine() );
+ eq::EqualityEngine* ee = d_qe->getState().getEqualityEngine();
+ Node falset = NodeManager::currentNM()->mkConst(false);
+ d_eqc_false = eq::EqClassIterator(falset, ee);
}
Node CandidateGeneratorQELitDeq::getNextCandidate(){
@@ -177,7 +179,7 @@ CandidateGeneratorQEAll::CandidateGeneratorQEAll( QuantifiersEngine* qe, Node mp
}
void CandidateGeneratorQEAll::reset( Node eqc ) {
- d_eq = eq::EqClassesIterator( d_qe->getEqualityQuery()->getEngine() );
+ d_eq = eq::EqClassesIterator(d_qe->getState().getEqualityEngine());
d_firstTime = true;
}
diff --git a/src/theory/quantifiers/ematching/ho_trigger.cpp b/src/theory/quantifiers/ematching/ho_trigger.cpp
index cdfb9c85c..6d13ef2ee 100644
--- a/src/theory/quantifiers/ematching/ho_trigger.cpp
+++ b/src/theory/quantifiers/ematching/ho_trigger.cpp
@@ -231,7 +231,7 @@ bool HigherOrderTrigger::sendInstantiation(InstMatch& m)
d_lchildren.clear();
d_arg_to_arg_rep.clear();
d_arg_vector.clear();
- EqualityQuery* eq = d_quantEngine->getEqualityQuery();
+ quantifiers::QuantifiersState& qs = d_quantEngine->getState();
for (std::pair<const TNode, std::vector<Node> >& ha : ho_var_apps_subs)
{
TNode var = ha.first;
@@ -283,10 +283,10 @@ bool HigherOrderTrigger::sendInstantiation(InstMatch& m)
}
else if (!itf->second.isNull())
{
- if (!eq->areEqual(itf->second, args[k]))
+ if (!qs.areEqual(itf->second, args[k]))
{
if (!d_quantEngine->getTermDatabase()->isEntailed(
- itf->second.eqNode(args[k]), true, eq))
+ itf->second.eqNode(args[k]), true))
{
fixed_vals[k] = Node::null();
}
@@ -318,7 +318,7 @@ bool HigherOrderTrigger::sendInstantiation(InstMatch& m)
{
if (!itf->second.isNull())
{
- Node r = eq->getRepresentative(itf->second);
+ Node r = qs.getRepresentative(itf->second);
std::map<Node, unsigned>::iterator itfr = arg_to_rep.find(r);
if (itfr != arg_to_rep.end())
{
diff --git a/src/theory/quantifiers/ematching/inst_match_generator.cpp b/src/theory/quantifiers/ematching/inst_match_generator.cpp
index 63731c444..4cdb207f3 100644
--- a/src/theory/quantifiers/ematching/inst_match_generator.cpp
+++ b/src/theory/quantifiers/ematching/inst_match_generator.cpp
@@ -24,6 +24,7 @@
#include "theory/quantifiers/ematching/trigger.h"
#include "theory/quantifiers/ematching/var_match_generator.h"
#include "theory/quantifiers/instantiate.h"
+#include "theory/quantifiers/quantifiers_state.h"
#include "theory/quantifiers/term_database.h"
#include "theory/quantifiers/term_util.h"
#include "theory/quantifiers_engine.h"
@@ -285,7 +286,7 @@ int InstMatchGenerator::getMatch(
Trace("matching-fail") << "Internal error for match generator." << std::endl;
return -2;
}
- EqualityQuery* q = qe->getEqualityQuery();
+ quantifiers::QuantifiersState& qs = qe->getState();
bool success = true;
std::vector<int> prev;
// if t is null
@@ -303,7 +304,7 @@ int InstMatchGenerator::getMatch(
Trace("matching-debug2")
<< "Setting " << ct << " to " << t[i] << "..." << std::endl;
bool addToPrev = m.get(ct).isNull();
- if (!m.set(q, ct, t[i]))
+ if (!m.set(qs, ct, t[i]))
{
// match is in conflict
Trace("matching-fail")
@@ -319,7 +320,7 @@ int InstMatchGenerator::getMatch(
}
else if (ct == -1)
{
- if (!q->areEqual(d_match_pattern[i], t[i]))
+ if (!qs.areEqual(d_match_pattern[i], t[i]))
{
Trace("matching-fail") << "Match fail arg: " << d_match_pattern[i]
<< " and " << t[i] << std::endl;
@@ -335,7 +336,7 @@ int InstMatchGenerator::getMatch(
if (d_match_pattern.getKind() == INST_CONSTANT)
{
bool addToPrev = m.get(d_children_types[0]).isNull();
- if (!m.set(q, d_children_types[0], t))
+ if (!m.set(qs, d_children_types[0], t))
{
success = false;
}
@@ -371,7 +372,7 @@ int InstMatchGenerator::getMatch(
{
if (t.getType().isBoolean())
{
- t_match = nm->mkConst(!q->areEqual(nm->mkConst(true), t));
+ t_match = nm->mkConst(!qs.areEqual(nm->mkConst(true), t));
}
else
{
@@ -391,7 +392,7 @@ int InstMatchGenerator::getMatch(
if (!t_match.isNull())
{
bool addToPrev = m.get(v).isNull();
- if (!m.set(q, v, t_match))
+ if (!m.set(qs, v, t_match))
{
success = false;
}
@@ -467,7 +468,7 @@ bool InstMatchGenerator::reset( Node eqc, QuantifiersEngine* qe ){
// we did not properly initialize the candidate generator, thus we fail
return false;
}
- eqc = qe->getEqualityQuery()->getRepresentative( eqc );
+ eqc = qe->getState().getRepresentative(eqc);
Trace("matching-debug2") << this << " reset " << eqc << "." << std::endl;
if( !d_eq_class_rel.isNull() && d_eq_class_rel.getKind()!=INST_CONSTANT ){
d_eq_class = d_eq_class_rel;
@@ -509,7 +510,7 @@ int InstMatchGenerator::getNextMatch(Node f,
Node t = d_curr_first_candidate;
do{
Trace("matching-debug2") << "Matching candidate : " << t << std::endl;
- Assert(!qe->inConflict());
+ Assert(!qe->getState().isInConflict());
//if t not null, try to fit it into match m
if( !t.isNull() ){
if( d_curr_exclude_match.find( t )==d_curr_exclude_match.end() ){
@@ -523,7 +524,8 @@ int InstMatchGenerator::getNextMatch(Node f,
}
//get the next candidate term t
if( success<0 ){
- t = qe->inConflict() ? Node::null() : d_cg->getNextCandidate();
+ t = qe->getState().isInConflict() ? Node::null()
+ : d_cg->getNextCandidate();
}else{
d_curr_first_candidate = d_cg->getNextCandidate();
}
@@ -554,13 +556,15 @@ uint64_t InstMatchGenerator::addInstantiations(Node f,
if (sendInstantiation(tparent, m))
{
addedLemmas++;
- if( qe->inConflict() ){
+ if (qe->getState().isInConflict())
+ {
break;
}
}
}else{
addedLemmas++;
- if( qe->inConflict() ){
+ if (qe->getState().isInConflict())
+ {
break;
}
}
diff --git a/src/theory/quantifiers/ematching/inst_match_generator_multi.cpp b/src/theory/quantifiers/ematching/inst_match_generator_multi.cpp
index b4a7457a3..371bc3378 100644
--- a/src/theory/quantifiers/ematching/inst_match_generator_multi.cpp
+++ b/src/theory/quantifiers/ematching/inst_match_generator_multi.cpp
@@ -14,6 +14,7 @@
#include "theory/quantifiers/ematching/inst_match_generator_multi.h"
+#include "theory/quantifiers/quantifiers_state.h"
#include "theory/quantifiers_engine.h"
using namespace CVC4::kind;
@@ -174,7 +175,7 @@ uint64_t InstMatchGeneratorMulti::addInstantiations(Node q,
<< "...processing " << j << " / " << newMatches.size()
<< ", #lemmas = " << addedLemmas << std::endl;
processNewMatch(qe, tparent, newMatches[j], i, addedLemmas);
- if (qe->inConflict())
+ if (qe->getState().isInConflict())
{
return addedLemmas;
}
@@ -221,7 +222,7 @@ void InstMatchGeneratorMulti::processNewInstantiations(QuantifiersEngine* qe,
size_t endChildIndex,
bool modEq)
{
- Assert(!qe->inConflict());
+ Assert(!qe->getState().isInConflict());
if (childIndex == endChildIndex)
{
// m is an instantiation
@@ -256,7 +257,7 @@ void InstMatchGeneratorMulti::processNewInstantiations(QuantifiersEngine* qe,
childIndex,
endChildIndex,
modEq);
- if (qe->inConflict())
+ if (qe->getState().isInConflict())
{
break;
}
@@ -280,13 +281,13 @@ void InstMatchGeneratorMulti::processNewInstantiations(QuantifiersEngine* qe,
{
return;
}
- eq::EqualityEngine* ee = qe->getEqualityQuery()->getEngine();
+ quantifiers::QuantifiersState& qs = qe->getState();
// check modulo equality for other possible instantiations
- if (!ee->hasTerm(n))
+ if (!qs.hasTerm(n))
{
return;
}
- eq::EqClassIterator eqc(ee->getRepresentative(n), ee);
+ eq::EqClassIterator eqc(qs.getRepresentative(n), qs.getEqualityEngine());
while (!eqc.isFinished())
{
Node en = (*eqc);
@@ -304,7 +305,7 @@ void InstMatchGeneratorMulti::processNewInstantiations(QuantifiersEngine* qe,
childIndex,
endChildIndex,
modEq);
- if (qe->inConflict())
+ if (qe->getState().isInConflict())
{
break;
}
diff --git a/src/theory/quantifiers/ematching/inst_match_generator_simple.cpp b/src/theory/quantifiers/ematching/inst_match_generator_simple.cpp
index 8c3de21a9..b5ef7792d 100644
--- a/src/theory/quantifiers/ematching/inst_match_generator_simple.cpp
+++ b/src/theory/quantifiers/ematching/inst_match_generator_simple.cpp
@@ -67,6 +67,7 @@ uint64_t InstMatchGeneratorSimple::addInstantiations(Node q,
QuantifiersEngine* qe,
Trigger* tparent)
{
+ quantifiers::QuantifiersState& qs = qe->getState();
uint64_t addedLemmas = 0;
TNodeTrie* tat;
if (d_eqc.isNull())
@@ -83,16 +84,16 @@ uint64_t InstMatchGeneratorSimple::addInstantiations(Node q,
{
// iterate over all classes except r
tat = qe->getTermDatabase()->getTermArgTrie(Node::null(), d_op);
- if (tat && !qe->inConflict())
+ if (tat && !qs.isInConflict())
{
- Node r = qe->getEqualityQuery()->getRepresentative(d_eqc);
+ Node r = qs.getRepresentative(d_eqc);
for (std::pair<const TNode, TNodeTrie>& t : tat->d_data)
{
if (t.first != r)
{
InstMatch m(q);
addInstantiations(m, qe, addedLemmas, 0, &(t.second));
- if (qe->inConflict())
+ if (qs.isInConflict())
{
break;
}
@@ -105,7 +106,7 @@ uint64_t InstMatchGeneratorSimple::addInstantiations(Node q,
Debug("simple-trigger-debug")
<< "Adding instantiations based on " << tat << " from " << d_op << " "
<< d_eqc << std::endl;
- if (tat && !qe->inConflict())
+ if (tat && !qs.isInConflict())
{
InstMatch m(q);
addInstantiations(m, qe, addedLemmas, 0, tat);
@@ -146,6 +147,7 @@ void InstMatchGeneratorSimple::addInstantiations(InstMatch& m,
}
return;
}
+ quantifiers::QuantifiersState& qs = qe->getState();
if (d_match_pattern[argIndex].getKind() == INST_CONSTANT)
{
int v = d_var_num[argIndex];
@@ -162,7 +164,7 @@ void InstMatchGeneratorSimple::addInstantiations(InstMatch& m,
m.setValue(v, t);
addInstantiations(m, qe, addedLemmas, argIndex + 1, &(tt.second));
m.setValue(v, prev);
- if (qe->inConflict())
+ if (qs.isInConflict())
{
break;
}
@@ -172,7 +174,7 @@ void InstMatchGeneratorSimple::addInstantiations(InstMatch& m,
}
// inst constant from another quantified formula, treat as ground term?
}
- Node r = qe->getEqualityQuery()->getRepresentative(d_match_pattern[argIndex]);
+ Node r = qs.getRepresentative(d_match_pattern[argIndex]);
std::map<TNode, TNodeTrie>::iterator it = tat->d_data.find(r);
if (it != tat->d_data.end())
{
diff --git a/src/theory/quantifiers/ematching/instantiation_engine.cpp b/src/theory/quantifiers/ematching/instantiation_engine.cpp
index cd0ab7976..48c02f288 100644
--- a/src/theory/quantifiers/ematching/instantiation_engine.cpp
+++ b/src/theory/quantifiers/ematching/instantiation_engine.cpp
@@ -98,8 +98,9 @@ void InstantiationEngine::doInstantiationRound( Theory::Effort effort ){
Trace("inst-engine-debug")
<< " -> unfinished= "
<< (quantStatus == InstStrategyStatus::STATUS_UNFINISHED)
- << ", conflict=" << d_quantEngine->inConflict() << std::endl;
- if( d_quantEngine->inConflict() ){
+ << ", conflict=" << d_qstate.isInConflict() << std::endl;
+ if (d_qstate.isInConflict())
+ {
return;
}
else if (quantStatus == InstStrategyStatus::STATUS_UNFINISHED)
@@ -165,7 +166,7 @@ void InstantiationEngine::check(Theory::Effort e, QEffort quant_e)
{
unsigned lastWaiting = d_quantEngine->getNumLemmasWaiting();
doInstantiationRound(e);
- if (d_quantEngine->inConflict())
+ if (d_qstate.isInConflict())
{
Assert(d_quantEngine->getNumLemmasWaiting() > lastWaiting);
Trace("inst-engine") << "Conflict, added lemmas = "
diff --git a/src/theory/quantifiers/ematching/trigger.cpp b/src/theory/quantifiers/ematching/trigger.cpp
index 470120be2..b1caa739e 100644
--- a/src/theory/quantifiers/ematching/trigger.cpp
+++ b/src/theory/quantifiers/ematching/trigger.cpp
@@ -109,7 +109,7 @@ uint64_t Trigger::addInstantiations()
{
// for each ground term t that does not exist in the equality engine, we
// add a purification lemma of the form (k = t).
- eq::EqualityEngine* ee = d_quantEngine->getEqualityQuery()->getEngine();
+ eq::EqualityEngine* ee = d_quantEngine->getState().getEqualityEngine();
for (const Node& gt : d_groundTerms)
{
if (!ee->hasTerm(gt))
diff --git a/src/theory/quantifiers/ematching/var_match_generator.cpp b/src/theory/quantifiers/ematching/var_match_generator.cpp
index 0553c1745..4edacb827 100644
--- a/src/theory/quantifiers/ematching/var_match_generator.cpp
+++ b/src/theory/quantifiers/ematching/var_match_generator.cpp
@@ -52,7 +52,7 @@ int VarMatchGeneratorTermSubs::getNextMatch(Node q,
d_eq_class = Node::null();
// if( s.getType().isSubtypeOf( d_var_type ) ){
d_rm_prev = m.get(d_children_types[0]).isNull();
- if (!m.set(qe->getEqualityQuery(), d_children_types[0], s))
+ if (!m.set(qe->getState(), d_children_types[0], s))
{
return -1;
}
diff --git a/src/theory/quantifiers/equality_query.cpp b/src/theory/quantifiers/equality_query.cpp
index b8515df91..08741ef0f 100644
--- a/src/theory/quantifiers/equality_query.cpp
+++ b/src/theory/quantifiers/equality_query.cpp
@@ -33,7 +33,10 @@ namespace quantifiers {
EqualityQueryQuantifiersEngine::EqualityQueryQuantifiersEngine(
QuantifiersState& qs, QuantifiersEngine* qe)
- : d_qe(qe), d_eqi_counter(qs.getSatContext()), d_reset_count(0)
+ : d_qe(qe),
+ d_qstate(qs),
+ d_eqi_counter(qs.getSatContext()),
+ d_reset_count(0)
{
}
@@ -46,51 +49,12 @@ bool EqualityQueryQuantifiersEngine::reset( Theory::Effort e ){
return true;
}
-bool EqualityQueryQuantifiersEngine::hasTerm( Node a ){
- return getEngine()->hasTerm( a );
-}
-
-Node EqualityQueryQuantifiersEngine::getRepresentative( Node a ){
- eq::EqualityEngine* ee = getEngine();
- if( ee->hasTerm( a ) ){
- return ee->getRepresentative( a );
- }else{
- return a;
- }
-}
-
-bool EqualityQueryQuantifiersEngine::areEqual( Node a, Node b ){
- if( a==b ){
- return true;
- }else{
- eq::EqualityEngine* ee = getEngine();
- if( ee->hasTerm( a ) && ee->hasTerm( b ) ){
- return ee->areEqual( a, b );
- }else{
- return false;
- }
- }
-}
-
-bool EqualityQueryQuantifiersEngine::areDisequal( Node a, Node b ){
- if( a==b ){
- return false;
- }else{
- eq::EqualityEngine* ee = getEngine();
- if( ee->hasTerm( a ) && ee->hasTerm( b ) ){
- return ee->areDisequal( a, b, false );
- }else{
- return a.isConst() && b.isConst();
- }
- }
-}
-
Node EqualityQueryQuantifiersEngine::getInternalRepresentative(Node a,
Node q,
int index)
{
Assert(q.isNull() || q.getKind() == FORALL);
- Node r = getRepresentative( a );
+ Node r = d_qstate.getRepresentative(a);
if( options::finiteModelFind() ){
if( r.isConst() && quantifiers::TermUtil::containsUninterpretedConstant( r ) ){
//map back from values assigned by model, if any
@@ -99,7 +63,7 @@ Node EqualityQueryQuantifiersEngine::getInternalRepresentative(Node a,
if (!tr.isNull())
{
r = tr;
- r = getRepresentative( r );
+ r = d_qstate.getRepresentative(r);
}else{
if( r.getType().isSort() ){
Trace("internal-rep-warn") << "No representative for UF constant." << std::endl;
@@ -129,7 +93,7 @@ Node EqualityQueryQuantifiersEngine::getInternalRepresentative(Node a,
// find best selection for representative
Node r_best;
std::vector<Node> eqc;
- getEquivalenceClass(r, eqc);
+ d_qstate.getEquivalenceClass(r, eqc);
Trace("internal-rep-select")
<< "Choose representative for equivalence class : " << eqc
<< ", type = " << v_tn << std::endl;
@@ -180,30 +144,6 @@ Node EqualityQueryQuantifiersEngine::getInternalRepresentative(Node a,
return r_best;
}
-eq::EqualityEngine* EqualityQueryQuantifiersEngine::getEngine(){
- return d_qe->getMasterEqualityEngine();
-}
-
-void EqualityQueryQuantifiersEngine::getEquivalenceClass( Node a, std::vector< Node >& eqc ){
- eq::EqualityEngine* ee = getEngine();
- if( ee->hasTerm( a ) ){
- Node rep = ee->getRepresentative( a );
- eq::EqClassIterator eqc_iter( rep, ee );
- while( !eqc_iter.isFinished() ){
- eqc.push_back( *eqc_iter );
- eqc_iter++;
- }
- }else{
- eqc.push_back( a );
- }
- //a should be in its equivalence class
- Assert(std::find(eqc.begin(), eqc.end(), a) != eqc.end());
-}
-
-TNode EqualityQueryQuantifiersEngine::getCongruentTerm( Node f, std::vector< TNode >& args ) {
- return d_qe->getTermDatabase()->getCongruentTerm( f, args );
-}
-
//helper functions
Node EqualityQueryQuantifiersEngine::getInstance( Node n, const std::vector< Node >& eqc, std::unordered_map<TNode, Node, TNodeHashFunction>& cache ){
diff --git a/src/theory/quantifiers/equality_query.h b/src/theory/quantifiers/equality_query.h
index b82b9ae64..a3f895f54 100644
--- a/src/theory/quantifiers/equality_query.h
+++ b/src/theory/quantifiers/equality_query.h
@@ -29,11 +29,7 @@ namespace quantifiers {
/** EqualityQueryQuantifiersEngine class
*
- * This is a wrapper class around an equality engine that is used for
- * queries required by algorithms in the quantifiers theory. It uses an equality
- * engine, as determined by the quantifiers engine it points to.
- *
- * The main extension of this class wrt EqualityQuery is the function
+ * The main method of this class is the function
* getInternalRepresentative, which is used by instantiation-based methods
* that are agnostic with respect to choosing terms within an equivalence class.
* Examples of such methods are finite model finding and enumerative
@@ -41,7 +37,7 @@ namespace quantifiers {
* representative based on the internal heuristic, which is currently based on
* choosing the term that was previously chosen as a representative earliest.
*/
-class EqualityQueryQuantifiersEngine : public EqualityQuery
+class EqualityQueryQuantifiersEngine : public QuantifiersUtil
{
public:
EqualityQueryQuantifiersEngine(QuantifiersState& qs, QuantifiersEngine* qe);
@@ -52,32 +48,6 @@ class EqualityQueryQuantifiersEngine : public EqualityQuery
void registerQuantifier(Node q) override {}
/** identify */
std::string identify() const override { return "EqualityQueryQE"; }
- /** does the equality engine have term a */
- bool hasTerm(Node a) override;
- /** get the representative of a */
- Node getRepresentative(Node a) override;
- /** are a and b equal? */
- bool areEqual(Node a, Node b) override;
- /** are a and b disequal? */
- bool areDisequal(Node a, Node b) override;
- /** get equality engine
- * This may either be the master equality engine or the model's equality
- * engine.
- */
- eq::EqualityEngine* getEngine() override;
- /** get list of members in the equivalence class of a */
- void getEquivalenceClass(Node a, std::vector<Node>& eqc) override;
- /** get congruent term
- * If possible, returns a term n such that:
- * (1) n is a term in the equality engine from getEngine().
- * (2) n is of the form f( t1, ..., tk ) where ti is in the equivalence class
- * of args[i] for i=1...k
- * Otherwise, returns the null node.
- *
- * Notice that f should be a "match operator", returned by
- * TermDb::getMatchOperator.
- */
- TNode getCongruentTerm(Node f, std::vector<TNode>& args) override;
/** gets the current best representative in the equivalence
* class of a, based on some heuristic. Currently, the default heuristic
* chooses terms that were previously chosen as representatives
@@ -97,6 +67,8 @@ class EqualityQueryQuantifiersEngine : public EqualityQuery
private:
/** pointer to theory engine */
QuantifiersEngine* d_qe;
+ /** the quantifiers state */
+ QuantifiersState& d_qstate;
/** quantifiers equality inference */
context::CDO< unsigned > d_eqi_counter;
/** internal representatives */
diff --git a/src/theory/quantifiers/fmf/full_model_check.cpp b/src/theory/quantifiers/fmf/full_model_check.cpp
index b2c7bf704..053174d07 100644
--- a/src/theory/quantifiers/fmf/full_model_check.cpp
+++ b/src/theory/quantifiers/fmf/full_model_check.cpp
@@ -358,7 +358,7 @@ bool FullModelChecker::processBuildModel(TheoryModel* m){
Node r = fm->getRepresentative( it->second[a] );
if( Trace.isOn("fmc-model-debug") ){
std::vector< Node > eqc;
- d_qe->getEqualityQuery()->getEquivalenceClass( r, eqc );
+ d_qstate.getEquivalenceClass(r, eqc);
Trace("fmc-model-debug") << " " << (it->second[a]==r);
Trace("fmc-model-debug") << " : " << it->second[a] << " : " << r << " : ";
//Trace("fmc-model-debug") << r2 << " : " << ir << " : ";
diff --git a/src/theory/quantifiers/fmf/model_engine.cpp b/src/theory/quantifiers/fmf/model_engine.cpp
index 4d74c1697..427d82e7c 100644
--- a/src/theory/quantifiers/fmf/model_engine.cpp
+++ b/src/theory/quantifiers/fmf/model_engine.cpp
@@ -279,14 +279,13 @@ void ModelEngine::exhaustiveInstantiate( Node f, int effort ){
if( !riter.isIncomplete() ){
int triedLemmas = 0;
int addedLemmas = 0;
- EqualityQuery* qy = d_quantEngine->getEqualityQuery();
Instantiate* inst = d_quantEngine->getInstantiate();
while( !riter.isFinished() && ( addedLemmas==0 || !options::fmfOneInstPerRound() ) ){
//instantiation was not shown to be true, construct the match
InstMatch m( f );
for (unsigned i = 0; i < riter.getNumTerms(); i++)
{
- m.set(qy, i, riter.getCurrentTerm(i));
+ m.set(d_qstate, i, riter.getCurrentTerm(i));
}
Debug("fmf-model-eval") << "* Add instantiation " << m << std::endl;
triedLemmas++;
diff --git a/src/theory/quantifiers/inst_match.cpp b/src/theory/quantifiers/inst_match.cpp
index b2b58220a..5d6779406 100644
--- a/src/theory/quantifiers/inst_match.cpp
+++ b/src/theory/quantifiers/inst_match.cpp
@@ -45,24 +45,6 @@ void InstMatch::add(InstMatch& m)
}
}
-bool InstMatch::merge( EqualityQuery* q, InstMatch& m ){
- Assert(d_vals.size() == m.d_vals.size());
- for (unsigned i = 0, size = d_vals.size(); i < size; i++)
- {
- if( !m.d_vals[i].isNull() ){
- if( d_vals[i].isNull() ){
- d_vals[i] = m.d_vals[i];
- }else{
- if( !q->areEqual( d_vals[i], m.d_vals[i]) ){
- clear();
- return false;
- }
- }
- }
- }
- return true;
-}
-
void InstMatch::debugPrint( const char* c ){
for (unsigned i = 0, size = d_vals.size(); i < size; i++)
{
@@ -111,20 +93,14 @@ void InstMatch::setValue(size_t i, TNode n)
Assert(i < d_vals.size());
d_vals[i] = n;
}
-bool InstMatch::set(EqualityQuery* q, size_t i, TNode n)
+bool InstMatch::set(quantifiers::QuantifiersState& qs, size_t i, TNode n)
{
Assert(i < d_vals.size());
if( !d_vals[i].isNull() ){
- if (q->areEqual(d_vals[i], n))
- {
- return true;
- }else{
- return false;
- }
- }else{
- d_vals[i] = n;
- return true;
+ return qs.areEqual(d_vals[i], n);
}
+ d_vals[i] = n;
+ return true;
}
}/* CVC4::theory::inst namespace */
diff --git a/src/theory/quantifiers/inst_match.h b/src/theory/quantifiers/inst_match.h
index a51c0ecdc..e3d7909b7 100644
--- a/src/theory/quantifiers/inst_match.h
+++ b/src/theory/quantifiers/inst_match.h
@@ -24,7 +24,9 @@
namespace CVC4 {
namespace theory {
-class EqualityQuery;
+namespace quantifiers {
+class QuantifiersState;
+}
namespace inst {
@@ -50,13 +52,6 @@ public:
* not already initialized in this match.
*/
void add(InstMatch& m);
- /** merge with match m
- *
- * This method returns true if the merge was successful, that is, all jointly
- * initialized fields of this class and m are equivalent modulo the equalities
- * given by q.
- */
- bool merge( EqualityQuery* q, InstMatch& m );
/** is this complete, i.e. are all fields non-null? */
bool isComplete();
/** is this empty, i.e. are all fields the null node? */
@@ -87,7 +82,7 @@ public:
* This method returns true if the i^th field was previously uninitialized,
* or is equivalent to n modulo the equalities given by q.
*/
- bool set(EqualityQuery* q, size_t i, TNode n);
+ bool set(quantifiers::QuantifiersState& qs, size_t i, TNode n);
};
inline std::ostream& operator<<(std::ostream& out, const InstMatch& m) {
diff --git a/src/theory/quantifiers/inst_match_trie.cpp b/src/theory/quantifiers/inst_match_trie.cpp
index aaf7cb4bc..0bd5000f1 100644
--- a/src/theory/quantifiers/inst_match_trie.cpp
+++ b/src/theory/quantifiers/inst_match_trie.cpp
@@ -52,12 +52,11 @@ bool InstMatchTrie::addInstMatch(QuantifiersEngine* qe,
}
if (modEq)
{
+ quantifiers::QuantifiersState& qs = qe->getState();
// check modulo equality if any other instantiation match exists
- if (!n.isNull() && qe->getEqualityQuery()->getEngine()->hasTerm(n))
+ if (!n.isNull() && qs.hasTerm(n))
{
- eq::EqClassIterator eqc(
- qe->getEqualityQuery()->getEngine()->getRepresentative(n),
- qe->getEqualityQuery()->getEngine());
+ eq::EqClassIterator eqc(qs.getRepresentative(n), qs.getEqualityEngine());
while (!eqc.isFinished())
{
Node en = (*eqc);
@@ -331,11 +330,10 @@ bool CDInstMatchTrie::addInstMatch(QuantifiersEngine* qe,
if (modEq)
{
// check modulo equality if any other instantiation match exists
- if (!n.isNull() && qe->getEqualityQuery()->getEngine()->hasTerm(n))
+ quantifiers::QuantifiersState& qs = qe->getState();
+ if (!n.isNull() && qs.hasTerm(n))
{
- eq::EqClassIterator eqc(
- qe->getEqualityQuery()->getEngine()->getRepresentative(n),
- qe->getEqualityQuery()->getEngine());
+ eq::EqClassIterator eqc(qs.getRepresentative(n), qs.getEqualityEngine());
while (!eqc.isFinished())
{
Node en = (*eqc);
diff --git a/src/theory/quantifiers/inst_match_trie.h b/src/theory/quantifiers/inst_match_trie.h
index a63954838..c978a6952 100644
--- a/src/theory/quantifiers/inst_match_trie.h
+++ b/src/theory/quantifiers/inst_match_trie.h
@@ -28,7 +28,6 @@ namespace CVC4 {
namespace theory {
class QuantifiersEngine;
-class EqualityQuery;
namespace inst {
diff --git a/src/theory/quantifiers/inst_strategy_enumerative.cpp b/src/theory/quantifiers/inst_strategy_enumerative.cpp
index d1c09a9e8..c0f294528 100644
--- a/src/theory/quantifiers/inst_strategy_enumerative.cpp
+++ b/src/theory/quantifiers/inst_strategy_enumerative.cpp
@@ -188,7 +188,7 @@ bool InstStrategyEnum::process(Node f, bool fullEffort, bool isRd)
std::map<TypeNode, std::vector<Node> > term_db_list;
std::vector<TypeNode> ftypes;
TermDb* tdb = d_quantEngine->getTermDatabase();
- EqualityQuery* qy = d_quantEngine->getEqualityQuery();
+ QuantifiersState& qs = d_quantEngine->getState();
// iterate over substitutions for variables
for (unsigned i = 0; i < f[0].getNumChildren(); i++)
{
@@ -212,7 +212,7 @@ bool InstStrategyEnum::process(Node f, bool fullEffort, bool isRd)
Node gt = tdb->getTypeGroundTerm(ftypes[i], j);
if (!options::cegqi() || !quantifiers::TermUtil::hasInstConstAttr(gt))
{
- Node rep = qy->getRepresentative(gt);
+ Node rep = qs.getRepresentative(gt);
if (reps_found.find(rep) == reps_found.end())
{
reps_found[rep] = gt;
diff --git a/src/theory/quantifiers/quant_conflict_find.cpp b/src/theory/quantifiers/quant_conflict_find.cpp
index bd7a1b122..4359b8b19 100644
--- a/src/theory/quantifiers/quant_conflict_find.cpp
+++ b/src/theory/quantifiers/quant_conflict_find.cpp
@@ -589,7 +589,7 @@ bool QuantInfo::isTConstraintSpurious(QuantConflictFind* p,
p->d_quantEngine->getInstantiate()->getInstantiation(d_q, terms);
inst = Rewriter::rewrite(inst);
Node inst_eval = p->getTermDatabase()->evaluateTerm(
- inst, nullptr, options::qcfTConstraint(), true);
+ inst, options::qcfTConstraint(), true);
if( Trace.isOn("qcf-instance-check") ){
Trace("qcf-instance-check") << "Possible propagating instance for " << d_q << " : " << std::endl;
for( unsigned i=0; i<terms.size(); i++ ){
diff --git a/src/theory/quantifiers/quant_util.cpp b/src/theory/quantifiers/quant_util.cpp
index b561b589b..6ce46ad99 100644
--- a/src/theory/quantifiers/quant_util.cpp
+++ b/src/theory/quantifiers/quant_util.cpp
@@ -38,22 +38,22 @@ QuantifiersModule::QEffort QuantifiersModule::needsModel(Theory::Effort e)
eq::EqualityEngine* QuantifiersModule::getEqualityEngine() const
{
- return d_quantEngine->getMasterEqualityEngine();
+ return d_qstate.getEqualityEngine();
}
bool QuantifiersModule::areEqual(TNode n1, TNode n2) const
{
- return d_quantEngine->getEqualityQuery()->areEqual( n1, n2 );
+ return d_qstate.areEqual(n1, n2);
}
bool QuantifiersModule::areDisequal(TNode n1, TNode n2) const
{
- return d_quantEngine->getEqualityQuery()->areDisequal( n1, n2 );
+ return d_qstate.areDisequal(n1, n2);
}
TNode QuantifiersModule::getRepresentative(TNode n) const
{
- return d_quantEngine->getEqualityQuery()->getRepresentative( n );
+ return d_qstate.getRepresentative(n);
}
QuantifiersEngine* QuantifiersModule::getQuantifiersEngine() const
diff --git a/src/theory/quantifiers/quant_util.h b/src/theory/quantifiers/quant_util.h
index 16791b130..417e6820d 100644
--- a/src/theory/quantifiers/quant_util.h
+++ b/src/theory/quantifiers/quant_util.h
@@ -221,32 +221,6 @@ public:
static void getEntailPolarity( Node n, int child, bool hasPol, bool pol, bool& newHasPol, bool& newPol );
};
-/** EqualityQuery
-* This is a wrapper class around equality engine.
-*/
-class EqualityQuery : public QuantifiersUtil {
-public:
- EqualityQuery(){}
- virtual ~EqualityQuery(){};
- /** extends engine */
- virtual bool extendsEngine() { return false; }
- /** contains term */
- virtual bool hasTerm( Node a ) = 0;
- /** get the representative of the equivalence class of a */
- virtual Node getRepresentative( Node a ) = 0;
- /** returns true if a and b are equal in the current context */
- virtual bool areEqual( Node a, Node b ) = 0;
- /** returns true is a and b are disequal in the current context */
- virtual bool areDisequal( Node a, Node b ) = 0;
- /** get the equality engine associated with this query */
- virtual eq::EqualityEngine* getEngine() = 0;
- /** get the equivalence class of a */
- virtual void getEquivalenceClass( Node a, std::vector< Node >& eqc ) = 0;
- /** get the term that exists in EE that is congruent to f with args (f is
- * returned by TermDb::getMatchOperator(...)) */
- virtual TNode getCongruentTerm( Node f, std::vector< TNode >& args ) = 0;
-};/* class EqualityQuery */
-
/** Types of bounds that can be inferred for quantified formulas */
enum BoundVarType
{
diff --git a/src/theory/quantifiers/relevant_domain.cpp b/src/theory/quantifiers/relevant_domain.cpp
index 2893fd686..1743cafe5 100644
--- a/src/theory/quantifiers/relevant_domain.cpp
+++ b/src/theory/quantifiers/relevant_domain.cpp
@@ -51,12 +51,13 @@ RelevantDomain::RDomain * RelevantDomain::RDomain::getParent() {
}
}
-void RelevantDomain::RDomain::removeRedundantTerms( QuantifiersEngine * qe ) {
+void RelevantDomain::RDomain::removeRedundantTerms(QuantifiersState& qs)
+{
std::map< Node, Node > rterms;
for( unsigned i=0; i<d_terms.size(); i++ ){
Node r = d_terms[i];
if( !TermUtil::hasInstConstAttr( d_terms[i] ) ){
- r = qe->getEqualityQuery()->getRepresentative( d_terms[i] );
+ r = qs.getRepresentative(d_terms[i]);
}
if( rterms.find( r )==rterms.end() ){
rterms[r] = d_terms[i];
@@ -141,7 +142,7 @@ void RelevantDomain::compute(){
RDomain * r = it2->second;
RDomain * rp = r->getParent();
if( r==rp ){
- r->removeRedundantTerms( d_qe );
+ r->removeRedundantTerms(d_qe->getState());
for( unsigned i=0; i<r->d_terms.size(); i++ ){
Trace("rel-dom") << r->d_terms[i] << " ";
}
diff --git a/src/theory/quantifiers/relevant_domain.h b/src/theory/quantifiers/relevant_domain.h
index 6da4ce75a..36364191c 100644
--- a/src/theory/quantifiers/relevant_domain.h
+++ b/src/theory/quantifiers/relevant_domain.h
@@ -84,7 +84,7 @@ class RelevantDomain : public QuantifiersUtil
/** remove redundant terms for d_terms, removes
* duplicates modulo equality.
*/
- void removeRedundantTerms( QuantifiersEngine * qe );
+ void removeRedundantTerms(QuantifiersState& qs);
/** is n in this relevant domain? */
bool hasTerm( Node n ) { return std::find( d_terms.begin(), d_terms.end(), n )!=d_terms.end(); }
diff --git a/src/theory/quantifiers/term_database.cpp b/src/theory/quantifiers/term_database.cpp
index 3f33b07b8..c39654aa5 100644
--- a/src/theory/quantifiers/term_database.cpp
+++ b/src/theory/quantifiers/term_database.cpp
@@ -258,7 +258,7 @@ void TermDb::addTerm(Node n,
void TermDb::computeArgReps( TNode n ) {
if (d_arg_reps.find(n) == d_arg_reps.end())
{
- eq::EqualityEngine* ee = d_quantEngine->getMasterEqualityEngine();
+ eq::EqualityEngine* ee = d_qstate.getEqualityEngine();
for (const TNode& nc : n)
{
TNode r = ee->hasTerm(nc) ? ee->getRepresentative(nc) : nc;
@@ -281,7 +281,7 @@ void TermDb::computeUfEqcTerms( TNode f ) {
{
ops.insert(ops.end(), d_ho_op_slaves[f].begin(), d_ho_op_slaves[f].end());
}
- eq::EqualityEngine* ee = d_quantEngine->getMasterEqualityEngine();
+ eq::EqualityEngine* ee = d_qstate.getEqualityEngine();
for (TNode ff : ops)
{
for (const Node& n : d_op_map[ff])
@@ -316,7 +316,6 @@ void TermDb::computeUfTerms( TNode f ) {
unsigned nonCongruentCount = 0;
unsigned alreadyCongruentCount = 0;
unsigned relevantCount = 0;
- eq::EqualityEngine* ee = d_quantEngine->getMasterEqualityEngine();
NodeManager* nm = NodeManager::currentNM();
for (TNode ff : ops)
{
@@ -330,7 +329,7 @@ void TermDb::computeUfTerms( TNode f ) {
for (const Node& n : it->second)
{
// to be added to term index, term must be relevant, and exist in EE
- if (!hasTermCurrent(n) || !ee->hasTerm(n))
+ if (!hasTermCurrent(n) || !d_qstate.hasTerm(n))
{
Trace("term-db-debug") << n << " is not relevant." << std::endl;
continue;
@@ -358,20 +357,20 @@ void TermDb::computeUfTerms( TNode f ) {
}
}
Trace("term-db-debug") << std::endl;
- Assert(ee->hasTerm(n));
- Trace("term-db-debug") << " and value : " << ee->getRepresentative(n)
- << std::endl;
+ Assert(d_qstate.hasTerm(n));
+ Trace("term-db-debug")
+ << " and value : " << d_qstate.getRepresentative(n) << std::endl;
Node at = d_func_map_trie[f].addOrGetTerm(n, d_arg_reps[n]);
- Assert(ee->hasTerm(at));
+ Assert(d_qstate.hasTerm(at));
Trace("term-db-debug2") << "...add term returned " << at << std::endl;
- if (at != n && ee->areEqual(at, n))
+ if (at != n && d_qstate.areEqual(at, n))
{
setTermInactive(n);
Trace("term-db-debug") << n << " is redundant." << std::endl;
congruentCount++;
continue;
}
- if (ee->areDisequal(at, n, false))
+ if (d_qstate.areDisequal(at, n))
{
std::vector<Node> lits;
lits.push_back(nm->mkNode(EQUAL, at, n));
@@ -512,9 +511,8 @@ bool TermDb::inRelevantDomain( TNode f, unsigned i, TNode r ) {
f = getOperatorRepresentative( f );
}
computeUfTerms( f );
- Assert(!d_quantEngine->getMasterEqualityEngine()->hasTerm(r)
- || d_quantEngine->getMasterEqualityEngine()->getRepresentative(r)
- == r);
+ Assert(!d_qstate.getEqualityEngine()->hasTerm(r)
+ || d_qstate.getEqualityEngine()->getRepresentative(r) == r);
std::map< Node, std::map< unsigned, std::vector< Node > > >::iterator it = d_func_map_rel_dom.find( f );
if( it != d_func_map_rel_dom.end() ){
std::map< unsigned, std::vector< Node > >::iterator it2 = it->second.find( i );
@@ -531,7 +529,6 @@ bool TermDb::inRelevantDomain( TNode f, unsigned i, TNode r ) {
Node TermDb::evaluateTerm2(TNode n,
std::map<TNode, Node>& visited,
std::vector<Node>& exp,
- EqualityQuery* qy,
bool useEntailmentTests,
bool computeExp,
bool reqHasTerm)
@@ -546,10 +543,10 @@ Node TermDb::evaluateTerm2(TNode n,
if( n.getKind()==FORALL || n.getKind()==BOUND_VARIABLE ){
//do nothing
}
- else if (qy->hasTerm(n))
+ else if (d_qstate.hasTerm(n))
{
Trace("term-db-eval") << "...exists in ee, return rep" << std::endl;
- ret = qy->getRepresentative(n);
+ ret = d_qstate.getRepresentative(n);
if (computeExp)
{
if (n != ret)
@@ -570,7 +567,6 @@ Node TermDb::evaluateTerm2(TNode n,
TNode c = evaluateTerm2(n[i],
visited,
tempExp,
- qy,
useEntailmentTests,
computeExp,
reqHasTerm);
@@ -595,7 +591,6 @@ Node TermDb::evaluateTerm2(TNode n,
ret = evaluateTerm2(n[c == d_true ? 1 : 2],
visited,
tempExp,
- qy,
useEntailmentTests,
computeExp,
reqHasTerm);
@@ -628,7 +623,7 @@ Node TermDb::evaluateTerm2(TNode n,
if (!f.isNull())
{
// if f is congruent to a term indexed by this class
- TNode nn = qy->getCongruentTerm(f, args);
+ TNode nn = getCongruentTerm(f, args);
Trace("term-db-eval") << " got congruent term " << nn
<< " from DB for " << n << std::endl;
if (!nn.isNull())
@@ -644,7 +639,7 @@ Node TermDb::evaluateTerm2(TNode n,
}
}
}
- ret = qy->getRepresentative(nn);
+ ret = d_qstate.getRepresentative(nn);
Trace("term-db-eval") << "return rep" << std::endl;
ret_set = true;
reqHasTerm = false;
@@ -669,7 +664,7 @@ Node TermDb::evaluateTerm2(TNode n,
ret = Rewriter::rewrite(ret);
if (ret.getKind() == EQUAL)
{
- if (qy->areDisequal(ret[0], ret[1]))
+ if (d_qstate.areDisequal(ret[0], ret[1]))
{
ret = d_false;
}
@@ -706,7 +701,7 @@ Node TermDb::evaluateTerm2(TNode n,
if (k != OR && k != AND && k != EQUAL && k != ITE && k != NOT
&& k != FORALL)
{
- if (!qy->hasTerm(ret))
+ if (!d_qstate.hasTerm(ret))
{
ret = Node::null();
}
@@ -723,11 +718,14 @@ Node TermDb::evaluateTerm2(TNode n,
return ret;
}
-
-TNode TermDb::getEntailedTerm2( TNode n, std::map< TNode, TNode >& subs, bool subsRep, bool hasSubs, EqualityQuery * qy ) {
- Assert(!qy->extendsEngine());
+TNode TermDb::getEntailedTerm2(TNode n,
+ std::map<TNode, TNode>& subs,
+ bool subsRep,
+ bool hasSubs)
+{
Trace("term-db-entail") << "get entailed term : " << n << std::endl;
- if( qy->getEngine()->hasTerm( n ) ){
+ if (d_qstate.hasTerm(n))
+ {
Trace("term-db-entail") << "...exists in ee, return rep " << std::endl;
return n;
}else if( n.getKind()==BOUND_VARIABLE ){
@@ -736,18 +734,18 @@ TNode TermDb::getEntailedTerm2( TNode n, std::map< TNode, TNode >& subs, bool su
if( it!=subs.end() ){
Trace("term-db-entail") << "...substitution is : " << it->second << std::endl;
if( subsRep ){
- Assert(qy->getEngine()->hasTerm(it->second));
- Assert(qy->getEngine()->getRepresentative(it->second) == it->second);
+ Assert(d_qstate.hasTerm(it->second));
+ Assert(d_qstate.getRepresentative(it->second) == it->second);
return it->second;
- }else{
- return getEntailedTerm2( it->second, subs, subsRep, hasSubs, qy );
}
+ return getEntailedTerm2(it->second, subs, subsRep, hasSubs);
}
}
}else if( n.getKind()==ITE ){
for( unsigned i=0; i<2; i++ ){
- if( isEntailed2( n[0], subs, subsRep, hasSubs, i==0, qy ) ){
- return getEntailedTerm2( n[ i==0 ? 1 : 2 ], subs, subsRep, hasSubs, qy );
+ if (isEntailed2(n[0], subs, subsRep, hasSubs, i == 0))
+ {
+ return getEntailedTerm2(n[i == 0 ? 1 : 2], subs, subsRep, hasSubs);
}
}
}else{
@@ -756,15 +754,15 @@ TNode TermDb::getEntailedTerm2( TNode n, std::map< TNode, TNode >& subs, bool su
if( !f.isNull() ){
std::vector< TNode > args;
for( unsigned i=0; i<n.getNumChildren(); i++ ){
- TNode c = getEntailedTerm2( n[i], subs, subsRep, hasSubs, qy );
+ TNode c = getEntailedTerm2(n[i], subs, subsRep, hasSubs);
if( c.isNull() ){
return TNode::null();
}
- c = qy->getEngine()->getRepresentative( c );
+ c = d_qstate.getRepresentative(c);
Trace("term-db-entail") << " child " << i << " : " << c << std::endl;
args.push_back( c );
}
- TNode nn = qy->getCongruentTerm( f, args );
+ TNode nn = getCongruentTerm(f, args);
Trace("term-db-entail") << " got congruent term " << nn << " for " << n << std::endl;
return nn;
}
@@ -774,77 +772,66 @@ TNode TermDb::getEntailedTerm2( TNode n, std::map< TNode, TNode >& subs, bool su
}
Node TermDb::evaluateTerm(TNode n,
- EqualityQuery* qy,
bool useEntailmentTests,
bool reqHasTerm)
{
- if( qy==NULL ){
- qy = d_quantEngine->getEqualityQuery();
- }
std::map< TNode, Node > visited;
std::vector<Node> exp;
- return evaluateTerm2(
- n, visited, exp, qy, useEntailmentTests, false, reqHasTerm);
+ return evaluateTerm2(n, visited, exp, useEntailmentTests, false, reqHasTerm);
}
Node TermDb::evaluateTerm(TNode n,
std::vector<Node>& exp,
- EqualityQuery* qy,
bool useEntailmentTests,
bool reqHasTerm)
{
- if (qy == NULL)
- {
- qy = d_quantEngine->getEqualityQuery();
- }
std::map<TNode, Node> visited;
- return evaluateTerm2(
- n, visited, exp, qy, useEntailmentTests, true, reqHasTerm);
+ return evaluateTerm2(n, visited, exp, useEntailmentTests, true, reqHasTerm);
}
-TNode TermDb::getEntailedTerm( TNode n, std::map< TNode, TNode >& subs, bool subsRep, EqualityQuery * qy ) {
- if( qy==NULL ){
- qy = d_quantEngine->getEqualityQuery();
- }
- return getEntailedTerm2( n, subs, subsRep, true, qy );
+TNode TermDb::getEntailedTerm(TNode n,
+ std::map<TNode, TNode>& subs,
+ bool subsRep)
+{
+ return getEntailedTerm2(n, subs, subsRep, true);
}
-TNode TermDb::getEntailedTerm( TNode n, EqualityQuery * qy ) {
- if( qy==NULL ){
- qy = d_quantEngine->getEqualityQuery();
- }
+TNode TermDb::getEntailedTerm(TNode n)
+{
std::map< TNode, TNode > subs;
- return getEntailedTerm2( n, subs, false, false, qy );
+ return getEntailedTerm2(n, subs, false, false);
}
-bool TermDb::isEntailed2( TNode n, std::map< TNode, TNode >& subs, bool subsRep, bool hasSubs, bool pol, EqualityQuery * qy ) {
- Assert(!qy->extendsEngine());
+bool TermDb::isEntailed2(
+ TNode n, std::map<TNode, TNode>& subs, bool subsRep, bool hasSubs, bool pol)
+{
Trace("term-db-entail") << "Check entailed : " << n << ", pol = " << pol << std::endl;
Assert(n.getType().isBoolean());
if( n.getKind()==EQUAL && !n[0].getType().isBoolean() ){
- TNode n1 = getEntailedTerm2( n[0], subs, subsRep, hasSubs, qy );
+ TNode n1 = getEntailedTerm2(n[0], subs, subsRep, hasSubs);
if( !n1.isNull() ){
- TNode n2 = getEntailedTerm2( n[1], subs, subsRep, hasSubs, qy );
+ TNode n2 = getEntailedTerm2(n[1], subs, subsRep, hasSubs);
if( !n2.isNull() ){
if( n1==n2 ){
return pol;
}else{
- Assert(qy->getEngine()->hasTerm(n1));
- Assert(qy->getEngine()->hasTerm(n2));
+ Assert(d_qstate.hasTerm(n1));
+ Assert(d_qstate.hasTerm(n2));
if( pol ){
- return qy->getEngine()->areEqual( n1, n2 );
+ return d_qstate.areEqual(n1, n2);
}else{
- return qy->getEngine()->areDisequal( n1, n2, false );
+ return d_qstate.areDisequal(n1, n2);
}
}
}
}
}else if( n.getKind()==NOT ){
- return isEntailed2( n[0], subs, subsRep, hasSubs, !pol, qy );
+ return isEntailed2(n[0], subs, subsRep, hasSubs, !pol);
}else if( n.getKind()==OR || n.getKind()==AND ){
bool simPol = ( pol && n.getKind()==OR ) || ( !pol && n.getKind()==AND );
for( unsigned i=0; i<n.getNumChildren(); i++ ){
- if( isEntailed2( n[i], subs, subsRep, hasSubs, pol, qy ) ){
+ if (isEntailed2(n[i], subs, subsRep, hasSubs, pol))
+ {
if( simPol ){
return true;
}
@@ -858,45 +845,45 @@ bool TermDb::isEntailed2( TNode n, std::map< TNode, TNode >& subs, bool subsRep,
//Boolean equality here
}else if( n.getKind()==EQUAL || n.getKind()==ITE ){
for( unsigned i=0; i<2; i++ ){
- if( isEntailed2( n[0], subs, subsRep, hasSubs, i==0, qy ) ){
+ if (isEntailed2(n[0], subs, subsRep, hasSubs, i == 0))
+ {
unsigned ch = ( n.getKind()==EQUAL || i==0 ) ? 1 : 2;
bool reqPol = ( n.getKind()==ITE || i==0 ) ? pol : !pol;
- return isEntailed2( n[ch], subs, subsRep, hasSubs, reqPol, qy );
+ return isEntailed2(n[ch], subs, subsRep, hasSubs, reqPol);
}
}
}else if( n.getKind()==APPLY_UF ){
- TNode n1 = getEntailedTerm2( n, subs, subsRep, hasSubs, qy );
+ TNode n1 = getEntailedTerm2(n, subs, subsRep, hasSubs);
if( !n1.isNull() ){
- Assert(qy->hasTerm(n1));
+ Assert(d_qstate.hasTerm(n1));
if( n1==d_true ){
return pol;
}else if( n1==d_false ){
return !pol;
}else{
- return qy->getEngine()->getRepresentative( n1 ) == ( pol ? d_true : d_false );
+ return d_qstate.getRepresentative(n1) == (pol ? d_true : d_false);
}
}
}else if( n.getKind()==FORALL && !pol ){
- return isEntailed2( n[1], subs, subsRep, hasSubs, pol, qy );
+ return isEntailed2(n[1], subs, subsRep, hasSubs, pol);
}
return false;
}
-bool TermDb::isEntailed( TNode n, bool pol, EqualityQuery * qy ) {
- if( qy==NULL ){
- Assert(d_consistent_ee);
- qy = d_quantEngine->getEqualityQuery();
- }
+bool TermDb::isEntailed(TNode n, bool pol)
+{
+ Assert(d_consistent_ee);
std::map< TNode, TNode > subs;
- return isEntailed2( n, subs, false, false, pol, qy );
+ return isEntailed2(n, subs, false, false, pol);
}
-bool TermDb::isEntailed( TNode n, std::map< TNode, TNode >& subs, bool subsRep, bool pol, EqualityQuery * qy ) {
- if( qy==NULL ){
- Assert(d_consistent_ee);
- qy = d_quantEngine->getEqualityQuery();
- }
- return isEntailed2( n, subs, subsRep, true, pol, qy );
+bool TermDb::isEntailed(TNode n,
+ std::map<TNode, TNode>& subs,
+ bool subsRep,
+ bool pol)
+{
+ Assert(d_consistent_ee);
+ return isEntailed2(n, subs, subsRep, true, pol);
}
bool TermDb::isTermActive( Node n ) {
@@ -971,8 +958,8 @@ Node TermDb::getEligibleTermInEqc( TNode r ) {
std::map< Node, Node >::iterator it = d_term_elig_eqc.find( r );
if( it==d_term_elig_eqc.end() ){
Node h;
- eq::EqualityEngine* ee = d_quantEngine->getMasterEqualityEngine();
- eq::EqClassIterator eqc_i = eq::EqClassIterator( r, ee );
+ eq::EqualityEngine* ee = d_qstate.getEqualityEngine();
+ eq::EqClassIterator eqc_i = eq::EqClassIterator(r, ee);
while (!eqc_i.isFinished())
{
TNode n = (*eqc_i);
@@ -1025,7 +1012,7 @@ bool TermDb::reset( Theory::Effort effort ){
d_func_map_rel_dom.clear();
d_consistent_ee = true;
- eq::EqualityEngine* ee = d_quantEngine->getMasterEqualityEngine();
+ eq::EqualityEngine* ee = d_qstate.getEqualityEngine();
Assert(ee->consistent());
// if higher-order, add equalities for the purification terms now
@@ -1083,7 +1070,7 @@ bool TermDb::reset( Theory::Effort effort ){
bool addedFirst = false;
Node first;
//TODO: ignoring singleton eqc isn't enough, need to ensure eqc are relevant
- eq::EqClassIterator eqc_i = eq::EqClassIterator( r, ee );
+ eq::EqClassIterator eqc_i = eq::EqClassIterator(r, ee);
while( !eqc_i.isFinished() ){
TNode n = (*eqc_i);
if( first.isNull() ){
@@ -1125,8 +1112,9 @@ bool TermDb::reset( Theory::Effort effort ){
//explicitly add inst closure terms to the equality engine to ensure only EE terms are indexed
for (const Node& n : d_iclosure_processed)
{
- if( !ee->hasTerm( n ) ){
- ee->addTerm( n );
+ if (!ee->hasTerm(n))
+ {
+ ee->addTerm(n);
}
}
@@ -1141,7 +1129,7 @@ bool TermDb::reset( Theory::Effort effort ){
if( r.getType().isFunction() ){
Trace("quant-ho") << " process function eqc " << r << std::endl;
Node first;
- eq::EqClassIterator eqc_i = eq::EqClassIterator( r, ee );
+ eq::EqClassIterator eqc_i = eq::EqClassIterator(r, ee);
while( !eqc_i.isFinished() ){
TNode n = (*eqc_i);
Node n_use;
diff --git a/src/theory/quantifiers/term_database.h b/src/theory/quantifiers/term_database.h
index c246ea6fc..244762d24 100644
--- a/src/theory/quantifiers/term_database.h
+++ b/src/theory/quantifiers/term_database.h
@@ -31,22 +31,9 @@ namespace theory {
class QuantifiersEngine;
-namespace inst{
- class Trigger;
- class HigherOrderTrigger;
-}
-
namespace quantifiers {
-namespace fmcheck {
- class FullModelChecker;
-}
-
-class TermDbSygus;
-class QuantConflictFind;
-class RelevantDomain;
class ConjectureGenerator;
-class TermGenerator;
class TermGenEnv;
/** Term Database
@@ -182,9 +169,9 @@ class TermDb : public QuantifiersUtil {
/** evaluate term
*
* Returns a term n' such that n = n' is entailed based on the equality
- * information qy. This function may generate new terms. In particular,
+ * information ee. This function may generate new terms. In particular,
* we typically rewrite subterms of n of maximal size to terms that exist in
- * the equality engine specified by qy.
+ * the equality engine specified by ee.
*
* useEntailmentTests is whether to call the theory engine's entailmentTest
* on literals n for which this call fails to find a term n' that is
@@ -204,59 +191,53 @@ class TermDb : public QuantifiersUtil {
*/
Node evaluateTerm(TNode n,
std::vector<Node>& exp,
- EqualityQuery* qy = NULL,
bool useEntailmentTests = false,
bool reqHasTerm = false);
/** same as above, without exp */
Node evaluateTerm(TNode n,
- EqualityQuery* qy = NULL,
bool useEntailmentTests = false,
bool reqHasTerm = false);
/** get entailed term
*
- * If possible, returns a term n' such that:
- * (1) n' exists in the current equality engine (as specified by qy),
- * (2) n = n' is entailed in the current context.
- * It returns null if no such term can be found.
- * Wrt evaluateTerm, this version does not construct new terms, and
- * thus is less aggressive.
- */
- TNode getEntailedTerm(TNode n, EqualityQuery* qy = NULL);
+ * If possible, returns a term n' such that:
+ * (1) n' exists in the current equality engine (as specified by the state),
+ * (2) n = n' is entailed in the current context.
+ * It returns null if no such term can be found.
+ * Wrt evaluateTerm, this version does not construct new terms, and
+ * thus is less aggressive.
+ */
+ TNode getEntailedTerm(TNode n);
/** get entailed term
*
- * If possible, returns a term n' such that:
- * (1) n' exists in the current equality engine (as specified by qy),
- * (2) n * subs = n' is entailed in the current context, where * is denotes
- * substitution application.
- * It returns null if no such term can be found.
- * subsRep is whether the substitution maps to terms that are representatives
- * according to qy.
- * Wrt evaluateTerm, this version does not construct new terms, and
- * thus is less aggressive.
- */
- TNode getEntailedTerm(TNode n,
- std::map<TNode, TNode>& subs,
- bool subsRep,
- EqualityQuery* qy = NULL);
+ * If possible, returns a term n' such that:
+ * (1) n' exists in the current equality engine (as specified by the state),
+ * (2) n * subs = n' is entailed in the current context, where * denotes
+ * substitution application.
+ * It returns null if no such term can be found.
+ * subsRep is whether the substitution maps to terms that are representatives
+ * according to the quantifiers state.
+ * Wrt evaluateTerm, this version does not construct new terms, and
+ * thus is less aggressive.
+ */
+ TNode getEntailedTerm(TNode n, std::map<TNode, TNode>& subs, bool subsRep);
/** is entailed
- * Checks whether the current context entails n with polarity pol, based on the
- * equality information qy.
- * Returns true if the entailment can be successfully shown.
- */
- bool isEntailed(TNode n, bool pol, EqualityQuery* qy = NULL);
+ * Checks whether the current context entails n with polarity pol, based on
+ * the equality information in the quantifiers state. Returns true if the
+ * entailment can be successfully shown.
+ */
+ bool isEntailed(TNode n, bool pol);
/** is entailed
*
- * Checks whether the current context entails ( n * subs ) with polarity pol,
- * based on the equality information qy,
- * where * denotes substitution application.
- * subsRep is whether the substitution maps to terms that are representatives
- * according to qy.
- */
+ * Checks whether the current context entails ( n * subs ) with polarity pol,
+ * based on the equality information in the quantifiers state,
+ * where * denotes substitution application.
+ * subsRep is whether the substitution maps to terms that are representatives
+ * according to in the quantifiers state.
+ */
bool isEntailed(TNode n,
std::map<TNode, TNode>& subs,
bool subsRep,
- bool pol,
- EqualityQuery* qy = NULL);
+ bool pol);
/** is the term n active in the current context?
*
* By default, all terms are active. A term is inactive if:
@@ -354,14 +335,20 @@ class TermDb : public QuantifiersUtil {
Node evaluateTerm2(TNode n,
std::map<TNode, Node>& visited,
std::vector<Node>& exp,
- EqualityQuery* qy,
bool useEntailmentTests,
bool computeExp,
bool reqHasTerm);
/** helper for get entailed term */
- TNode getEntailedTerm2( TNode n, std::map< TNode, TNode >& subs, bool subsRep, bool hasSubs, EqualityQuery * qy );
+ TNode getEntailedTerm2(TNode n,
+ std::map<TNode, TNode>& subs,
+ bool subsRep,
+ bool hasSubs);
/** helper for is entailed */
- bool isEntailed2( TNode n, std::map< TNode, TNode >& subs, bool subsRep, bool hasSubs, bool pol, EqualityQuery * qy );
+ bool isEntailed2(TNode n,
+ std::map<TNode, TNode>& subs,
+ bool subsRep,
+ bool hasSubs,
+ bool pol);
/** compute uf eqc terms :
* Ensure entries for f are in d_func_map_eqc_trie for all equivalence classes
*/
diff --git a/src/theory/quantifiers/theory_quantifiers.cpp b/src/theory/quantifiers/theory_quantifiers.cpp
index 4dd59d12f..1cbb2ce40 100644
--- a/src/theory/quantifiers/theory_quantifiers.cpp
+++ b/src/theory/quantifiers/theory_quantifiers.cpp
@@ -83,6 +83,13 @@ void TheoryQuantifiers::finishInit()
d_valuation.setUnevaluatedKind(WITNESS);
}
+bool TheoryQuantifiers::needsEqualityEngine(EeSetupInfo& esi)
+{
+ // use the master equality engine
+ esi.d_useMaster = true;
+ return true;
+}
+
void TheoryQuantifiers::preRegisterTerm(TNode n)
{
if (n.getKind() != FORALL)
@@ -164,7 +171,7 @@ bool TheoryQuantifiers::preNotifyFact(
getQuantifiersEngine()->addTermToDatabase(atom[0], false, true);
if (!options::lteRestrictInstClosure())
{
- getQuantifiersEngine()->getMasterEqualityEngine()->addTerm(atom[0]);
+ d_qstate.getEqualityEngine()->addTerm(atom[0]);
}
}
else
diff --git a/src/theory/quantifiers/theory_quantifiers.h b/src/theory/quantifiers/theory_quantifiers.h
index 8d2366065..2283d5ea8 100644
--- a/src/theory/quantifiers/theory_quantifiers.h
+++ b/src/theory/quantifiers/theory_quantifiers.h
@@ -47,6 +47,8 @@ class TheoryQuantifiers : public Theory {
TheoryRewriter* getTheoryRewriter() override;
/** finish initialization */
void finishInit() override;
+ /** needs equality engine */
+ bool needsEqualityEngine(EeSetupInfo& esi) override;
//--------------------------------- end initialization
void preRegisterTerm(TNode n) override;
diff --git a/src/theory/quantifiers_engine.cpp b/src/theory/quantifiers_engine.cpp
index 7cec8721c..2cc904ed1 100644
--- a/src/theory/quantifiers_engine.cpp
+++ b/src/theory/quantifiers_engine.cpp
@@ -39,7 +39,6 @@ QuantifiersEngine::QuantifiersEngine(
d_qim(qim),
d_te(nullptr),
d_decManager(nullptr),
- d_masterEqualityEngine(nullptr),
d_eq_query(new quantifiers::EqualityQueryQuantifiersEngine(qstate, this)),
d_tr_trie(new inst::TriggerTrie),
d_model(nullptr),
@@ -120,13 +119,10 @@ QuantifiersEngine::QuantifiersEngine(
QuantifiersEngine::~QuantifiersEngine() {}
-void QuantifiersEngine::finishInit(TheoryEngine* te,
- DecisionManager* dm,
- eq::EqualityEngine* mee)
+void QuantifiersEngine::finishInit(TheoryEngine* te, DecisionManager* dm)
{
d_te = te;
d_decManager = dm;
- d_masterEqualityEngine = mee;
// Initialize the modules and the utilities here.
d_qmodules.reset(new quantifiers::QuantifiersModules);
d_qmodules->initialize(this, d_qstate, d_qim, d_modules);
@@ -147,12 +143,16 @@ OutputChannel& QuantifiersEngine::getOutputChannel()
{
return d_te->theoryOf(THEORY_QUANTIFIERS)->getOutputChannel();
}
-/** get default valuation for the quantifiers engine */
Valuation& QuantifiersEngine::getValuation() { return d_qstate.getValuation(); }
-EqualityQuery* QuantifiersEngine::getEqualityQuery() const
+quantifiers::QuantifiersState& QuantifiersEngine::getState()
{
- return d_eq_query.get();
+ return d_qstate;
+}
+quantifiers::QuantifiersInferenceManager&
+QuantifiersEngine::getInferenceManager()
+{
+ return d_qim;
}
quantifiers::QModelBuilder* QuantifiersEngine::getModelBuilder() const
{
@@ -352,8 +352,8 @@ void QuantifiersEngine::ppNotifyAssertions(
void QuantifiersEngine::check( Theory::Effort e ){
CodeTimer codeTimer(d_statistics.d_time);
-
- if (!getMasterEqualityEngine()->consistent())
+ Assert(d_qstate.getEqualityEngine() != nullptr);
+ if (!d_qstate.getEqualityEngine()->consistent())
{
Trace("quant-engine-debug") << "Master equality engine not consistent, return." << std::endl;
return;
@@ -885,8 +885,6 @@ bool QuantifiersEngine::hasAddedLemma() const
return !d_lemmas_waiting.empty() || d_hasAddedLemma;
}
-bool QuantifiersEngine::inConflict() const { return d_qstate.isInConflict(); }
-
bool QuantifiersEngine::getInstWhenNeedsCheck( Theory::Effort e ) {
Trace("quant-engine-debug2") << "Get inst when needs check, counts=" << d_ierCounter << ", " << d_ierCounter_lc << std::endl;
//determine if we should perform check, based on instWhenMode
@@ -1067,11 +1065,6 @@ QuantifiersEngine::Statistics::~Statistics(){
smtStatisticsRegistry()->unregisterStat(&d_instantiations_rr);
}
-eq::EqualityEngine* QuantifiersEngine::getMasterEqualityEngine() const
-{
- return d_masterEqualityEngine;
-}
-
Node QuantifiersEngine::getInternalRepresentative( Node a, Node q, int index ){
return d_eq_query->getInternalRepresentative(a, q, index);
}
@@ -1100,7 +1093,7 @@ bool QuantifiersEngine::getSynthSolutions(
}
void QuantifiersEngine::debugPrintEqualityEngine( const char * c ) {
- eq::EqualityEngine* ee = getMasterEqualityEngine();
+ eq::EqualityEngine* ee = d_qstate.getEqualityEngine();
eq::EqClassesIterator eqcs_i = eq::EqClassesIterator( ee );
std::map< TypeNode, int > typ_num;
while( !eqcs_i.isFinished() ){
diff --git a/src/theory/quantifiers_engine.h b/src/theory/quantifiers_engine.h
index 126fca01f..74f432585 100644
--- a/src/theory/quantifiers_engine.h
+++ b/src/theory/quantifiers_engine.h
@@ -73,12 +73,12 @@ class QuantifiersEngine {
OutputChannel& getOutputChannel();
/** get default valuation for the quantifiers engine */
Valuation& getValuation();
+ /** The quantifiers state object */
+ quantifiers::QuantifiersState& getState();
+ /** The quantifiers inference manager */
+ quantifiers::QuantifiersInferenceManager& getInferenceManager();
//---------------------- end external interface
//---------------------- utilities
- /** get the master equality engine */
- eq::EqualityEngine* getMasterEqualityEngine() const;
- /** get equality query */
- EqualityQuery* getEqualityQuery() const;
/** get the model builder */
quantifiers::QModelBuilder* getModelBuilder() const;
/** get model */
@@ -110,11 +110,8 @@ class QuantifiersEngine {
*
* @param te The theory engine
* @param dm The decision manager of the theory engine
- * @param mee The master equality engine of the theory engine
*/
- void finishInit(TheoryEngine* te,
- DecisionManager* dm,
- eq::EqualityEngine* mee);
+ void finishInit(TheoryEngine* te, DecisionManager* dm);
//---------------------- end private initialization
/**
* Maps quantified formulas to the module that owns them, if any module has
@@ -227,8 +224,6 @@ public:
void markRelevant(Node q);
/** has added lemma */
bool hasAddedLemma() const;
- /** is in conflict */
- bool inConflict() const;
/** get current q effort */
QuantifiersModule::QEffort getCurrentQEffort() { return d_curr_effort_level; }
/** get number of waiting lemmas */
@@ -343,8 +338,6 @@ public:
TheoryEngine* d_te;
/** Reference to the decision manager of the theory engine */
DecisionManager* d_decManager;
- /** Pointer to the master equality engine */
- eq::EqualityEngine* d_masterEqualityEngine;
/** vector of utilities for quantifiers */
std::vector<QuantifiersUtil*> d_util;
/** vector of modules for quantifiers */
diff --git a/src/theory/theory_engine.cpp b/src/theory/theory_engine.cpp
index ba65fe69d..18d9bb572 100644
--- a/src/theory/theory_engine.cpp
+++ b/src/theory/theory_engine.cpp
@@ -183,8 +183,7 @@ void TheoryEngine::finishInit()
// finish initializing the quantifiers engine
if (d_logicInfo.isQuantified())
{
- d_quantEngine->finishInit(
- this, d_decManager.get(), d_tc->getCoreEqualityEngine());
+ d_quantEngine->finishInit(this, d_decManager.get());
}
// finish initializing the theories by linking them with the appropriate
diff --git a/src/theory/theory_state.cpp b/src/theory/theory_state.cpp
index 47528e1a6..e145baa6a 100644
--- a/src/theory/theory_state.cpp
+++ b/src/theory/theory_state.cpp
@@ -119,6 +119,26 @@ bool TheoryState::areDisequal(TNode a, TNode b) const
return d_ee->areDisequal(a, b, false);
}
+void TheoryState::getEquivalenceClass(Node a, std::vector<Node>& eqc) const
+{
+ if (d_ee->hasTerm(a))
+ {
+ Node rep = d_ee->getRepresentative(a);
+ eq::EqClassIterator eqc_iter(rep, d_ee);
+ while (!eqc_iter.isFinished())
+ {
+ eqc.push_back(*eqc_iter);
+ eqc_iter++;
+ }
+ }
+ else
+ {
+ eqc.push_back(a);
+ }
+ // a should be in its equivalence class
+ Assert(std::find(eqc.begin(), eqc.end(), a) != eqc.end());
+}
+
eq::EqualityEngine* TheoryState::getEqualityEngine() const { return d_ee; }
void TheoryState::notifyInConflict() { d_conflict = true; }
diff --git a/src/theory/theory_state.h b/src/theory/theory_state.h
index 7c2a044bf..891016f0a 100644
--- a/src/theory/theory_state.h
+++ b/src/theory/theory_state.h
@@ -60,6 +60,8 @@ class TheoryState
* returns true if the representative of a and b are distinct constants.
*/
virtual bool areDisequal(TNode a, TNode b) const;
+ /** get list of members in the equivalence class of a */
+ virtual void getEquivalenceClass(Node a, std::vector<Node>& eqc) const;
/** get equality engine */
eq::EqualityEngine* getEqualityEngine() const;
//-------------------------------------- end equality information
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback