Package aima.test.core.unit.logic.fol

Source Code of aima.test.core.unit.logic.fol.CommonFOLInferenceProcedureTests

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());
    }
  }
}
TOP

Related Classes of aima.test.core.unit.logic.fol.CommonFOLInferenceProcedureTests

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.