import java.util.ArrayList; // EXPERIMENTAL -- NOT YET USED // predicate that allows at most one to be true class choose1 extends node { public choose1( node l, node r ) { left = l; right = r; } public node klone() { return new choose1( left.klone(),right.klone() ); } public ArrayList children() { ArrayList ll; ArrayList l = new ArrayList(); if ( left instanceof choose1 ) l.addAll( ( ( choose1 ) left ).children() ); else l.add( left ); if ( right instanceof choose1 ) l.addAll( ( ( choose1 ) right ).children() ); else l.add( right ); return l; } private node elem( Object[] o, int i ) { return ( ( node ) o[i] ).klone(); } private node makeAnd( Object[] o, int i, int j ) { return new not( new and( elem( o,i ), elem( o,j ) ) ); } /* * x # y # z => (-x^-y^z v -x^y^-z v x^-y^-z ) */ public node simplify() { node n = null; Object[] o = children().toArray(); int l = o.length; if ( l == 1 ) return (node) o[0]; node orr = (node) o[0]; node atmost1 = (node) o[0]; for ( int i=1; i<l; i++ ) { orr = new or( orr, (node) o[i] ); atmost1 = new atmostone( atmost1, (node) o[i] ); } node result = (new and(orr, atmost1)).simplify(); return result; } public String toString() { return "choose1" +array2String( children().toArray(), "," ); } public String cnf2String() { // return parentheses around non-and arguments // System.out.println( " should not call " ); System.exit( 1 ); return null; } public node cnf() { // rule: anything can sit immediately below ands // System.out.println( " should not call " ); System.exit( 1 ); return null; } }