summaryrefslogtreecommitdiff
path: root/src/theory/quantifiers/quant_module.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/theory/quantifiers/quant_module.h')
-rw-r--r--src/theory/quantifiers/quant_module.h186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/theory/quantifiers/quant_module.h b/src/theory/quantifiers/quant_module.h
new file mode 100644
index 000000000..4d0481484
--- /dev/null
+++ b/src/theory/quantifiers/quant_module.h
@@ -0,0 +1,186 @@
+/********************* */
+/*! \file quant_module.h
+ ** \verbatim
+ ** Top contributors (to current version):
+ ** Andrew Reynolds, Morgan Deters, Mathias Preiner
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2020 by the authors listed in the file AUTHORS
+ ** in the top-level source directory and their institutional affiliations.
+ ** All rights reserved. See the file COPYING in the top-level source
+ ** directory for licensing information.\endverbatim
+ **
+ ** \brief quantifier module
+ **/
+
+#include "cvc4_private.h"
+
+#ifndef CVC4__THEORY__QUANT_MODULE_H
+#define CVC4__THEORY__QUANT_MODULE_H
+
+#include <iostream>
+#include <map>
+#include <vector>
+
+#include "theory/quantifiers/quantifiers_inference_manager.h"
+#include "theory/quantifiers/quantifiers_registry.h"
+#include "theory/quantifiers/quantifiers_state.h"
+#include "theory/theory.h"
+#include "theory/uf/equality_engine.h"
+
+namespace CVC4 {
+namespace theory {
+
+class QuantifiersEngine;
+
+namespace quantifiers {
+class TermDb;
+class TermUtil;
+} // namespace quantifiers
+
+/** QuantifiersModule class
+ *
+ * This is the virtual class for defining subsolvers of the quantifiers theory.
+ * It has a similar interface to a Theory object.
+ */
+class QuantifiersModule
+{
+ public:
+ /** effort levels for quantifiers modules check */
+ enum QEffort
+ {
+ // conflict effort, for conflict-based instantiation
+ QEFFORT_CONFLICT,
+ // standard effort, for heuristic instantiation
+ QEFFORT_STANDARD,
+ // model effort, for model-based instantiation
+ QEFFORT_MODEL,
+ // last call effort, for last resort techniques
+ QEFFORT_LAST_CALL,
+ // none
+ QEFFORT_NONE,
+ };
+
+ public:
+ QuantifiersModule(quantifiers::QuantifiersState& qs,
+ quantifiers::QuantifiersInferenceManager& qim,
+ quantifiers::QuantifiersRegistry& qr,
+ QuantifiersEngine* qe);
+ virtual ~QuantifiersModule() {}
+ /** Presolve.
+ *
+ * Called at the beginning of check-sat call.
+ */
+ virtual void presolve() {}
+ /** Needs check.
+ *
+ * Returns true if this module wishes a call to be made
+ * to check(e) during QuantifiersEngine::check(e).
+ */
+ virtual bool needsCheck(Theory::Effort e)
+ {
+ return e >= Theory::EFFORT_LAST_CALL;
+ }
+ /** Needs model.
+ *
+ * Whether this module needs a model built during a
+ * call to QuantifiersEngine::check(e)
+ * It returns one of QEFFORT_* from quantifiers_engine.h,
+ * which specifies the quantifiers effort in which it requires the model to
+ * be built.
+ */
+ virtual QEffort needsModel(Theory::Effort e);
+ /** Reset.
+ *
+ * Called at the beginning of QuantifiersEngine::check(e).
+ */
+ virtual void reset_round(Theory::Effort e) {}
+ /** Check.
+ *
+ * Called during QuantifiersEngine::check(e) depending
+ * if needsCheck(e) returns true.
+ */
+ virtual void check(Theory::Effort e, QEffort quant_e) = 0;
+ /** Check complete?
+ *
+ * Returns false if the module's reasoning was globally incomplete
+ * (e.g. "sat" must be replaced with "incomplete").
+ *
+ * This is called just before the quantifiers engine will return
+ * with no lemmas added during a LAST_CALL effort check.
+ */
+ virtual bool checkComplete() { return true; }
+ /** Check was complete for quantified formula q
+ *
+ * If for each quantified formula q, some module returns true for
+ * checkCompleteFor( q ),
+ * and no lemmas are added by the quantifiers theory, then we may answer
+ * "sat", unless
+ * we are incomplete for other reasons.
+ */
+ virtual bool checkCompleteFor(Node q) { return false; }
+ /** Check ownership
+ *
+ * Called once for new quantified formulas that are registered by the
+ * quantifiers theory. The primary purpose of this function is to establish
+ * if this module is the owner of quantified formula q.
+ */
+ virtual void checkOwnership(Node q) {}
+ /** Register quantifier
+ *
+ * Called once for new quantified formulas q that are pre-registered by the
+ * quantifiers theory, after internal ownership of quantified formulas is
+ * finalized. This does context-independent initialization of this module
+ * for quantified formula q.
+ */
+ virtual void registerQuantifier(Node q) {}
+ /** Pre-register quantifier
+ *
+ * Called once for new quantified formulas that are
+ * pre-registered by the quantifiers theory, after
+ * internal ownership of quantified formulas is finalized.
+ */
+ virtual void preRegisterQuantifier(Node q) {}
+ /** Assert node.
+ *
+ * Called when a quantified formula q is asserted to the quantifiers theory
+ */
+ virtual void assertNode(Node q) {}
+ /** Identify this module (for debugging, dynamic configuration, etc..) */
+ virtual std::string identify() const = 0;
+ //----------------------------general queries
+ /** get currently used the equality engine */
+ eq::EqualityEngine* getEqualityEngine() const;
+ /** are n1 and n2 equal in the current used equality engine? */
+ bool areEqual(TNode n1, TNode n2) const;
+ /** are n1 and n2 disequal in the current used equality engine? */
+ bool areDisequal(TNode n1, TNode n2) const;
+ /** get the representative of n in the current used equality engine */
+ TNode getRepresentative(TNode n) const;
+ /** get quantifiers engine that owns this module */
+ QuantifiersEngine* getQuantifiersEngine() const;
+ /** get currently used term database */
+ quantifiers::TermDb* getTermDatabase() const;
+ /** get currently used term utility object */
+ quantifiers::TermUtil* getTermUtil() const;
+ /** get the quantifiers state */
+ quantifiers::QuantifiersState& getState();
+ /** get the quantifiers inference manager */
+ quantifiers::QuantifiersInferenceManager& getInferenceManager();
+ /** get the quantifiers registry */
+ quantifiers::QuantifiersRegistry& getQuantifiersRegistry();
+ //----------------------------end general queries
+ protected:
+ /** pointer to the quantifiers engine that owns this module */
+ QuantifiersEngine* d_quantEngine;
+ /** The state of the quantifiers engine */
+ quantifiers::QuantifiersState& d_qstate;
+ /** The quantifiers inference manager */
+ quantifiers::QuantifiersInferenceManager& d_qim;
+ /** The quantifiers registry */
+ quantifiers::QuantifiersRegistry& d_qreg;
+}; /* class QuantifiersModule */
+
+} // namespace theory
+} // namespace CVC4
+
+#endif /* CVC4__THEORY__QUANT_UTIL_H */
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback