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.parsing.ast.Symbol;
import aima.core.logic.propositional.visitors.SymbolClassifier;
/**
* @author Ravi Mohan
*
*/
public class SymbolClassifierTest {
private SymbolClassifier classifier;
private PEParser parser;
@Before
public void setUp() {
classifier = new SymbolClassifier();
parser = new PEParser();
}
@Test
public void testSimpleNegativeSymbol() {
Sentence sentence = (Sentence) parser.parse("(NOT B)");
Set<Symbol> neg = classifier.getNegativeSymbolsIn(sentence);
Set<Symbol> pos = classifier.getPositiveSymbolsIn(sentence);
Set<Symbol> pureNeg = classifier.getPureNegativeSymbolsIn(sentence);
Set<Symbol> purePos = classifier.getPurePositiveSymbolsIn(sentence);
Set<Symbol> pure = classifier.getPureSymbolsIn(sentence);
Set<Symbol> impure = classifier.getImpureSymbolsIn(sentence);
Sentence b = (Sentence) parser.parse("B");
Assert.assertEquals(1, neg.size());
Assert.assertTrue(neg.contains(b));
Assert.assertEquals(0, pos.size());
Assert.assertEquals(1, pureNeg.size());
Assert.assertTrue(pureNeg.contains(b));
Assert.assertEquals(0, purePos.size());
Assert.assertEquals(1, pure.size());
Assert.assertTrue(pure.contains(b));
Assert.assertEquals(0, impure.size());
}
@Test
public void testSimplePositiveSymbol() {
Sentence sentence = (Sentence) parser.parse("B");
Set<Symbol> neg = classifier.getNegativeSymbolsIn(sentence);
Set<Symbol> pos = classifier.getPositiveSymbolsIn(sentence);
Set<Symbol> pureNeg = classifier.getPureNegativeSymbolsIn(sentence);
Set<Symbol> purePos = classifier.getPurePositiveSymbolsIn(sentence);
Set<Symbol> pure = classifier.getPureSymbolsIn(sentence);
Set<Symbol> impure = classifier.getImpureSymbolsIn(sentence);
Assert.assertEquals(0, neg.size());
Assert.assertEquals(1, pos.size());
Sentence b = (Sentence) parser.parse("B");
Assert.assertTrue(pos.contains(b));
Assert.assertEquals(1, purePos.size());
Assert.assertTrue(purePos.contains(b));
Assert.assertEquals(0, pureNeg.size());
Assert.assertEquals(1, pure.size());
Assert.assertTrue(pure.contains(b));
Assert.assertEquals(0, impure.size());
}
@Test
public void testSingleSymbolPositiveAndNegative() {
Sentence sentence = (Sentence) parser.parse("(B AND (NOT B))");
Set<Symbol> neg = classifier.getNegativeSymbolsIn(sentence);
Set<Symbol> pos = classifier.getPositiveSymbolsIn(sentence);
Set<Symbol> pureNeg = classifier.getPureNegativeSymbolsIn(sentence);
Set<Symbol> purePos = classifier.getPurePositiveSymbolsIn(sentence);
Set<Symbol> pure = classifier.getPureSymbolsIn(sentence);
Set<Symbol> impure = classifier.getImpureSymbolsIn(sentence);
Sentence b = (Sentence) parser.parse("B");
Assert.assertEquals(1, neg.size());
Assert.assertTrue(neg.contains(b));
Assert.assertEquals(1, pos.size());
Assert.assertTrue(pos.contains(b));
Assert.assertEquals(0, pureNeg.size());
Assert.assertEquals(0, purePos.size());
Assert.assertEquals(0, pure.size());
Assert.assertEquals(1, impure.size());
}
@Test
public void testAIMA2eExample() {
// 2nd Edition Pg 221
Sentence sentence = (Sentence) parser
.parse("(((A OR (NOT B)) AND ((NOT B) OR (NOT C))) AND (C OR A))");
Set<Symbol> neg = classifier.getNegativeSymbolsIn(sentence);
Set<Symbol> pos = classifier.getPositiveSymbolsIn(sentence);
Set<Symbol> pureNeg = classifier.getPureNegativeSymbolsIn(sentence);
Set<Symbol> purePos = classifier.getPurePositiveSymbolsIn(sentence);
Set<Symbol> pure = classifier.getPureSymbolsIn(sentence);
Set<Symbol> impure = classifier.getImpureSymbolsIn(sentence);
Sentence a = (Sentence) parser.parse("A");
Sentence b = (Sentence) parser.parse("B");
Sentence c = (Sentence) parser.parse("C");
Assert.assertEquals(2, neg.size());
Assert.assertTrue(neg.contains(b));
Assert.assertTrue(neg.contains(c));
Assert.assertEquals(2, pos.size());
Assert.assertTrue(pos.contains(a));
Assert.assertTrue(pos.contains(c));
Assert.assertEquals(1, pureNeg.size());
Assert.assertTrue(pureNeg.contains(b));
Assert.assertEquals(1, purePos.size());
Assert.assertTrue(purePos.contains(a));
Assert.assertEquals(2, pure.size());
Assert.assertTrue(pure.contains(a));
Assert.assertTrue(pure.contains(b));
Assert.assertEquals(1, impure.size());
Assert.assertTrue(impure.contains(c));
}
}