diff options
author | Andrew Reynolds <andrew.j.reynolds@gmail.com> | 2021-03-17 13:43:39 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-17 18:43:39 +0000 |
commit | 7e9a4a35084c4e9dcb047a4593dcdf256244bf9b (patch) | |
tree | a09ebd34408bd3c5ae0e6db2579833bcc452f508 /src/theory/quantifiers_engine.cpp | |
parent | c21a80e2f9d54596f2b1f993be4dbd271c3651aa (diff) |
Move utilities for inferred bounds on quantifers to own class (#6159)
This also moves some methods from TermEnumeration to QuantifiersBoundInference.
This is required for breaking several cyclic dependencies within quantifiers.
Diffstat (limited to 'src/theory/quantifiers_engine.cpp')
-rw-r--r-- | src/theory/quantifiers_engine.cpp | 78 |
1 files changed, 11 insertions, 67 deletions
diff --git a/src/theory/quantifiers_engine.cpp b/src/theory/quantifiers_engine.cpp index c41fa36e6..1784b976e 100644 --- a/src/theory/quantifiers_engine.cpp +++ b/src/theory/quantifiers_engine.cpp @@ -93,13 +93,14 @@ QuantifiersEngine::QuantifiersEngine( { Trace("quant-engine-debug") << "...make fmc builder." << std::endl; d_model.reset(new quantifiers::fmcheck::FirstOrderModelFmc( - this, qstate, d_qreg, "FirstOrderModelFmc")); - d_builder.reset(new quantifiers::fmcheck::FullModelChecker(this, qstate)); + this, qstate, qr, "FirstOrderModelFmc")); + d_builder.reset( + new quantifiers::fmcheck::FullModelChecker(this, qstate, qr)); }else{ Trace("quant-engine-debug") << "...make default model builder." << std::endl; d_model.reset(new quantifiers::FirstOrderModel( - this, qstate, d_qreg, "FirstOrderModel")); - d_builder.reset(new quantifiers::QModelBuilder(this, qstate)); + this, qstate, qr, "FirstOrderModel")); + d_builder.reset(new quantifiers::QModelBuilder(this, qstate, qr)); } }else{ d_model.reset(new quantifiers::FirstOrderModel( @@ -123,6 +124,12 @@ void QuantifiersEngine::finishInit(TheoryEngine* te, DecisionManager* dm) { d_util.push_back(d_qmodules->d_rel_dom.get()); } + + // handle any circular dependencies + + // quantifiers bound inference needs to be informed of the bounded integers + // module, which has information about which quantifiers have finite bounds + d_qreg.getQuantifiersBoundInference().finishInit(d_qmodules->d_bint.get()); } DecisionManager* QuantifiersEngine::getDecisionManager() @@ -178,69 +185,6 @@ inst::TriggerTrie* QuantifiersEngine::getTriggerDatabase() const return d_tr_trie.get(); } -bool QuantifiersEngine::isFiniteBound(Node q, Node v) const -{ - quantifiers::BoundedIntegers* bi = d_qmodules->d_bint.get(); - if (bi && bi->isBound(q, v)) - { - return true; - } - TypeNode tn = v.getType(); - if (tn.isSort() && options::finiteModelFind()) - { - return true; - } - else if (d_treg.getTermEnumeration()->mayComplete(tn)) - { - return true; - } - return false; -} - -BoundVarType QuantifiersEngine::getBoundVarType(Node q, Node v) const -{ - quantifiers::BoundedIntegers* bi = d_qmodules->d_bint.get(); - if (bi) - { - return bi->getBoundVarType(q, v); - } - return isFiniteBound(q, v) ? BOUND_FINITE : BOUND_NONE; -} - -void QuantifiersEngine::getBoundVarIndices(Node q, - std::vector<unsigned>& indices) const -{ - Assert(indices.empty()); - // we take the bounded variables first - quantifiers::BoundedIntegers* bi = d_qmodules->d_bint.get(); - if (bi) - { - bi->getBoundVarIndices(q, indices); - } - // then get the remaining ones - for (unsigned i = 0, nvars = q[0].getNumChildren(); i < nvars; i++) - { - if (std::find(indices.begin(), indices.end(), i) == indices.end()) - { - indices.push_back(i); - } - } -} - -bool QuantifiersEngine::getBoundElements(RepSetIterator* rsi, - bool initial, - Node q, - Node v, - std::vector<Node>& elements) const -{ - quantifiers::BoundedIntegers* bi = d_qmodules->d_bint.get(); - if (bi) - { - return bi->getBoundElements(rsi, initial, q, v, elements); - } - return false; -} - void QuantifiersEngine::presolve() { Trace("quant-engine-proc") << "QuantifiersEngine : presolve " << std::endl; d_qim.clearPending(); |