// Negates this simple expression private SimpleExpression negate() { SimpleExpression ret = null; if (sop == NEG) ret = getChild(0); else if (sop == LIT) ret = (equals(szero)) ? sone : szero; else if (sop >= EQ && sop <= GT) { ret = (SimpleExpression) clone(); ret.sop = negateOp(sop); } else if (sop == AND || sop == OR) { ret = new SimpleExpression((sop == AND) ? OR : AND); for (SimpleExpression child : children) ret.add(child.negate()); } else { ret = new SimpleExpression(NEG); ret.add(this); } return ret; }
// Normalizes an AND|OR operation private SimpleExpression normalizeLogic() { if (!allow(LOGIC)) return this; TreeSet<SimpleExpression> set = new TreeSet<SimpleExpression>(children); TreeSet<SimpleExpression> neg = new TreeSet<SimpleExpression>(); SimpleExpression ret = new SimpleExpression(sop); for (SimpleExpression child : set) { if (sop == AND) { if (child.equals(szero) || neg.contains(child)) return szero; else if (child.sop != LIT) // ==LIT means non-zero literal. ret.add(child); } else // sop == OR { if ((child.sop == LIT && !child.equals(szero)) || neg.contains(child)) return sone; else if (child.sop != LIT) // ==LIT means zero literal. ret.add(child); } neg.add(child.negate()); } if (ret.children.size() == 0) // skipped literals. ret = (ret.sop == AND) ? sone : szero; else if (ret.children.size() == 1) ret = ret.getChild(0); // Tools.printlnStatus("[LOGIC] "+this+" --> "+ret, 1); return ret; }