package aima.test.core.unit.logic.propositional.kb.data;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import aima.core.logic.propositional.kb.data.ConjunctionOfClauses;
import aima.core.logic.propositional.parsing.PLParser;
import aima.core.logic.propositional.parsing.ast.Sentence;
import aima.core.logic.propositional.visitors.ConvertToConjunctionOfClauses;
/**
* @author Ravi Mohan
*
*/
public class ConvertToConjunctionOfClausesTest {
private PLParser parser = new PLParser();
@Before
public void setUp() {
}
@Test
public void testSymbolTransform() {
Sentence symbol = parser.parse("A");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(symbol);
Assert.assertEquals("{{A}}", transformed.toString());
}
@Test
public void testBasicSentenceTransformation() {
Sentence and = parser.parse("A & B");
ConjunctionOfClauses transformedAnd = ConvertToConjunctionOfClauses.convert(and);
Assert.assertEquals("{{A}, {B}}", transformedAnd.toString());
Sentence or = parser.parse("A | B");
ConjunctionOfClauses transformedOr = ConvertToConjunctionOfClauses.convert(or);
Assert.assertEquals("{{A, B}}", transformedOr.toString());
Sentence not = parser.parse("~C");
ConjunctionOfClauses transformedNot = ConvertToConjunctionOfClauses.convert(not);
Assert.assertEquals("{{~C}}", transformedNot.toString());
}
@Test
public void testImplicationTransformation() {
Sentence impl = parser.parse("A => B");
ConjunctionOfClauses transformedImpl = ConvertToConjunctionOfClauses.convert(impl);
Assert.assertEquals("{{~A, B}}", transformedImpl.toString());
}
@Test
public void testBiConditionalTransformation() {
Sentence bic = parser.parse("A <=> B");
ConjunctionOfClauses transformedBic = ConvertToConjunctionOfClauses.convert(bic);
Assert.assertEquals("{{~A, B}, {~B, A}}", transformedBic.toString());
}
@Test
public void testTwoSuccessiveNotsTransformation() {
Sentence twoNots = parser.parse("~~A");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(twoNots);
Assert.assertEquals("{{A}}", transformed.toString());
}
@Test
public void testThreeSuccessiveNotsTransformation() {
Sentence threeNots = parser.parse("~~~A");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(threeNots);
Assert.assertEquals("{{~A}}", transformed.toString());
}
@Test
public void testFourSuccessiveNotsTransformation() {
Sentence fourNots = parser.parse("~~~~A");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(fourNots);
Assert.assertEquals("{{A}}", transformed.toString());
}
@Test
public void testDeMorgan1() {
Sentence dm = parser.parse("~(A & B)");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(dm);
Assert.assertEquals("{{~A, ~B}}", transformed.toString());
}
@Test
public void testDeMorgan2() {
Sentence dm = parser.parse("~(A | B)");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(dm);
Assert.assertEquals("{{~A}, {~B}}", transformed.toString());
}
@Test
public void testOrDistribution1() {
Sentence or = parser.parse("A & B | C)");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(or);
Assert.assertEquals("{{A, C}, {B, C}}", transformed.toString());
}
@Test
public void testOrDistribution2() {
Sentence or = parser.parse("A | B & C");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(or);
Assert.assertEquals("{{A, B}, {A, C}}", transformed.toString());
}
@Test
public void testAimaExample() {
Sentence aimaEg = parser.parse("B11 <=> P12 | P21");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(aimaEg);
Assert.assertEquals("{{~B11, P12, P21}, {~P12, B11}, {~P21, B11}}", transformed.toString());
}
@Test
public void testNested() {
Sentence nested = parser.parse("A | (B | (C | (D & E)))");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(nested);
Assert.assertEquals("{{A, B, C, D}, {A, B, C, E}}", transformed.toString());
nested = parser.parse("A | (B | (C & (D & E)))");
transformed = ConvertToConjunctionOfClauses.convert(nested);
Assert.assertEquals("{{A, B, C}, {A, B, D}, {A, B, E}}", transformed.toString());
nested = parser.parse("A | (B | (C & (D & (E | F))))");
transformed = ConvertToConjunctionOfClauses.convert(nested);
Assert.assertEquals("{{A, B, C}, {A, B, D}, {A, B, E, F}}", transformed.toString());
nested = parser.parse("(A | (B | (C & D))) | E | (F | (G | (H & I)))");
transformed = ConvertToConjunctionOfClauses.convert(nested);
Assert.assertEquals("{{A, B, C, E, F, G, H}, {A, B, D, E, F, G, H}, {A, B, C, E, F, G, I}, {A, B, D, E, F, G, I}}", transformed.toString());
nested = parser.parse("(((~P | ~Q) => ~(P | Q)) => R)");
transformed = ConvertToConjunctionOfClauses.convert(nested);
Assert.assertEquals("{{~P, ~Q, R}, {P, Q, R}}", transformed.toString());
nested = parser.parse("~(((~P | ~Q) => ~(P | Q)) => R)");
transformed = ConvertToConjunctionOfClauses.convert(nested);
Assert.assertEquals("{{P, ~P}, {Q, ~P}, {P, ~Q}, {Q, ~Q}, {~R}}", transformed.toString());
}
@Test
public void testIssue78() {
// ( ( NOT J1007 ) OR ( NOT ( OR J1008 J1009 J1010 J1011 J1012 J1013 J1014 J1015 ) ) )
Sentence issue78Eg = parser.parse("( ( ~ J1007 ) | ( ~ ( J1008 | J1009 | J1010 | J1011 | J1012 | J1013 | J1014 | J1015 ) ) )");
ConjunctionOfClauses transformed = ConvertToConjunctionOfClauses.convert(issue78Eg);
Assert.assertEquals("{{~J1007, ~J1008}, {~J1007, ~J1009}, {~J1007, ~J1010}, {~J1007, ~J1011}, {~J1007, ~J1012}, {~J1007, ~J1013}, {~J1007, ~J1014}, {~J1007, ~J1015}}", transformed.toString());
}
}