package aima.core.logic.propositional.visitors; import java.util.ArrayList; import java.util.List; import aima.core.logic.propositional.kb.data.Clause; import aima.core.logic.propositional.kb.data.ConjunctionOfClauses; import aima.core.logic.propositional.parsing.ast.Sentence; /** * Artificial Intelligence A Modern Approach (3rd Edition): page 253.<br> * <br> * A sentence expression as a conjunction of clauses is said to be in * <b>conjunctive normal form</b> or <b>CNF</b>.<br> * * <pre> * CNFSentence -> Clause_1 & ... & Clause_n * Clause -> Literal_1 | ... | Literal_m * Literal -> Symbol : ~Symbol * Symbol -> P : Q : R : ... // (1) * </pre> * * Figure 7.14 A grammar for conjunctive normal form.<br> * <br> * Note (1): While the book states 'We use symbols that start with an upper case * letter and may contain other letters or subscripts' in this implementation we * allow any legal java identifier to stand in for a proposition symbol.<br> * * @author Ciaran O'Reilly * @author Ravi Mohan * @author Mike Stampone */ public class ConvertToConjunctionOfClauses { /** * Returns the specified sentence in its logically equivalent conjunction of * clauses. * * @param s * a propositional logic sentence * * @return the input sentence converted to it logically equivalent * conjunction of clauses. */ public static ConjunctionOfClauses convert(Sentence s) { ConjunctionOfClauses result = null; Sentence cnfSentence = ConvertToCNF.convert(s); List<Clause> clauses = new ArrayList<Clause>(); clauses.addAll(ClauseCollector.getClausesFrom(cnfSentence)); result = new ConjunctionOfClauses(clauses); return result; } }