/* * Created on Dec 4, 2004 * */ package aima.logic.propositional.visitors; import java.util.HashSet; import java.util.Set; import aima.logic.propositional.parsing.ast.BinarySentence; import aima.logic.propositional.parsing.ast.Sentence; import aima.logic.propositional.parsing.ast.Symbol; import aima.logic.propositional.parsing.ast.UnarySentence; public class CNFClauseGatherer extends BasicTraverser { AndDetector detector; public CNFClauseGatherer() { detector = new AndDetector(); } public Object visitBinarySentence(BinarySentence bs, Object args) { Set soFar = (Set) args; Sentence first = bs.getFirst(); Sentence second = bs.getSecond(); processSubTerm(second, processSubTerm(first, soFar)); return soFar; } private Set processSubTerm(Sentence s, Set soFar) { if (detector.containsEmbeddedAnd(s)) { return (Set) s.accept(this, soFar); } else { soFar.add(s); return soFar; } } public Set getClausesFrom(Sentence sentence) { Set set = new HashSet(); if (sentence instanceof Symbol) { set.add(sentence); } else if (sentence instanceof UnarySentence){ set.add(sentence); } else { set = (Set) sentence.accept(this, set); } return set; } }