#include "expr/kind.h"
#include "options/strings_options.h"
+#include "theory/ext_theory.h"
#include "theory/rewriter.h"
#include "theory/strings/theory_strings.h"
#include "theory/strings/theory_strings_rewriter.h"
}
}
}
+void InferenceManager::setIncomplete() { d_out.setIncomplete(); }
+
+void InferenceManager::markCongruent(Node a, Node b)
+{
+ Assert(a.getKind() == b.getKind());
+ ExtTheory* eth = d_parent.getExtTheory();
+ if (eth->hasFunctionKind(a.getKind()))
+ {
+ eth->markCongruent(a, b);
+ }
+}
} // namespace strings
} // namespace theory
* to doPendingLemmas.
*
* It also manages other kinds of interaction with the output channel of the
- * theory of strings, e.g. sendPhaseRequirement.
+ * theory of strings, e.g. sendPhaseRequirement, setIncomplete, and
+ * with the extended theory object e.g. markCongruent.
*/
class InferenceManager
{
* the node corresponding to their conjunction.
*/
void explain(TNode literal, std::vector<TNode>& assumptions) const;
+ /**
+ * Set that we are incomplete for the current set of assertions (in other
+ * words, we must answer "unknown" instead of "sat"); this calls the output
+ * channel's setIncomplete method.
+ */
+ void setIncomplete();
+ /**
+ * Mark that terms a and b are congruent in the current context.
+ * This makes a call to markCongruent in the extended theory object of
+ * the parent theory if the kind of a (and b) is owned by the extended
+ * theory.
+ */
+ void markCongruent(Node a, Node b);
private:
/**
if (Trace.isOn("strings-error"))
{
Trace("strings-error") << "Cycle for normal form ";
- printConcat(currv, "strings-error");
+ utils::printConcatTrace(currv, "strings-error");
Trace("strings-error") << "..." << currv[i] << std::endl;
}
Assert(!d_state.areEqual(currv[i], n));
{
Trace("strings-solve") << "- Verify disequalities are processed for "
<< cols[i][0] << ", normal form : ";
- printConcat(getNormalForm(cols[i][0]).d_nf, "strings-solve");
+ utils::printConcatTrace(getNormalForm(cols[i][0]).d_nf,
+ "strings-solve");
Trace("strings-solve")
<< "... #eql = " << cols[i].size() << std::endl;
}
if (Trace.isOn("strings-solve"))
{
Trace("strings-solve") << "- Compare " << cols[i][j] << " ";
- printConcat(getNormalForm(cols[i][j]).d_nf, "strings-solve");
+ utils::printConcatTrace(getNormalForm(cols[i][j]).d_nf,
+ "strings-solve");
Trace("strings-solve") << " against " << cols[i][k] << " ";
- printConcat(getNormalForm(cols[i][k]).d_nf, "strings-solve");
+ utils::printConcatTrace(getNormalForm(cols[i][k]).d_nf,
+ "strings-solve");
Trace("strings-solve") << "..." << std::endl;
}
processDeq(cols[i][j], cols[i][k]);
Trace("strings-card") << "...end check cardinality" << std::endl;
}
-void TheoryStrings::printConcat( std::vector< Node >& n, const char * c ) {
- for( unsigned i=0; i<n.size(); i++ ){
- if( i>0 ) Trace(c) << " ++ ";
- Trace(c) << n[i];
- }
-}
-
//// Finite Model Finding
*/
void registerTerm(Node n, int effort);
- protected:
-
- void printConcat(std::vector<Node>& n, const char* c);
-
// Symbolic Regular Expression
private:
/** regular expression solver module */
}
}
+void printConcat(std::ostream& out, std::vector<Node>& n)
+{
+ for (unsigned i = 0, nsize = n.size(); i < nsize; i++)
+ {
+ if (i > 0)
+ {
+ out << " ++ ";
+ }
+ out << n[i];
+ }
+}
+
+void printConcatTrace(std::vector<Node>& n, const char* c)
+{
+ std::stringstream ss;
+ printConcat(ss, n);
+ Trace(c) << ss.str();
+}
+
} // namespace utils
} // namespace strings
} // namespace theory
*/
void getRegexpComponents(Node r, std::vector<Node>& result);
+/** Print the vector n as a concatentation term on output stream out */
+void printConcat(std::ostream& out, std::vector<Node>& n);
+/** Print the vector n as a concatentation term on trace given by c */
+void printConcatTrace(std::vector<Node>& n, const char* c);
+
} // namespace utils
} // namespace strings
} // namespace theory