package aima.core.logic.propositional.visitors; import aima.core.logic.propositional.parsing.AbstractPLVisitor; import aima.core.logic.propositional.parsing.ast.ComplexSentence; import aima.core.logic.propositional.parsing.ast.Connective; import aima.core.logic.propositional.parsing.ast.Sentence; /** * Artificial Intelligence A Modern Approach (3rd Edition): page 253.<br> * <br> * Eliminate <=>, replacing α <=> β<br> * with (α => β) & (β => α) * * @author Ciaran O'Reilly * */ public class BiconditionalElimination extends AbstractPLVisitor<Object> { /** * Eliminate the biconditionals from a sentence. * * @param sentence * a propositional logic sentence. * @return an equivalent Sentence to the input with all biconditionals * eliminated. */ public static Sentence eliminate(Sentence sentence) { BiconditionalElimination eliminator = new BiconditionalElimination(); Sentence result = sentence.accept(eliminator, null); return result; } @Override public Sentence visitBinarySentence(ComplexSentence s, Object arg) { Sentence result = null; if (s.isBiconditionalSentence()) { // Eliminate <=>, replace α <=> β // with (α => β) & (β => α) Sentence alpha = s.getSimplerSentence(0).accept(this, arg); Sentence beta = s.getSimplerSentence(1).accept(this, arg); Sentence alphaImpliesBeta = new ComplexSentence( Connective.IMPLICATION, alpha, beta); Sentence betaImpliesAlpha = new ComplexSentence( Connective.IMPLICATION, beta, alpha); result = new ComplexSentence(Connective.AND, alphaImpliesBeta, betaImpliesAlpha); } else { result = super.visitBinarySentence(s, arg); } return result; } }