5 void CSolver::replaceBooleanWithTrue(Boolean *bexpr) {
6 if (constraints.contains(bexpr)) {
7 constraints.remove(bexpr);
10 uint size = bexpr->parents.getSize();
11 for (uint i = 0; i < size; i++) {
12 Boolean *parent = bexpr->parents.get(i);
13 BooleanLogic *logicop = (BooleanLogic *) parent;
14 switch (logicop->op) {
16 handleANDTrue(logicop, bexpr);
19 replaceBooleanWithTrue(parent);
22 replaceBooleanWithFalse(parent);
25 handleXORFalse(logicop, bexpr);
28 handleXORTrue(logicop, bexpr);
31 handleIMPLIESTrue(logicop, bexpr);
37 void CSolver::replaceBooleanWithBoolean(Boolean *oldb, Boolean *newb) {
38 if (constraints.contains(oldb)) {
39 constraints.remove(oldb);
40 constraints.add(newb);
43 uint size = oldb->parents.getSize();
44 for (uint i = 0; i < size; i++) {
45 Boolean *parent = oldb->parents.get(i);
46 BooleanLogic *logicop = (BooleanLogic *) parent;
48 uint parentsize = logicop->inputs.getSize();
50 for (uint j = 0; j < parentsize; j++) {
51 Boolean *b = logicop->inputs.get(i);
53 logicop->inputs.set(i, newb);
54 newb->parents.push(parent);
60 void handleXORTrue(BooleanLogic *bexpr, Boolean *child) {
61 uint size = bexpr->inputs.getSize();
62 Boolean *b = bexpr->inputs.get(0);
63 uint childindex = (b == child) ? 0 : 1;
64 bexpr->inputs.remove(childindex);
68 void CSolver::handleXORFalse(BooleanLogic *bexpr, Boolean *child) {
69 uint size = bexpr->inputs.getSize();
70 Boolean *b = bexpr->inputs.get(0);
71 uint otherindex = (b == child) ? 1 : 0;
72 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(otherindex));
75 void CSolver::handleIMPLIESTrue(BooleanLogic *bexpr, Boolean *child) {
76 uint size = bexpr->inputs.getSize();
77 Boolean *b = bexpr->inputs.get(0);
79 //Replace with other term
80 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(1));
82 //Statement is true...
83 replaceBooleanWithTrue(bexpr);
87 void CSolver::handleIMPLIESFalse(BooleanLogic *bexpr, Boolean *child) {
88 uint size = bexpr->inputs.getSize();
89 Boolean *b = bexpr->inputs.get(0);
91 //Statement is true...
92 replaceBooleanWithTrue(bexpr);
94 //Make into negation of first term
100 void CSolver::handleANDTrue(BooleanLogic *bexpr, Boolean *child) {
101 uint size = bexpr->inputs.getSize();
104 replaceBooleanWithTrue(bexpr);
108 for (uint i = 0; i < size; i++) {
109 Boolean *b = bexpr->inputs.get(i);
111 bexpr->inputs.remove(i);
116 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
120 void CSolver::handleORFalse(BooleanLogic *bexpr, Boolean *child) {
121 uint size = bexpr->inputs.getSize();
124 replaceBooleanWithFalse(bexpr);
127 for (uint i = 0; i < size; i++) {
128 Boolean *b = bexpr->inputs.get(i);
130 bexpr->inputs.remove(i);
135 replaceBooleanWithBoolean(bexpr, bexpr->inputs.get(0));
139 void CSolver::replaceBooleanWithFalse(Boolean *bexpr) {
140 if (constraints.contains(bexpr)) {
142 constraints.remove(bexpr);
145 uint size = bexpr->parents.getSize();
146 for (uint i = 0; i < size; i++) {
147 Boolean *parent = bexpr->parents.get(i);
148 BooleanLogic *logicop = (BooleanLogic *) parent;
149 switch (logicop->op) {
151 replaceBooleanWithFalse(parent);
154 handleORFalse(logicop, bexpr);
157 replaceBooleanWithTrue(parent);
160 handleXORTrue(logicop, bexpr);
163 handleXORFalse(logicop, bexpr);
166 handleIMPLIESFalse(logicop, bexpr);