* After this step, <code>conjuncts</code> is the flattened list of
* conjuncts, each in DNF
*/
ATermList rootConjuncts = (ATermList) term.getArgument( 0 );
List<ATermAppl> conjuncts = new ArrayList<ATermAppl>();
MultiListIterator i = new MultiListIterator( rootConjuncts );
while( i.hasNext() ) {
ATermAppl a = i.next();
if( isAnd( a ) )
i.append( (ATermList) a.getArgument( 0 ) );
else {
ATermAppl dnfA = dnfFromNnf( a );
conjuncts.add( dnfA );
}
}
/*
* Step 2: element-wise distribute any disjunction among the
* conjuncts.
*/
List<ATermAppl> disjuncts = new ArrayList<ATermAppl>();
for( ATermAppl a : conjuncts ) {
if( disjuncts.isEmpty() ) {
addToList( a, isOr( a ), disjuncts );
}
else {
List<ATermAppl> thisArgs = new ArrayList<ATermAppl>();
List<ATermAppl> newDisjuncts = new ArrayList<ATermAppl>();
addToList( a, isOr( a ), thisArgs );
for( ATermAppl a1 : thisArgs ) {
for( ATermAppl b : disjuncts ) {
List<ATermAppl> list = new ArrayList<ATermAppl>();
addToList( a1, isAnd( a1 ), list );
addToList( b, isAnd( b ), list );
newDisjuncts.add( makeAnd( toSet( list ) ) );
}
}
disjuncts = newDisjuncts;
}
}
dnf = makeOr( toSet( disjuncts ) );
}
/*
* If the term is a disjunction merge each element into DNF
*/
else if( ORFUN.equals( fun ) ) {
ATermList disjuncts = (ATermList) term.getArgument( 0 );
MultiListIterator i = new MultiListIterator( disjuncts );
List<ATermAppl> args = new ArrayList<ATermAppl>();
while( i.hasNext() ) {
ATermAppl a = i.next();
if( isOr( a ) )
i.append( (ATermList) a.getArgument( 0 ) );
else
args.add( dnfFromNnf( a ) );
}
dnf = makeOr( toSet( args ) );
}