package aima.test.core.unit.logic.propositional.visitors;
import java.util.Set;
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.CNFClauseGatherer;
import aima.core.logic.propositional.visitors.CNFTransformer;
/**
* @author Ravi Mohan
*
*/
public class CNFClauseGathererTest {
private CNFClauseGatherer gatherer;
private PEParser parser;
@Before
public void setUp() {
parser = new PEParser();
gatherer = new CNFClauseGatherer();
}
@Test
public void testSymbol() {
Sentence simple = (Sentence) parser.parse("A");
Sentence a = (Sentence) parser.parse("A");
Set<Sentence> clauses = gatherer.getClausesFrom(simple);
Assert.assertNotNull(clauses);
Assert.assertEquals(1, clauses.size());
Assert.assertTrue(clauses.contains(a));
}
@Test
public void testNotSentence() {
Sentence simple = (Sentence) parser.parse("(NOT A)");
Sentence a = (Sentence) parser.parse("(NOT A)");
Set<Sentence> clauses = gatherer.getClausesFrom(simple);
Assert.assertNotNull(clauses);
Assert.assertEquals(1, clauses.size());
Assert.assertTrue(clauses.contains(a));
}
@Test
public void testSimpleAndClause() {
Sentence simple = (Sentence) parser.parse("(A AND B)");
Sentence a = (Sentence) parser.parse("A");
Sentence b = (Sentence) parser.parse("B");
Set<Sentence> clauses = gatherer.getClausesFrom(simple);
Assert.assertEquals(2, clauses.size());
Assert.assertTrue(clauses.contains(a));
Assert.assertTrue(clauses.contains(b));
}
@Test
public void testMultiAndClause() {
Sentence simple = (Sentence) parser.parse("((A AND B) AND C)");
Set<Sentence> clauses = gatherer.getClausesFrom(simple);
Assert.assertEquals(3, clauses.size());
Sentence a = (Sentence) parser.parse("A");
Sentence b = (Sentence) parser.parse("B");
Sentence c = (Sentence) parser.parse("C");
Assert.assertTrue(clauses.contains(a));
Assert.assertTrue(clauses.contains(b));
Assert.assertTrue(clauses.contains(c));
}
@Test
public void testMultiAndClause2() {
Sentence simple = (Sentence) parser.parse("(A AND (B AND C))");
Set<Sentence> clauses = gatherer.getClausesFrom(simple);
Assert.assertEquals(3, clauses.size());
Sentence a = (Sentence) parser.parse("A");
Sentence b = (Sentence) parser.parse("B");
Sentence c = (Sentence) parser.parse("C");
Assert.assertTrue(clauses.contains(a));
Assert.assertTrue(clauses.contains(b));
Assert.assertTrue(clauses.contains(c));
}
@Test
public void testAimaExample() {
Sentence aimaEg = (Sentence) parser.parse("( B11 <=> (P12 OR P21))");
CNFTransformer transformer = new CNFTransformer();
Sentence transformed = transformer.transform(aimaEg);
Set<Sentence> clauses = gatherer.getClausesFrom(transformed);
Sentence clause1 = (Sentence) parser.parse("( B11 OR ( NOT P12 ) )");
Sentence clause2 = (Sentence) parser.parse("( B11 OR ( NOT P21 ) )");
Sentence clause3 = (Sentence) parser
.parse("( ( NOT B11 ) OR ( P12 OR P21 ) )");
Assert.assertEquals(3, clauses.size());
Assert.assertTrue(clauses.contains(clause1));
Assert.assertTrue(clauses.contains(clause2));
Assert.assertTrue(clauses.contains(clause3));
}
}