import java.util.ArrayList; public class and extends node { public and( node l, node r ) { left = l; right = r; } public node klone() { return new and( left.klone(),right.klone() ); } public node simplify() { // simplify both sides of an and left = left.simplify(); right = right.simplify(); return this; } public String toString() { return array2String( children().toArray(), " and " ); } public ArrayList children() { ArrayList ll; ArrayList l = new ArrayList(); if ( left instanceof and ) l.addAll( ( ( and ) left ).children() ); else l.add( left ); if ( right instanceof and) l.addAll( ( ( and ) right ).children() ); else l.add( right ); return l; } public String cnf2String() { // return parentheses around non-and arguments // String result; if ( left instanceof and ) result = left.cnf2String(); else result = "(" + left.cnf2String() + ")"; if ( right instanceof and ) result = result + " and " + right.cnf2String(); else result = result + " and (" + right.cnf2String() + ")"; return result; } public node cnf() { // rule: anything can sit immediately below ands // left = left.cnf(); right = right.cnf(); return this; } }