package aima.test.core.unit.logic.fol.kb; import java.util.ArrayList; import java.util.List; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import aima.core.logic.fol.StandardizeApartIndexicalFactory; import aima.core.logic.fol.domain.DomainFactory; import aima.core.logic.fol.kb.FOLKnowledgeBase; import aima.core.logic.fol.kb.data.Clause; import aima.core.logic.fol.kb.data.Literal; import aima.core.logic.fol.parsing.ast.Predicate; import aima.core.logic.fol.parsing.ast.Term; import aima.core.logic.fol.parsing.ast.Variable; /** * @author Ravi Mohan * @author Ciaran O'Reilly * */ public class FOLKnowledgeBaseTest { private FOLKnowledgeBase weaponsKB, kingsKB; @Before public void setUp() { StandardizeApartIndexicalFactory.flush(); weaponsKB = new FOLKnowledgeBase(DomainFactory.weaponsDomain()); kingsKB = new FOLKnowledgeBase(DomainFactory.kingsDomain()); } @Test public void testAddRuleAndFact() { weaponsKB.tell("(Missile(x) => Weapon(x))"); Assert.assertEquals(1, weaponsKB.getNumberRules()); weaponsKB.tell("American(West)"); Assert.assertEquals(1, weaponsKB.getNumberRules()); Assert.assertEquals(1, weaponsKB.getNumberFacts()); } @Test public void testAddComplexRule() { weaponsKB .tell("( (((American(x) AND Weapon(y)) AND Sells(x,y,z)) AND Hostile(z)) => Criminal(x))"); Assert.assertEquals(1, weaponsKB.getNumberRules()); weaponsKB.tell("American(West)"); Assert.assertEquals(1, weaponsKB.getNumberRules()); List<Term> terms = new ArrayList<Term>(); terms.add(new Variable("v0")); Clause dcRule = weaponsKB.getAllDefiniteClauseImplications().get(0); Assert.assertNotNull(dcRule); Assert.assertEquals(true, dcRule.isImplicationDefiniteClause()); Assert.assertEquals(new Literal(new Predicate("Criminal", terms)), dcRule.getPositiveLiterals().get(0)); } @Test public void testFactNotAddedWhenAlreadyPresent() { kingsKB.tell("((King(x) AND Greedy(x)) => Evil(x))"); kingsKB.tell("King(John)"); kingsKB.tell("King(Richard)"); kingsKB.tell("Greedy(John)"); Assert.assertEquals(1, kingsKB.getNumberRules()); Assert.assertEquals(3, kingsKB.getNumberFacts()); kingsKB.tell("King(John)"); kingsKB.tell("King(Richard)"); kingsKB.tell("Greedy(John)"); Assert.assertEquals(1, kingsKB.getNumberRules()); Assert.assertEquals(3, kingsKB.getNumberFacts()); kingsKB.tell("(((King(John))))"); kingsKB.tell("(((King(Richard))))"); kingsKB.tell("(((Greedy(John))))"); Assert.assertEquals(1, kingsKB.getNumberRules()); Assert.assertEquals(3, kingsKB.getNumberFacts()); } }