package aima.test.core.unit.logic.fol; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.junit.Assert; import aima.core.logic.fol.inference.InferenceProcedure; import aima.core.logic.fol.inference.InferenceResult; import aima.core.logic.fol.inference.proof.Proof; import aima.core.logic.fol.kb.FOLKnowledgeBase; import aima.core.logic.fol.kb.FOLKnowledgeBaseFactory; import aima.core.logic.fol.parsing.ast.Constant; import aima.core.logic.fol.parsing.ast.Function; import aima.core.logic.fol.parsing.ast.NotSentence; import aima.core.logic.fol.parsing.ast.Predicate; import aima.core.logic.fol.parsing.ast.Term; import aima.core.logic.fol.parsing.ast.TermEquality; import aima.core.logic.fol.parsing.ast.Variable; /** * @author Ciaran O'Reilly * */ public abstract class CommonFOLInferenceProcedureTests { // // Protected Methods // protected void testDefiniteClauseKBKingsQueryCriminalXFalse( InferenceProcedure infp) { FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory .createKingsKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Variable("x")); Predicate query = new Predicate("Criminal", terms); InferenceResult answer = kkb.ask(query); Assert.assertTrue(null != answer); Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } protected void testDefiniteClauseKBKingsQueryRichardEvilFalse( InferenceProcedure infp) { FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory .createKingsKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("Richard")); Predicate query = new Predicate("Evil", terms); InferenceResult answer = kkb.ask(query); Assert.assertTrue(null != answer); Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } protected void testDefiniteClauseKBKingsQueryJohnEvilSucceeds( InferenceProcedure infp) { FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory .createKingsKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("John")); Predicate query = new Predicate("Evil", terms); InferenceResult answer = kkb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0).getAnswerBindings() .size()); } protected void testDefiniteClauseKBKingsQueryEvilXReturnsJohnSucceeds( InferenceProcedure infp) { FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory .createKingsKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Variable("x")); Predicate query = new Predicate("Evil", terms); InferenceResult answer = kkb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(1 == answer.getProofs().get(0).getAnswerBindings() .size()); Assert.assertEquals(new Constant("John"), answer.getProofs().get(0) .getAnswerBindings().get(new Variable("x"))); } protected void testDefiniteClauseKBKingsQueryKingXReturnsJohnAndRichardSucceeds( InferenceProcedure infp) { FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory .createKingsKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Variable("x")); Predicate query = new Predicate("King", terms); InferenceResult answer = kkb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(2 == answer.getProofs().size()); Assert.assertTrue(1 == answer.getProofs().get(0).getAnswerBindings() .size()); Assert.assertTrue(1 == answer.getProofs().get(1).getAnswerBindings() .size()); boolean gotJohn, gotRichard; gotJohn = gotRichard = false; Constant cJohn = new Constant("John"); Constant cRichard = new Constant("Richard"); for (Proof p : answer.getProofs()) { Map<Variable, Term> ans = p.getAnswerBindings(); Assert.assertEquals(1, ans.size()); if (cJohn.equals(ans.get(new Variable("x")))) { gotJohn = true; } if (cRichard.equals(ans.get(new Variable("x")))) { gotRichard = true; } } Assert.assertTrue(gotJohn); Assert.assertTrue(gotRichard); } protected void testDefiniteClauseKBWeaponsQueryCriminalXReturnsWestSucceeds( InferenceProcedure infp) { FOLKnowledgeBase wkb = FOLKnowledgeBaseFactory .createWeaponsKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Variable("x")); Predicate query = new Predicate("Criminal", terms); InferenceResult answer = wkb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(1 == answer.getProofs().get(0).getAnswerBindings() .size()); Assert.assertEquals(new Constant("West"), answer.getProofs().get(0) .getAnswerBindings().get(new Variable("x"))); } protected void testHornClauseKBRingOfThievesQuerySkisXReturnsNancyRedBertDrew( InferenceProcedure infp) { FOLKnowledgeBase rotkb = FOLKnowledgeBaseFactory .createRingOfThievesKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Variable("x")); Predicate query = new Predicate("Skis", terms); InferenceResult answer = rotkb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); // DB can expand infinitely so is only partial. Assert.assertTrue(answer.isPartialResultDueToTimeout()); Assert.assertEquals(4, answer.getProofs().size()); Assert.assertEquals(1, answer.getProofs().get(0).getAnswerBindings() .size()); Assert.assertEquals(1, answer.getProofs().get(1).getAnswerBindings() .size()); Assert.assertEquals(1, answer.getProofs().get(2).getAnswerBindings() .size()); Assert.assertEquals(1, answer.getProofs().get(3).getAnswerBindings() .size()); List<Constant> expected = new ArrayList<Constant>(); expected.add(new Constant("Nancy")); expected.add(new Constant("Red")); expected.add(new Constant("Bert")); expected.add(new Constant("Drew")); for (Proof p : answer.getProofs()) { expected.remove(p.getAnswerBindings().get(new Variable("x"))); } Assert.assertEquals(0, expected.size()); } protected void testFullFOLKBLovesAnimalQueryKillsCuriosityTunaSucceeds( InferenceProcedure infp, boolean expectedToTimeOut) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createLovesAnimalKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("Curiosity")); terms.add(new Constant("Tuna")); Predicate query = new Predicate("Kills", terms); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToTimeOut) { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertTrue(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } protected void testFullFOLKBLovesAnimalQueryNotKillsJackTunaSucceeds( InferenceProcedure infp, boolean expectedToTimeOut) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createLovesAnimalKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("Jack")); terms.add(new Constant("Tuna")); NotSentence query = new NotSentence(new Predicate("Kills", terms)); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToTimeOut) { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertTrue(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } protected void testFullFOLKBLovesAnimalQueryKillsJackTunaFalse( InferenceProcedure infp, boolean expectedToTimeOut) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createLovesAnimalKnowledgeBase(infp); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("Jack")); terms.add(new Constant("Tuna")); Predicate query = new Predicate("Kills", terms); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToTimeOut) { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertTrue(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } } protected void testEqualityAxiomsKBabcAEqualsCSucceeds( InferenceProcedure infp) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCEqualityKnowledgeBase(infp, true); TermEquality query = new TermEquality(new Constant("A"), new Constant( "C")); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0).getAnswerBindings() .size()); } protected void testEqualityAndSubstitutionAxiomsKBabcdFFASucceeds( InferenceProcedure infp) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCDEqualityAndSubstitutionKnowledgeBase(infp, true); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("A")); Function fa = new Function("F", terms); terms = new ArrayList<Term>(); terms.add(fa); TermEquality query = new TermEquality(new Function("F", terms), new Constant("A")); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0).getAnswerBindings() .size()); } protected void testEqualityAndSubstitutionAxiomsKBabcdPDSucceeds( InferenceProcedure infp) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCDEqualityAndSubstitutionKnowledgeBase(infp, true); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("D")); Predicate query = new Predicate("P", terms); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0).getAnswerBindings() .size()); } protected void testEqualityAndSubstitutionAxiomsKBabcdPFFASucceeds( InferenceProcedure infp, boolean expectedToTimeOut) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCDEqualityAndSubstitutionKnowledgeBase(infp, true); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("A")); Function fa = new Function("F", terms); terms = new ArrayList<Term>(); terms.add(fa); Function ffa = new Function("F", terms); terms = new ArrayList<Term>(); terms.add(ffa); Predicate query = new Predicate("P", terms); InferenceResult answer = akb.ask(query); if (expectedToTimeOut) { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertTrue(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertTrue(null != answer); Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } protected void testEqualityNoAxiomsKBabcAEqualsCSucceeds( InferenceProcedure infp, boolean expectedToFail) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCEqualityKnowledgeBase(infp, false); TermEquality query = new TermEquality(new Constant("A"), new Constant( "C")); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToFail) { Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } protected void testEqualityAndSubstitutionNoAxiomsKBabcdFFASucceeds( InferenceProcedure infp, boolean expectedToFail) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCDEqualityAndSubstitutionKnowledgeBase(infp, false); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("A")); Function fa = new Function("F", terms); terms = new ArrayList<Term>(); terms.add(fa); TermEquality query = new TermEquality(new Function("F", terms), new Constant("A")); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToFail) { Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } protected void testEqualityAndSubstitutionNoAxiomsKBabcdPDSucceeds( InferenceProcedure infp, boolean expectedToFail) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCDEqualityAndSubstitutionKnowledgeBase(infp, false); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("D")); Predicate query = new Predicate("P", terms); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToFail) { Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } protected void testEqualityAndSubstitutionNoAxiomsKBabcdPFFASucceeds( InferenceProcedure infp, boolean expectedToFail) { FOLKnowledgeBase akb = FOLKnowledgeBaseFactory .createABCDEqualityAndSubstitutionKnowledgeBase(infp, false); List<Term> terms = new ArrayList<Term>(); terms.add(new Constant("A")); Function fa = new Function("F", terms); terms = new ArrayList<Term>(); terms.add(fa); Function ffa = new Function("F", terms); terms = new ArrayList<Term>(); terms.add(ffa); Predicate query = new Predicate("P", terms); InferenceResult answer = akb.ask(query); Assert.assertTrue(null != answer); if (expectedToFail) { Assert.assertTrue(answer.isPossiblyFalse()); Assert.assertFalse(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(0 == answer.getProofs().size()); } else { Assert.assertFalse(answer.isPossiblyFalse()); Assert.assertTrue(answer.isTrue()); Assert.assertFalse(answer.isUnknownDueToTimeout()); Assert.assertFalse(answer.isPartialResultDueToTimeout()); Assert.assertTrue(1 == answer.getProofs().size()); Assert.assertTrue(0 == answer.getProofs().get(0) .getAnswerBindings().size()); } } }