#include void bool_rel(BoolView x, BoolRelType t, BoolView y, BoolView z) { // NOT_SUPPORTED; BoolView v[3] = {x, y, z}; int u = 0; for (int l = 1; l <= 3; l++) { for (int i = 0; i < 8; i++) { if (bitcount(i) != l) continue; for (int j = 0; j < 8; j++) { if (j & ~i) continue; int flags = 0; for (int k = 0; k < 8; k++) { bool pass = true; for (int m = 0; m < 3; m++) { if ((i & (1< ps; for (int m = 0; m < 3; m++) { if ((i & (1<>m)&1; if (l == 1) { if (v[m].setValNotR(p)) if (!v[m].setVal(p)) TL_FAIL(); } ps.push(v[m].getLit(p)); } if (l >= 2) sat.addClause(ps); u |= flags; } } } } //----- // \/ x_i \/ !y_i void bool_clause(vec& x, vec& y) { vec ps; for (int i = 0; i < x.size(); i++) ps.push(x[i]); for (int i = 0; i < y.size(); i++) ps.push(~y[i]); sat.addClause(ps); } // \/ x_i void bool_clause(vec& x) { vec b; bool_clause(x, b); } //----- // \/ x_i \/ !y_i <-> z // n+1 clauses void array_bool_or(vec& x, vec& y, BoolView z) { for (int i = 0; i < x.size(); i++) sat.addClause(~x[i], z); for (int i = 0; i < y.size(); i++) sat.addClause(y[i], z); // Add clause !c \/ a_i \/ !b_i vec ps; ps.push(~z); for (int i = 0; i < x.size(); i++) ps.push(x[i]); for (int i = 0; i < y.size(); i++) ps.push(~y[i]); sat.addClause(ps); } void array_bool_or(vec& x, BoolView z) { vec y; array_bool_or(x, y, z); } // /\ x_i /\ !y_i <-> z void array_bool_and(vec& x, vec& y, BoolView z) { array_bool_or(y, x, ~z); } void array_bool_and(vec& x, BoolView z) { vec y; array_bool_and(x, y, z); }