public override ISet <Clause> visitBinarySentence(ComplexSentence s, ISet <Clause> arg) { if (s.isAndSentence()) { s.getSimplerSentence(0).accept(this, arg); s.getSimplerSentence(1).accept(this, arg); } else if (s.isOrSentence()) { ICollection <Literal> literals = CollectionFactory.CreateQueue <Literal>(LiteralCollector.getLiterals(s)); arg.Add(new Clause(literals)); } else { throw new IllegalArgumentException("Sentence is not in CNF: " + s); } return(arg); }
public override Sentence visitBinarySentence(ComplexSentence s, object arg) { Sentence result = null; if (s.isAndSentence()) { Sentence s1 = s.getSimplerSentence(0).accept(this, arg); Sentence s2 = s.getSimplerSentence(1).accept(this, arg); if (s1.isOrSentence() || s2.isOrSentence()) { Sentence alpha, betaAndGamma; if (s2.isOrSentence()) { // (α & (β | γ)) // Note: even if both are 'or' sentence // we will prefer to use s2 alpha = s1; betaAndGamma = s2; } else { // Note: Need to handle this case too // ((β | γ) & α) alpha = s2; betaAndGamma = s1; } Sentence beta = betaAndGamma.getSimplerSentence(0); Sentence gamma = betaAndGamma.getSimplerSentence(1); if (s2.isOrSentence()) { // ((α & β) | (α & γ)) Sentence alphaAndBeta = (new ComplexSentence(Connective.AND, alpha, beta)).accept(this, null); Sentence alphaAndGamma = (new ComplexSentence(Connective.AND, alpha, gamma)).accept(this, null); result = new ComplexSentence(Connective.OR, alphaAndBeta, alphaAndGamma); } else { // ((β & α) | (γ & α)) Sentence betaAndAlpha = (new ComplexSentence(Connective.AND, beta, alpha)).accept(this, null); Sentence gammaAndAlpha = (new ComplexSentence(Connective.AND, gamma, alpha)).accept(this, null); result = new ComplexSentence(Connective.OR, betaAndAlpha, gammaAndAlpha); } } else { result = new ComplexSentence(Connective.AND, s1, s2); } } else { result = base.visitBinarySentence(s, arg); } return(result); }