summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am4
-rw-r--r--src/expr/attribute.h61
-rw-r--r--src/expr/attribute_internals.h144
-rw-r--r--src/expr/node_manager.h5
-rw-r--r--src/preprocessing/passes/apply_to_const.cpp108
-rw-r--r--src/preprocessing/passes/apply_to_const.h51
-rw-r--r--src/preprocessing/passes/extended_rewriter_pass.cpp42
-rw-r--r--src/preprocessing/passes/extended_rewriter_pass.h43
-rw-r--r--src/smt/smt_engine.cpp82
-rw-r--r--src/theory/datatypes/datatypes_rewriter.cpp4
-rw-r--r--src/theory/datatypes/datatypes_rewriter.h7
-rw-r--r--src/theory/quantifiers/fmf/ambqi_builder.cpp6
12 files changed, 308 insertions, 249 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 43aa70174..992f229d6 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -63,6 +63,8 @@ libcvc4_la_SOURCES = \
decision/justification_heuristic.h \
preprocessing/passes/apply_substs.cpp \
preprocessing/passes/apply_substs.h \
+ preprocessing/passes/apply_to_const.cpp \
+ preprocessing/passes/apply_to_const.h \
preprocessing/passes/bv_abstraction.cpp \
preprocessing/passes/bv_abstraction.h \
preprocessing/passes/bv_ackermann.cpp \
@@ -71,6 +73,8 @@ libcvc4_la_SOURCES = \
preprocessing/passes/bv_gauss.h \
preprocessing/passes/bv_intro_pow2.cpp \
preprocessing/passes/bv_intro_pow2.h \
+ preprocessing/passes/extended_rewriter_pass.cpp \
+ preprocessing/passes/extended_rewriter_pass.h \
preprocessing/passes/int_to_bv.cpp \
preprocessing/passes/int_to_bv.h \
preprocessing/passes/pseudo_boolean_processor.cpp \
diff --git a/src/expr/attribute.h b/src/expr/attribute.h
index aafe168ea..db6fb52a0 100644
--- a/src/expr/attribute.h
+++ b/src/expr/attribute.h
@@ -423,66 +423,23 @@ AttributeManager::setAttribute(NodeValue* nv,
ah[std::make_pair(AttrKind::getId(), nv)] = mapping::convert(value);
}
-/**
- * Search for the NodeValue in all attribute tables and remove it,
- * calling the cleanup function if one is defined.
- *
- * This cannot use nv as anything other than a pointer!
- */
+/** Search for the NodeValue in all attribute tables and remove it. */
template <class T>
inline void AttributeManager::deleteFromTable(AttrHash<T>& table,
NodeValue* nv) {
- for(uint64_t id = 0; id < attr::LastAttributeId<T, false>::getId(); ++id) {
- typedef AttributeTraits<T, false> traits_t;
- typedef AttrHash<T> hash_t;
- std::pair<uint64_t, NodeValue*> pr = std::make_pair(id, nv);
- if(traits_t::getCleanup()[id] != NULL) {
- typename hash_t::iterator i = table.find(pr);
- if(i != table.end()) {
- traits_t::getCleanup()[id]((*i).second);
- table.erase(pr);
- }
- } else {
- table.erase(pr);
- }
+ // This cannot use nv as anything other than a pointer!
+ const uint64_t last = attr::LastAttributeId<T, false>::getId();
+ for (uint64_t id = 0; id < last; ++id)
+ {
+ table.erase(std::make_pair(id, nv));
}
}
-/**
- * Remove all attributes from the table calling the cleanup function
- * if one is defined.
- */
+/** Remove all attributes from the table. */
template <class T>
inline void AttributeManager::deleteAllFromTable(AttrHash<T>& table) {
Assert(!d_inGarbageCollection);
d_inGarbageCollection = true;
-
- bool anyRequireClearing = false;
- typedef AttributeTraits<T, false> traits_t;
- typedef AttrHash<T> hash_t;
- for(uint64_t id = 0; id < attr::LastAttributeId<T, false>::getId(); ++id) {
- if(traits_t::getCleanup()[id] != NULL) {
- anyRequireClearing = true;
- }
- }
-
- if(anyRequireClearing) {
- typename hash_t::iterator it = table.begin();
- typename hash_t::iterator it_end = table.end();
-
- while (it != it_end){
- uint64_t id = (*it).first.first;
- /*
- Debug("attrgc") << "id " << id
- << " node_value: " << ((*it).first.second)
- << std::endl;
- */
- if(traits_t::getCleanup()[id] != NULL) {
- traits_t::getCleanup()[id]((*it).second);
- }
- ++it;
- }
- }
table.clear();
d_inGarbageCollection = false;
Assert(!d_inGarbageCollection);
@@ -499,7 +456,6 @@ AttributeUniqueId AttributeManager::getAttributeId(const AttrKind& attr){
template <class T>
void AttributeManager::deleteAttributesFromTable(AttrHash<T>& table, const std::vector<uint64_t>& ids){
d_inGarbageCollection = true;
- typedef AttributeTraits<T, false> traits_t;
typedef AttrHash<T> hash_t;
typename hash_t::iterator it = table.begin();
@@ -516,9 +472,6 @@ void AttributeManager::deleteAttributesFromTable(AttrHash<T>& table, const std::
if(std::binary_search(begin_ids, end_ids, id)){
tmp = it;
++it;
- if(traits_t::getCleanup()[id] != NULL) {
- traits_t::getCleanup()[id]((*tmp).second);
- }
table.erase(tmp);
}else{
++it;
diff --git a/src/expr/attribute_internals.h b/src/expr/attribute_internals.h
index ed1769740..e474c3dfb 100644
--- a/src/expr/attribute_internals.h
+++ b/src/expr/attribute_internals.h
@@ -332,45 +332,6 @@ public:
}/* CVC4::expr::attr namespace */
-// ATTRIBUTE CLEANUP FUNCTIONS =================================================
-
-namespace attr {
-
-/** Default cleanup for unmanaged Attribute<> */
-struct NullCleanupStrategy {
-};/* struct NullCleanupStrategy */
-
-/**
- * Helper for Attribute<> class below to determine whether a cleanup
- * is defined or not.
- */
-template <class T, class C>
-struct getCleanupStrategy {
- typedef T value_type;
- typedef KindValueToTableValueMapping<value_type> mapping;
- static void fn(typename mapping::table_value_type t) {
- C::cleanup(mapping::convertBack(t));
- }
-};/* struct getCleanupStrategy<> */
-
-/**
- * Specialization for NullCleanupStrategy.
- */
-template <class T>
-struct getCleanupStrategy<T, NullCleanupStrategy> {
- typedef T value_type;
- typedef KindValueToTableValueMapping<value_type> mapping;
- static void (*const fn)(typename mapping::table_value_type);
-};/* struct getCleanupStrategy<T, NullCleanupStrategy> */
-
-// out-of-class initialization required (because it's a non-integral type)
-template <class T>
-void (*const getCleanupStrategy<T, NullCleanupStrategy>::fn)
- (typename getCleanupStrategy<T, NullCleanupStrategy>::
- mapping::table_value_type) = NULL;
-
-}/* CVC4::expr::attr namespace */
-
// ATTRIBUTE IDENTIFIER ASSIGNMENT TEMPLATE ====================================
namespace attr {
@@ -381,39 +342,21 @@ namespace attr {
*/
template <class T, bool context_dep>
struct LastAttributeId {
- static uint64_t& getId() {
- static uint64_t s_id = 0;
- return s_id;
+ public:
+ static uint64_t getNextId() {
+ uint64_t* id = raw_id();
+ const uint64_t next_id = *id;
+ ++(*id);
+ return next_id;
}
-};
-
-}/* CVC4::expr::attr namespace */
-
-// ATTRIBUTE TRAITS ============================================================
-
-namespace attr {
-
-/**
- * This is the last-attribute-assigner. IDs are not globally
- * unique; rather, they are unique for each table_value_type.
- */
-template <class T, bool context_dep>
-struct AttributeTraits {
- typedef void (*cleanup_t)(T);
- static std::vector<cleanup_t>& getCleanup() {
- // Note: we do not destroy this vector on purpose. Instead, we rely on the
- // OS to clean up our mess. The reason for that is that we need this vector
- // to remain initialized at least as long as the ExprManager because
- // ExprManager's destructor calls this method. The only way to guarantee
- // this is to never destroy it. This is a common idiom [0]. In the past, we
- // had an issue when `cleanup` wasn't a pointer and just an `std::vector`
- // instead. CxxTest stores the test class in a static variable, which could
- // lead to the ExprManager being destroyed after the destructor of the
- // vector was called.
- //
- // [0] https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use
- static std::vector<cleanup_t>* cleanup = new std::vector<cleanup_t>();
- return *cleanup;
+ static uint64_t getId() {
+ return *raw_id();
+ }
+ private:
+ static uint64_t* raw_id()
+ {
+ static uint64_t s_id = 0;
+ return &s_id;
}
};
@@ -428,18 +371,12 @@ struct AttributeTraits {
*
* @param value_t the underlying value_type for the attribute kind
*
- * @param CleanupStrategy Clean-up routine for associated values when the
- * Node goes away. Useful, e.g., for pointer-valued attributes when
- * the values are "owned" by the table.
- *
* @param context_dep whether this attribute kind is
* context-dependent
*/
-template <class T,
- class value_t,
- class CleanupStrategy = attr::NullCleanupStrategy,
- bool context_dep = false>
-class Attribute {
+template <class T, class value_t, bool context_dep = false>
+class Attribute
+{
/**
* The unique ID associated to this attribute. Assigned statically,
* at load time.
@@ -475,33 +412,16 @@ public:
static inline uint64_t registerAttribute() {
typedef typename attr::KindValueToTableValueMapping<value_t>::
table_value_type table_value_type;
- typedef attr::AttributeTraits<table_value_type, context_dep> traits;
- uint64_t id = attr::LastAttributeId<table_value_type, context_dep>::getId()++;
- Assert(traits::getCleanup().size() == id);// sanity check
- traits::getCleanup().push_back(attr::getCleanupStrategy<value_t,
- CleanupStrategy>::fn);
- return id;
+ return attr::LastAttributeId<table_value_type, context_dep>::getNextId();
}
};/* class Attribute<> */
/**
- * An "attribute type" structure for boolean flags (special). The
- * full one is below; the existence of this one disallows for boolean
- * flag attributes with a specialized cleanup function.
- */
-/* -- doesn't work; other specialization is "more specific" ??
-template <class T, class CleanupStrategy, bool context_dep>
-class Attribute<T, bool, CleanupStrategy, context_dep> {
- template <bool> struct ERROR_bool_attributes_cannot_have_cleanup_functions;
- ERROR_bool_attributes_cannot_have_cleanup_functions<true> blah;
-};
-*/
-
-/**
* An "attribute type" structure for boolean flags (special).
*/
template <class T, bool context_dep>
-class Attribute<T, bool, attr::NullCleanupStrategy, context_dep> {
+class Attribute<T, bool, context_dep>
+{
/** IDs for bool-valued attributes are actually bit assignments. */
static const uint64_t s_id;
@@ -538,7 +458,7 @@ public:
* return the id.
*/
static inline uint64_t registerAttribute() {
- uint64_t id = attr::LastAttributeId<bool, context_dep>::getId()++;
+ const uint64_t id = attr::LastAttributeId<bool, context_dep>::getNextId();
AlwaysAssert( id <= 63,
"Too many boolean node attributes registered "
"during initialization !" );
@@ -549,25 +469,15 @@ public:
// ATTRIBUTE IDENTIFIER ASSIGNMENT =============================================
/** Assign unique IDs to attributes at load time. */
-// Use of the comma-operator here forces instantiation (and
-// initialization) of the AttributeTraits<> structure and its
-// "cleanup" vector before registerAttribute() is called. This is
-// important because otherwise the vector is initialized later,
-// clearing the first-pushed cleanup function.
-template <class T, class value_t, class CleanupStrategy, bool context_dep>
-const uint64_t Attribute<T, value_t, CleanupStrategy, context_dep>::s_id =
- ( attr::AttributeTraits<typename attr::KindValueToTableValueMapping<value_t>::
- table_value_type,
- context_dep>::getCleanup().size(),
- Attribute<T, value_t, CleanupStrategy, context_dep>::registerAttribute() );
+template <class T, class value_t, bool context_dep>
+const uint64_t Attribute<T, value_t, context_dep>::s_id =
+ Attribute<T, value_t, context_dep>::registerAttribute();
+
/** Assign unique IDs to attributes at load time. */
template <class T, bool context_dep>
-const uint64_t Attribute<T,
- bool,
- attr::NullCleanupStrategy, context_dep>::s_id =
- Attribute<T, bool, attr::NullCleanupStrategy, context_dep>::
- registerAttribute();
+const uint64_t Attribute<T, bool, context_dep>::s_id =
+ Attribute<T, bool, context_dep>::registerAttribute();
}/* CVC4::expr namespace */
}/* CVC4 namespace */
diff --git a/src/expr/node_manager.h b/src/expr/node_manager.h
index 8bbf905a9..7d1259fcc 100644
--- a/src/expr/node_manager.h
+++ b/src/expr/node_manager.h
@@ -128,10 +128,7 @@ class NodeManager {
* contexts, like as a key in attribute tables), even though
* normally it's an error to have a TNode to a node value with a
* reference count of 0. Being "under deletion" also enables
- * assertions that inc() is not called on it. (A poorly-behaving
- * attribute cleanup function could otherwise create a "Node" that
- * points to the node value that is in the process of being deleted,
- * springing it back to life.)
+ * assertions that inc() is not called on it.
*/
expr::NodeValue* d_nodeUnderDeletion;
diff --git a/src/preprocessing/passes/apply_to_const.cpp b/src/preprocessing/passes/apply_to_const.cpp
new file mode 100644
index 000000000..bbe4439ec
--- /dev/null
+++ b/src/preprocessing/passes/apply_to_const.cpp
@@ -0,0 +1,108 @@
+/********************* */
+/*! \file apply_to_const.cpp
+ ** \verbatim
+ ** Top contributors (to current version):
+ ** Haniel Barbosa
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2018 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 The ApplyToConst preprocessing pass
+ **
+ ** Rewrites applies to constants
+ **/
+
+#include "preprocessing/passes/apply_to_const.h"
+
+#include "theory/rewriter.h"
+
+namespace CVC4 {
+namespace preprocessing {
+namespace passes {
+
+using namespace CVC4::theory;
+
+ApplyToConst::ApplyToConst(PreprocessingPassContext* preprocContext)
+ : PreprocessingPass(preprocContext, "apply-to-const"){};
+
+Node ApplyToConst::rewriteApplyToConst(TNode n, NodeMap& cache)
+{
+ Trace("rewriteApplyToConst") << "rewriteApplyToConst :: " << n << std::endl;
+
+ if (n.getMetaKind() == kind::metakind::CONSTANT
+ || n.getMetaKind() == kind::metakind::VARIABLE
+ || n.getMetaKind() == kind::metakind::NULLARY_OPERATOR)
+ {
+ return n;
+ }
+
+ if (cache.find(n) != cache.end())
+ {
+ Trace("rewriteApplyToConst") << "in cache :: " << cache[n] << std::endl;
+ return cache[n];
+ }
+
+ if (n.getKind() == kind::APPLY_UF)
+ {
+ if (n.getNumChildren() == 1 && n[0].isConst() && n[0].getType().isInteger())
+ {
+ stringstream ss;
+ ss << n.getOperator() << "_";
+ if (n[0].getConst<Rational>() < 0)
+ {
+ ss << "m" << -n[0].getConst<Rational>();
+ }
+ else
+ {
+ ss << n[0];
+ }
+ Node newvar =
+ NodeManager::currentNM()->mkSkolem(ss.str(),
+ n.getType(),
+ "rewriteApplyToConst skolem",
+ NodeManager::SKOLEM_EXACT_NAME);
+ cache[n] = newvar;
+ Trace("rewriteApplyToConst") << "made :: " << newvar << std::endl;
+ return newvar;
+ }
+ stringstream ss;
+ ss << "The rewrite-apply-to-const preprocessor is currently limited;\n"
+ << "it only works if all function symbols are unary and with Integer\n"
+ << "domain, and all applications are to integer values.\n"
+ << "Found application: " << n;
+ Unhandled(ss.str());
+ }
+
+ NodeBuilder<> builder(n.getKind());
+ if (n.getMetaKind() == kind::metakind::PARAMETERIZED)
+ {
+ builder << n.getOperator();
+ }
+ for (unsigned i = 0; i < n.getNumChildren(); ++i)
+ {
+ builder << rewriteApplyToConst(n[i], cache);
+ }
+ Node rewr = builder;
+ cache[n] = rewr;
+ Trace("rewriteApplyToConst") << "built :: " << rewr << std::endl;
+ return rewr;
+}
+
+PreprocessingPassResult ApplyToConst::applyInternal(
+ AssertionPipeline* assertionsToPreprocess)
+{
+ NodeMap cache;
+ for (unsigned i = 0, size = assertionsToPreprocess->size(); i < size; ++i)
+ {
+ assertionsToPreprocess->replace(i,
+ Rewriter::rewrite(rewriteApplyToConst(
+ (*assertionsToPreprocess)[i], cache)));
+ }
+ return PreprocessingPassResult::NO_CONFLICT;
+}
+
+} // namespace passes
+} // namespace preprocessing
+} // namespace CVC4
diff --git a/src/preprocessing/passes/apply_to_const.h b/src/preprocessing/passes/apply_to_const.h
new file mode 100644
index 000000000..9d5072023
--- /dev/null
+++ b/src/preprocessing/passes/apply_to_const.h
@@ -0,0 +1,51 @@
+/********************* */
+/*! \file apply_to_const.h
+ ** \verbatim
+ ** Top contributors (to current version):
+ ** Haniel Barbosa
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2018 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 The ApplyToConst preprocessing pass
+ **
+ ** Rewrites applies to constants
+ **/
+
+#include "cvc4_private.h"
+
+#ifndef __CVC4__PREPROCESSING__PASSES__APPLY_TO_CONST_H
+#define __CVC4__PREPROCESSING__PASSES__APPLY_TO_CONST_H
+
+#include <unordered_map>
+
+#include "expr/node.h"
+#include "preprocessing/preprocessing_pass.h"
+#include "preprocessing/preprocessing_pass_context.h"
+
+namespace CVC4 {
+namespace preprocessing {
+namespace passes {
+
+using NodeMap = std::unordered_map<Node, Node, NodeHashFunction>;
+
+class ApplyToConst : public PreprocessingPass
+{
+ public:
+ ApplyToConst(PreprocessingPassContext* preprocContext);
+
+ protected:
+ PreprocessingPassResult applyInternal(
+ AssertionPipeline* assertionsToPreprocess) override;
+
+ private:
+ Node rewriteApplyToConst(TNode n, NodeMap& cache);
+};
+
+} // namespace passes
+} // namespace preprocessing
+} // namespace CVC4
+
+#endif /* __CVC4__PREPROCESSING__PASSES__APPLY_TO_CONST_H */
diff --git a/src/preprocessing/passes/extended_rewriter_pass.cpp b/src/preprocessing/passes/extended_rewriter_pass.cpp
new file mode 100644
index 000000000..572aaed7a
--- /dev/null
+++ b/src/preprocessing/passes/extended_rewriter_pass.cpp
@@ -0,0 +1,42 @@
+/********************* */
+/*! \file extended_rewriter_pass.cpp
+ ** \verbatim
+ ** Top contributors (to current version):
+ ** Haniel Barbosa
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2018 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 The ExtRewPre preprocessing pass
+ **
+ ** Applies the extended rewriter to assertions
+ **/
+
+#include "preprocessing/passes/extended_rewriter_pass.h"
+
+#include "theory/quantifiers/extended_rewrite.h"
+
+namespace CVC4 {
+namespace preprocessing {
+namespace passes {
+
+ExtRewPre::ExtRewPre(PreprocessingPassContext* preprocContext)
+ : PreprocessingPass(preprocContext, "ext-rew-pre"){};
+
+PreprocessingPassResult ExtRewPre::applyInternal(
+ AssertionPipeline* assertionsToPreprocess)
+{
+ theory::quantifiers::ExtendedRewriter extr(options::extRewPrepAgg());
+ for (unsigned i = 0, size = assertionsToPreprocess->size(); i < size; ++i)
+ {
+ assertionsToPreprocess->replace(
+ i, extr.extendedRewrite((*assertionsToPreprocess)[i]));
+ }
+ return PreprocessingPassResult::NO_CONFLICT;
+}
+
+} // namespace passes
+} // namespace preprocessing
+} // namespace CVC4
diff --git a/src/preprocessing/passes/extended_rewriter_pass.h b/src/preprocessing/passes/extended_rewriter_pass.h
new file mode 100644
index 000000000..f604a1af5
--- /dev/null
+++ b/src/preprocessing/passes/extended_rewriter_pass.h
@@ -0,0 +1,43 @@
+/********************* */
+/*! \file extended_rewriter_pass.h
+ ** \verbatim
+ ** Top contributors (to current version):
+ ** Haniel Barbosa
+ ** This file is part of the CVC4 project.
+ ** Copyright (c) 2009-2018 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 The ExtRewPre preprocessing pass
+ **
+ ** Applies the extended rewriter to assertions
+ **/
+
+#include "cvc4_private.h"
+
+#ifndef __CVC4__PREPROCESSING__PASSES__EXTENDED_REWRITER_PASS_H
+#define __CVC4__PREPROCESSING__PASSES__EXTENDED_REWRITER_PASS_H
+
+#include "preprocessing/preprocessing_pass.h"
+#include "preprocessing/preprocessing_pass_context.h"
+
+namespace CVC4 {
+namespace preprocessing {
+namespace passes {
+
+class ExtRewPre : public PreprocessingPass
+{
+ public:
+ ExtRewPre(PreprocessingPassContext* preprocContext);
+
+ protected:
+ PreprocessingPassResult applyInternal(
+ AssertionPipeline* assertionsToPreprocess) override;
+};
+
+} // namespace passes
+} // namespace preprocessing
+} // namespace CVC4
+
+#endif /* __CVC4__PREPROCESSING__PASSES__EXTENDED_REWRITER_PASS_H */
diff --git a/src/smt/smt_engine.cpp b/src/smt/smt_engine.cpp
index db4efe89f..b5d758bca 100644
--- a/src/smt/smt_engine.cpp
+++ b/src/smt/smt_engine.cpp
@@ -70,12 +70,14 @@
#include "options/theory_options.h"
#include "options/uf_options.h"
#include "preprocessing/passes/apply_substs.h"
+#include "preprocessing/passes/apply_to_const.h"
#include "preprocessing/passes/bool_to_bv.h"
#include "preprocessing/passes/bv_abstraction.h"
#include "preprocessing/passes/bv_ackermann.h"
#include "preprocessing/passes/bv_gauss.h"
#include "preprocessing/passes/bv_intro_pow2.h"
#include "preprocessing/passes/bv_to_bool.h"
+#include "preprocessing/passes/extended_rewriter_pass.h"
#include "preprocessing/passes/int_to_bv.h"
#include "preprocessing/passes/pseudo_boolean_processor.h"
#include "preprocessing/passes/real_to_int.h"
@@ -897,66 +899,6 @@ public:
return retval;
}
- NodeToNodeHashMap d_rewriteApplyToConstCache;
- Node rewriteApplyToConst(TNode n) {
- Trace("rewriteApplyToConst") << "rewriteApplyToConst :: " << n << std::endl;
-
- if(n.getMetaKind() == kind::metakind::CONSTANT ||
- n.getMetaKind() == kind::metakind::VARIABLE ||
- n.getMetaKind() == kind::metakind::NULLARY_OPERATOR)
- {
- return n;
- }
-
- if(d_rewriteApplyToConstCache.find(n) != d_rewriteApplyToConstCache.end()) {
- Trace("rewriteApplyToConst") << "in cache :: "
- << d_rewriteApplyToConstCache[n]
- << std::endl;
- return d_rewriteApplyToConstCache[n];
- }
-
- if(n.getKind() == kind::APPLY_UF) {
- if(n.getNumChildren() == 1 && n[0].isConst() &&
- n[0].getType().isInteger())
- {
- stringstream ss;
- ss << n.getOperator() << "_";
- if(n[0].getConst<Rational>() < 0) {
- ss << "m" << -n[0].getConst<Rational>();
- } else {
- ss << n[0];
- }
- Node newvar = NodeManager::currentNM()->mkSkolem(
- ss.str(), n.getType(), "rewriteApplyToConst skolem",
- NodeManager::SKOLEM_EXACT_NAME);
- d_rewriteApplyToConstCache[n] = newvar;
- Trace("rewriteApplyToConst") << "made :: " << newvar << std::endl;
- return newvar;
- } else {
- stringstream ss;
- ss << "The rewrite-apply-to-const preprocessor is currently limited;"
- << std::endl
- << "it only works if all function symbols are unary and with Integer"
- << std::endl
- << "domain, and all applications are to integer values." << std::endl
- << "Found application: " << n;
- Unhandled(ss.str());
- }
- }
-
- NodeBuilder<> builder(n.getKind());
- if(n.getMetaKind() == kind::metakind::PARAMETERIZED) {
- builder << n.getOperator();
- }
- for(unsigned i = 0; i < n.getNumChildren(); ++i) {
- builder << rewriteApplyToConst(n[i]);
- }
- Node rewr = builder;
- d_rewriteApplyToConstCache[n] = rewr;
- Trace("rewriteApplyToConst") << "built :: " << rewr << std::endl;
- return rewr;
- }
-
void addUseTheoryListListener(TheoryEngine* theoryEngine){
Options& nodeManagerOptions = NodeManager::currentNM()->getOptions();
d_listenerRegistrations->add(
@@ -2717,6 +2659,8 @@ void SmtEnginePrivate::finishInit()
// actually assembling preprocessing pipelines).
std::unique_ptr<ApplySubsts> applySubsts(
new ApplySubsts(d_preprocessingPassContext.get()));
+ std::unique_ptr<ApplyToConst> applyToConst(
+ new ApplyToConst(d_preprocessingPassContext.get()));
std::unique_ptr<BoolToBV> boolToBv(
new BoolToBV(d_preprocessingPassContext.get()));
std::unique_ptr<BvAbstraction> bvAbstract(
@@ -2729,6 +2673,8 @@ void SmtEnginePrivate::finishInit()
new BvIntroPow2(d_preprocessingPassContext.get()));
std::unique_ptr<BVToBool> bvToBool(
new BVToBool(d_preprocessingPassContext.get()));
+ std::unique_ptr<ExtRewPre> extRewPre(
+ new ExtRewPre(d_preprocessingPassContext.get()));
std::unique_ptr<IntToBV> intToBV(
new IntToBV(d_preprocessingPassContext.get()));
std::unique_ptr<PseudoBooleanProcessor> pbProc(
@@ -2750,6 +2696,8 @@ void SmtEnginePrivate::finishInit()
new SepSkolemEmp(d_preprocessingPassContext.get()));
d_preprocessingPassRegistry.registerPass("apply-substs",
std::move(applySubsts));
+ d_preprocessingPassRegistry.registerPass("apply-to-const",
+ std::move(applyToConst));
d_preprocessingPassRegistry.registerPass("bool-to-bv", std::move(boolToBv));
d_preprocessingPassRegistry.registerPass("bv-abstraction",
std::move(bvAbstract));
@@ -2759,6 +2707,7 @@ void SmtEnginePrivate::finishInit()
d_preprocessingPassRegistry.registerPass("bv-intro-pow2",
std::move(bvIntroPow2));
d_preprocessingPassRegistry.registerPass("bv-to-bool", std::move(bvToBool));
+ d_preprocessingPassRegistry.registerPass("ext-rew-pre", std::move(extRewPre));
d_preprocessingPassRegistry.registerPass("int-to-bv", std::move(intToBV));
d_preprocessingPassRegistry.registerPass("pseudo-boolean-processor",
std::move(pbProc));
@@ -4211,19 +4160,14 @@ void SmtEnginePrivate::processAssertions() {
if (options::extRewPrep())
{
- theory::quantifiers::ExtendedRewriter extr(options::extRewPrepAgg());
- for (unsigned i = 0; i < d_assertions.size(); ++i)
- {
- Node a = d_assertions[i];
- d_assertions.replace(i, extr.extendedRewrite(a));
- }
+ d_preprocessingPassRegistry.getPass("ext-rew-pre")->apply(&d_assertions);
}
// Unconstrained simplification
if(options::unconstrainedSimp()) {
Trace("smt-proc") << "SmtEnginePrivate::processAssertions() : pre-unconstrained-simp" << endl;
dumpAssertions("pre-unconstrained-simp", d_assertions);
- d_preprocessingPassRegistry.getPass("rewrite")->apply(&d_assertions);
+ d_preprocessingPassRegistry.getPass("rewrite")->apply(&d_assertions);
unconstrainedSimp();
Trace("smt-proc") << "SmtEnginePrivate::processAssertions() : post-unconstrained-simp" << endl;
dumpAssertions("post-unconstrained-simp", d_assertions);
@@ -4476,9 +4420,7 @@ void SmtEnginePrivate::processAssertions() {
if(options::rewriteApplyToConst()) {
Chat() << "Rewriting applies to constants..." << endl;
TimerStat::CodeTimer codeTimer(d_smt.d_stats->d_rewriteApplyToConstTime);
- for (unsigned i = 0; i < d_assertions.size(); ++ i) {
- d_assertions[i] = Rewriter::rewrite(rewriteApplyToConst(d_assertions[i]));
- }
+ d_preprocessingPassRegistry.getPass("apply-to-const")->apply(&d_assertions);
}
dumpAssertions("post-rewrite-apply-to-const", d_assertions);
diff --git a/src/theory/datatypes/datatypes_rewriter.cpp b/src/theory/datatypes/datatypes_rewriter.cpp
index 8366fe4e1..a8e5d74b6 100644
--- a/src/theory/datatypes/datatypes_rewriter.cpp
+++ b/src/theory/datatypes/datatypes_rewriter.cpp
@@ -186,7 +186,7 @@ RewriteResponse DatatypesRewriter::postRewrite(TNode in)
return RewriteResponse(REWRITE_DONE, in);
}
-Kind getOperatorKindForSygusBuiltin(Node op)
+Kind DatatypesRewriter::getOperatorKindForSygusBuiltin(Node op)
{
Assert(op.getKind() != BUILTIN);
if (op.getKind() == LAMBDA)
@@ -212,7 +212,7 @@ Kind getOperatorKindForSygusBuiltin(Node op)
{
return APPLY_UF;
}
- return NodeManager::operatorToKind(op);
+ return UNDEFINED_KIND;
}
Node DatatypesRewriter::mkSygusTerm(const Datatype& dt,
diff --git a/src/theory/datatypes/datatypes_rewriter.h b/src/theory/datatypes/datatypes_rewriter.h
index 7d91544e1..a6c95b893 100644
--- a/src/theory/datatypes/datatypes_rewriter.h
+++ b/src/theory/datatypes/datatypes_rewriter.h
@@ -121,6 +121,13 @@ public:
* C( x, y ) and z
*/
static bool checkClash(Node n1, Node n2, std::vector<Node>& rew);
+ /** get operator kind for sygus builtin
+ *
+ * This returns the Kind corresponding to applications of the operator op
+ * when building the builtin version of sygus terms. This is used by the
+ * function mkSygusTerm.
+ */
+ static Kind getOperatorKindForSygusBuiltin(Node op);
/** make sygus term
*
* This function returns a builtin term f( children[0], ..., children[n] )
diff --git a/src/theory/quantifiers/fmf/ambqi_builder.cpp b/src/theory/quantifiers/fmf/ambqi_builder.cpp
index 5def5fc95..f2b131f21 100644
--- a/src/theory/quantifiers/fmf/ambqi_builder.cpp
+++ b/src/theory/quantifiers/fmf/ambqi_builder.cpp
@@ -13,6 +13,8 @@
**/
#include "theory/quantifiers/fmf/ambqi_builder.h"
+
+#include "base/cvc4_check.h"
#include "options/quantifiers_options.h"
#include "theory/quantifiers/instantiate.h"
#include "theory/quantifiers/term_database.h"
@@ -367,8 +369,8 @@ void AbsDef::construct_var( FirstOrderModelAbs * m, TNode q, unsigned v, int cur
}else{
TypeNode tn = m->getVariable( q, depth ).getType();
if( v==depth ){
- unsigned numReps = m->getRepSet()->getNumRepresentatives(tn);
- Assert( numReps>0 && numReps < 32 );
+ const unsigned numReps = m->getRepSet()->getNumRepresentatives(tn);
+ CVC4_CHECK(numReps > 0 && numReps < 32);
for( unsigned i=0; i<numReps; i++ ){
d_def[ 1 << i ].construct_var( m, q, v, i, depth+1 );
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback