4 #include "polarityassignment.h"
6 void CSolver::replaceBooleanWithTrue(BooleanEdge bexpr) {
7 if (constraints.contains(bexpr.negate())) {
8 constraints.remove(bexpr.negate());
10 model_println("replaceBooleanWithTrue");
14 if (constraints.contains(bexpr)) {
15 constraints.remove(bexpr);
18 replaceBooleanWithTrueNoRemove(bexpr);
21 void CSolver::replaceBooleanWithTrueNoRemove(BooleanEdge bexpr) {
22 updateMustValue(bexpr.getBoolean(), bexpr.isNegated() ? BV_MUSTBEFALSE : BV_MUSTBETRUE);
24 ASSERT(bexpr->boolVal != BV_UNSAT);
26 uint size = bexpr->parents.getSize();
27 for (uint i = 0; i < size; i++) {
28 Boolean *parent = bexpr->parents.get(i);
29 ASSERT(parent->type == LOGICOP);
30 BooleanLogic *logicop = (BooleanLogic *) parent;
31 switch (logicop->op) {
33 handleANDTrue(logicop, bexpr);
36 handleIFFTrue(logicop, bexpr);
47 void CSolver::replaceBooleanWithBoolean(BooleanEdge oldb, BooleanEdge newb) {
49 if (oldb.isNegated()) {
54 if (constraints.contains(oldb)) {
55 constraints.remove(oldb);
56 constraints.add(newb);
57 if (newb->type == BOOLEANVAR)
58 replaceBooleanWithTrue(newb);
60 replaceBooleanWithTrueNoRemove(newb);
63 if (constraints.contains(oldb.negate())) {
64 constraints.remove(oldb.negate());
65 constraints.add(newb.negate());
66 if (newb->type == BOOLEANVAR)
67 replaceBooleanWithTrue(newb.negate());
69 replaceBooleanWithTrueNoRemove(newb.negate());
73 BooleanEdge oldbnegated = oldb.negate();
74 uint size = oldb->parents.getSize();
75 for (uint i = 0; i < size; i++) {
76 Boolean *parent = oldb->parents.get(i);
77 BooleanLogic *logicop = (BooleanLogic *) parent;
78 boolMap.remove(parent); //could change parent's hash
80 uint parentsize = logicop->inputs.getSize();
81 for (uint j = 0; j < parentsize; j++) {
82 BooleanEdge b = logicop->inputs.get(j);
84 logicop->inputs.set(j, newb);
85 newb->parents.push(parent);
86 } else if (b == oldbnegated) {
87 logicop->inputs.set(j, newb.negate());
88 newb->parents.push(parent);
91 boolMap.put(parent, parent);
95 void CSolver::handleIFFTrue(BooleanLogic *bexpr, BooleanEdge child) {
96 uint size = bexpr->inputs.getSize();
97 BooleanEdge b0 = bexpr->inputs.get(0);
98 BooleanEdge b1 = bexpr->inputs.get(1);
99 BooleanEdge childnegate = child.negate();
100 bexpr->replaced = true;
102 replaceBooleanWithBoolean(BooleanEdge(bexpr), b1);
103 } else if (b0 == childnegate) {
104 replaceBooleanWithBoolean(BooleanEdge(bexpr), b1.negate());
105 } else if (b1 == child) {
106 replaceBooleanWithBoolean(BooleanEdge(bexpr), b0);
107 } else if (b1 == childnegate) {
108 replaceBooleanWithBoolean(BooleanEdge(bexpr), b0.negate());
113 void CSolver::handleANDTrue(BooleanLogic *bexpr, BooleanEdge child) {
114 BooleanEdge childNegate=child.negate();
116 boolMap.remove(bexpr);
118 for (uint i = 0; i < bexpr->inputs.getSize(); i++) {
119 BooleanEdge b = bexpr->inputs.get(i);
122 bexpr->inputs.remove(i);
124 } else if (b == childNegate) {
125 replaceBooleanWithFalse(bexpr);
130 uint size=bexpr->inputs.getSize();
132 bexpr->replaced = true;
133 replaceBooleanWithTrue(bexpr);
134 } else if (size == 1) {
135 bexpr->replaced = true;
136 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
138 //Won't build any of these in future cases...
139 boolMap.put(bexpr, bexpr);
143 void CSolver::replaceBooleanWithFalse(BooleanEdge bexpr) {
144 replaceBooleanWithTrue(bexpr.negate());
147 BooleanEdge CSolver::doRewrite(BooleanEdge bexpr) {
148 bool isNegated=bexpr.isNegated();
149 BooleanLogic * b = (BooleanLogic *) bexpr.getBoolean();
151 if (b->op == SATC_IFF) {
152 if (isTrue(b->inputs.get(0))) {
153 result = b->inputs.get(1);
154 } else if (isFalse(b->inputs.get(0))) {
155 result = b->inputs.get(1).negate();
156 } else if (isTrue(b->inputs.get(1))) {
157 result = b->inputs.get(0);
158 } else if (isFalse(b->inputs.get(1))) {
159 result = b->inputs.get(0).negate();
161 } else if (b->op==SATC_AND) {
162 uint size = b->inputs.getSize();
166 result = b->inputs.get(0);
169 return isNegated ? result.negate() : result;