summaryrefslogtreecommitdiff
path: root/src/theory/booleans
diff options
context:
space:
mode:
authorClark Barrett <barrett@cs.nyu.edu>2011-07-11 19:53:44 +0000
committerClark Barrett <barrett@cs.nyu.edu>2011-07-11 19:53:44 +0000
commitf65c5c4cbc59527dc0c9c57283a373ef501792c5 (patch)
tree4a5b270413a72260d404c431a27c2f01209fae21 /src/theory/booleans
parent7515ee9cda0925721c4fa7e1ba9ef3b25dc5e0d0 (diff)
Clark's work on array theory - can now solve all QF_AX problems
Diffstat (limited to 'src/theory/booleans')
-rw-r--r--src/theory/booleans/theory_bool_rewriter.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/theory/booleans/theory_bool_rewriter.cpp b/src/theory/booleans/theory_bool_rewriter.cpp
index 18aa71667..d2693268f 100644
--- a/src/theory/booleans/theory_bool_rewriter.cpp
+++ b/src/theory/booleans/theory_bool_rewriter.cpp
@@ -42,14 +42,51 @@ RewriteResponse TheoryBoolRewriter::preRewrite(TNode n) {
if (n[0] == ff) return RewriteResponse(REWRITE_AGAIN, n[1]);
if (n[1] == ff) return RewriteResponse(REWRITE_AGAIN, n[0]);
}
+ else {
+ bool done = true;
+ TNode::iterator i = n.begin(), iend = n.end();
+ for(; i != iend; ++i) {
+ if (*i == tt) return RewriteResponse(REWRITE_DONE, tt);
+ if (*i == ff) done = false;
+ }
+ if (!done) {
+ NodeBuilder<> nb(kind::OR);
+ for(i = n.begin(); i != iend; ++i) {
+ if (*i != ff) nb << *i;
+ }
+ if (nb.getNumChildren() == 0) return RewriteResponse(REWRITE_DONE, ff);
+ if (nb.getNumChildren() == 1) return RewriteResponse(REWRITE_AGAIN, nb.getChild(0));
+ return RewriteResponse(REWRITE_AGAIN, nb.constructNode());
+ }
+ }
break;
}
case kind::AND: {
+ //TODO: Why REWRITE_AGAIN here?
if (n.getNumChildren() == 2) {
if (n[0] == ff || n[1] == ff) return RewriteResponse(REWRITE_DONE, ff);
if (n[0] == tt) return RewriteResponse(REWRITE_AGAIN, n[1]);
if (n[1] == tt) return RewriteResponse(REWRITE_AGAIN, n[0]);
}
+ else {
+ bool done = true;
+ TNode::iterator i = n.begin(), iend = n.end();
+ for(; i != iend; ++i) {
+ if (*i == ff) return RewriteResponse(REWRITE_DONE, ff);
+ if (*i == tt) done = false;
+ }
+ if (!done) {
+ NodeBuilder<> nb(kind::AND);
+ for(i = n.begin(); i != iend; ++i) {
+ if (*i != tt) {
+ nb << *i;
+ }
+ }
+ if (nb.getNumChildren() == 0) return RewriteResponse(REWRITE_DONE, tt);
+ if (nb.getNumChildren() == 1) return RewriteResponse(REWRITE_AGAIN, nb.getChild(0));
+ return RewriteResponse(REWRITE_AGAIN, nb.constructNode());
+ }
+ }
break;
}
case kind::IMPLIES: {
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback