4 #include "polarityassignment.h"
6 void CSolver::replaceBooleanWithTrue(BooleanEdge bexpr) {
7 if (constraints.contains(bexpr.negate())) {
8 constraints.remove(bexpr.negate());
11 if (constraints.contains(bexpr)) {
12 constraints.remove(bexpr);
15 replaceBooleanWithTrueNoRemove(bexpr);
18 void CSolver::replaceBooleanWithFalseNoRemove(BooleanEdge bexpr) {
19 replaceBooleanWithTrueNoRemove(bexpr.negate());
22 void CSolver::replaceBooleanWithTrueNoRemove(BooleanEdge bexpr) {
23 updateMustValue(bexpr.getBoolean(), bexpr.isNegated() ? BV_MUSTBEFALSE : BV_MUSTBETRUE);
25 ASSERT(bexpr->boolVal != BV_UNSAT);
27 uint size = bexpr->parents.getSize();
28 for (uint i = 0; i < size; i++) {
29 Boolean *parent = bexpr->parents.get(i);
30 ASSERT(parent->type == LOGICOP);
31 BooleanLogic *logicop = (BooleanLogic *) parent;
32 switch (logicop->op) {
34 handleANDTrue(logicop, bexpr);
37 handleIFFTrue(logicop, bexpr);
48 void CSolver::replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb) {
50 if (oldb.isNegated()) {
55 if (constraints.contains(oldb)) {
56 constraints.remove(oldb);
57 constraints.add(newb);
58 if (newb->type == BOOLEANVAR)
59 replaceBooleanWithTrue(newb);
61 replaceBooleanWithTrueNoRemove(newb);
64 if (constraints.contains(oldb.negate())) {
65 constraints.remove(oldb.negate());
66 constraints.add(newb.negate());
67 if (newb->type == BOOLEANVAR)
68 replaceBooleanWithTrue(newb.negate());
70 replaceBooleanWithTrueNoRemove(newb.negate());
74 BooleanEdge oldbnegated = oldb.negate();
75 uint size = oldb->parents.getSize();
76 for (uint i = 0; i < size; i++) {
77 Boolean *parent = oldb->parents.get(i);
78 BooleanLogic *logicop = (BooleanLogic *) parent;
79 boolMap.remove(parent); //could change parent's hash
81 uint parentsize = logicop->inputs.getSize();
82 for (uint j = 0; j < parentsize; j++) {
83 BooleanEdge b = logicop->inputs.get(j);
85 logicop->inputs.set(j, newb);
86 newb->parents.push(parent);
87 } else if (b == oldbnegated) {
88 logicop->inputs.set(j, newb.negate());
89 newb->parents.push(parent);
92 boolMap.put(parent, parent);
96 void CSolver::handleIFFTrue(BooleanLogic *bexpr, BooleanEdge child) {
97 uint size = bexpr->inputs.getSize();
98 BooleanEdge b0 = bexpr->inputs.get(0);
99 BooleanEdge b1 = bexpr->inputs.get(1);
100 BooleanEdge childnegate = child.negate();
101 bexpr->replaced = true;
103 replaceBooleanWithBoolean(BooleanEdge(bexpr), b1);
104 } else if (b0 == childnegate) {
105 replaceBooleanWithBoolean(BooleanEdge(bexpr), b1.negate());
106 } else if (b1 == child) {
107 replaceBooleanWithBoolean(BooleanEdge(bexpr), b0);
108 } else if (b1 == childnegate) {
109 replaceBooleanWithBoolean(BooleanEdge(bexpr), b0.negate());
114 void CSolver::handleANDTrue(BooleanLogic *bexpr, BooleanEdge child) {
115 BooleanEdge childNegate = child.negate();
117 boolMap.remove(bexpr);
119 for (uint i = 0; i < bexpr->inputs.getSize(); i++) {
120 BooleanEdge b = bexpr->inputs.get(i);
123 bexpr->inputs.remove(i);
125 } else if (b == childNegate) {
126 replaceBooleanWithFalse(bexpr);
131 uint size = bexpr->inputs.getSize();
133 bexpr->replaced = true;
134 replaceBooleanWithTrue(bexpr);
135 } else if (size == 1) {
136 bexpr->replaced = true;
137 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
139 //Won't build any of these in future cases...
140 boolMap.put(bexpr, bexpr);
144 void CSolver::replaceBooleanWithFalse(BooleanEdge bexpr) {
145 replaceBooleanWithTrue(bexpr.negate());
148 BooleanEdge CSolver::doRewrite(BooleanEdge bexpr) {
149 bool isNegated = bexpr.isNegated();
150 BooleanLogic *b = (BooleanLogic *) bexpr.getBoolean();
152 if (b->op == SATC_IFF) {
153 if (isTrue(b->inputs.get(0))) {
154 result = b->inputs.get(1);
155 } else if (isFalse(b->inputs.get(0))) {
156 result = b->inputs.get(1).negate();
157 } else if (isTrue(b->inputs.get(1))) {
158 result = b->inputs.get(0);
159 } else if (isFalse(b->inputs.get(1))) {
160 result = b->inputs.get(0).negate();
162 } else if (b->op == SATC_AND) {
163 uint size = b->inputs.getSize();
167 result = b->inputs.get(0);
170 return isNegated ? result.negate() : result;