import java.util.ArrayList; public class or extends node { public or( node l, node r ) { left = l; right = r; } public node klone() { return new or( left.klone(), right.klone() ); } public node simplify() { left = left.simplify(); right = right.simplify(); return this; } public String toString() { return array2String( children().toArray(), " or " ); } public String cnf2String() { return left.cnf2String() + " or " + right.cnf2String(); } public node cnf() { // if a branch is an or, then we must first recurse on it if ( left instanceof or ) left = left.cnf(); if ( right instanceof or ) right = right.cnf(); // rule in cnf -- ands cannot be below ors // the action is then to keep expanding // // (a ^ b) v c => (a v c) ^ (b v c) // if ( left instanceof and ) { node temp = new and( new or( left.left, right ), new or( left.right, right.klone() ) ); return temp.cnf(); } // // c v (a ^ b) => (c v a) ^ (c v b) // if ( right instanceof and ) { node temp = new and( new or( left, right.left ), new or( left.klone(), right.right ) ); return temp.cnf(); } return this; } public ArrayList children() { ArrayList ll; ArrayList l = new ArrayList(); if ( left instanceof or ) l.addAll( ( ( or ) left ).children() ); else l.add( left ); if ( right instanceof or) l.addAll( ( ( or) right ).children() ); else l.add( right ); return l; } }