package aima.core.logic.propositional.visitors;
import java.util.HashSet;
import java.util.Set;
import aima.core.logic.propositional.parsing.ast.BinarySentence;
import aima.core.logic.propositional.parsing.ast.Sentence;
import aima.core.logic.propositional.parsing.ast.Symbol;
import aima.core.logic.propositional.parsing.ast.UnarySentence;
/**
* @author Ravi Mohan
*
*/
public class CNFClauseGatherer extends BasicTraverser {
AndDetector detector;
public CNFClauseGatherer() {
detector = new AndDetector();
}
@SuppressWarnings("unchecked")
@Override
public Object visitBinarySentence(BinarySentence bs, Object args) {
Set<Sentence> soFar = (Set<Sentence>) args;
if (detector.containsEmbeddedAnd(bs)) {
processSubTerm(bs.getSecond(), processSubTerm(bs.getFirst(), soFar));
} else {
soFar.add(bs);
}
return soFar;
}
@SuppressWarnings("unchecked")
public Set<Sentence> getClausesFrom(Sentence sentence) {
Set<Sentence> set = new HashSet<Sentence>();
if (sentence instanceof Symbol) {
set.add(sentence);
} else if (sentence instanceof UnarySentence) {
set.add(sentence);
} else {
set = (Set<Sentence>) sentence.accept(this, set);
}
return set;
}
//
// PRIVATE METHODS
//
@SuppressWarnings("unchecked")
private Set<Sentence> processSubTerm(Sentence s, Set<Sentence> soFar) {
if (detector.containsEmbeddedAnd(s)) {
return (Set<Sentence>) s.accept(this, soFar);
} else {
soFar.add(s);
return soFar;
}
}
}