package aima.test.core.unit.logic.propositional.visitors;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import aima.core.logic.propositional.parsing.PEParser;
import aima.core.logic.propositional.parsing.ast.Sentence;
import aima.core.logic.propositional.visitors.CNFTransformer;
/**
* @author Ravi Mohan
*
*/
public class CNFTransformerTest {
private PEParser parser = new PEParser();
private CNFTransformer transformer;
@Before
public void setUp() {
transformer = new CNFTransformer();
}
@Test
public void testSymbolTransform() {
Sentence symbol = (Sentence) parser.parse("A");
Sentence transformed = transformer.transform(symbol);
Assert.assertEquals("A", transformed.toString());
}
@Test
public void testBasicSentenceTransformation() {
Sentence and = (Sentence) parser.parse("(A AND B)");
Sentence transformedAnd = transformer.transform(and);
Assert.assertEquals(and.toString(), transformedAnd.toString());
Sentence or = (Sentence) parser.parse("(A OR B)");
Sentence transformedOr = transformer.transform(or);
Assert.assertEquals(or.toString(), transformedOr.toString());
Sentence not = (Sentence) parser.parse("(NOT C)");
Sentence transformedNot = transformer.transform(not);
Assert.assertEquals(not.toString(), transformedNot.toString());
}
@Test
public void testImplicationTransformation() {
Sentence impl = (Sentence) parser.parse("(A => B)");
Sentence expected = (Sentence) parser.parse("((NOT A) OR B)");
Sentence transformedImpl = transformer.transform(impl);
Assert.assertEquals(expected.toString(), transformedImpl.toString());
}
@Test
public void testBiConditionalTransformation() {
Sentence bic = (Sentence) parser.parse("(A <=> B)");
Sentence expected = (Sentence) parser
.parse("(((NOT A) OR B) AND ((NOT B) OR A)) ");
Sentence transformedBic = transformer.transform(bic);
Assert.assertEquals(expected.toString(), transformedBic.toString());
}
@Test
public void testTwoSuccessiveNotsTransformation() {
Sentence twoNots = (Sentence) parser.parse("(NOT (NOT A))");
Sentence expected = (Sentence) parser.parse("A");
Sentence transformed = transformer.transform(twoNots);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testThreeSuccessiveNotsTransformation() {
Sentence threeNots = (Sentence) parser.parse("(NOT (NOT (NOT A)))");
Sentence expected = (Sentence) parser.parse("(NOT A)");
Sentence transformed = transformer.transform(threeNots);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testFourSuccessiveNotsTransformation() {
Sentence fourNots = (Sentence) parser
.parse("(NOT (NOT (NOT (NOT A))))");
Sentence expected = (Sentence) parser.parse("A");
Sentence transformed = transformer.transform(fourNots);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testDeMorgan1() {
Sentence dm = (Sentence) parser.parse("(NOT (A AND B))");
Sentence expected = (Sentence) parser.parse("((NOT A) OR (NOT B))");
Sentence transformed = transformer.transform(dm);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testDeMorgan2() {
Sentence dm = (Sentence) parser.parse("(NOT (A OR B))");
Sentence expected = (Sentence) parser.parse("((NOT A) AND (NOT B))");
Sentence transformed = transformer.transform(dm);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testOrDistribution1() {
Sentence or = (Sentence) parser.parse("((A AND B) OR C)");
Sentence expected = (Sentence) parser.parse("((C OR A) AND (C OR B))");
Sentence transformed = transformer.transform(or);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testOrDistribution2() {
Sentence or = (Sentence) parser.parse("(A OR (B AND C))");
Sentence expected = (Sentence) parser.parse("((A OR B) AND (A OR C))");
Sentence transformed = transformer.transform(or);
Assert.assertEquals(expected.toString(), transformed.toString());
}
@Test
public void testAimaExample() {
Sentence aimaEg = (Sentence) parser.parse("( B11 <=> (P12 OR P21))");
Sentence expected = (Sentence) parser
.parse(" ( ( ( NOT B11 ) OR ( P12 OR P21 ) ) AND ( ( B11 OR ( NOT P12 ) ) AND ( B11 OR ( NOT P21 ) ) ) )");
Sentence transformed = transformer.transform(aimaEg);
Assert.assertEquals(expected.toString(), transformed.toString());
}
}