Inheritance: AtomicSentence
 public Object visitPredicate(Predicate predicate, Object arg)
 {
     foreach (Term t in predicate.getTerms())
     {
         t.accept(this, arg);
     }
     return predicate;
 }
            //
            // START-FOLVisitor
            public Object visitPredicate(Predicate p, Object arg) {
			foreach (Term t in p.getArgs()) {
				// Finish processing if have found a match
				if (null != matchingTerm) {
					break;
				}
				t.accept(this, null);
			}
			return p;
		}
        public Object visitPredicate(Predicate predicate, Object arg)
        {
            List<Term> terms = predicate.getTerms();
            List<Term> newTerms = new List<Term>();
            for (int i = 0; i < terms.Count; i++)
            {
                Term t = terms[i];
                Term subsTerm = (Term)t.accept(this, arg);
                newTerms.Add(subsTerm);
            }
            return new Predicate(predicate.getPredicateName(), newTerms);

        }
Beispiel #4
0
	//
	// PRIVATE METHODS
	//
	private void constructFOLEg() {
		ithExampleConstant = new Constant(folDSDomain.getExampleConstant(egNo));

		List<Term> terms = new List<Term>();
		terms.Add(ithExampleConstant);
		// Create the classification sentence
		classification = new Predicate(folDSDomain.getGoalPredicateName(),
				terms);
		if (!example.getAttributeValueAsString(
				folDSDomain.getDataSetTargetName()).Equals(
				folDSDomain.getTrueGoalValue())) {
			// if not true then needs to be a Not sentence
			classification = new NotSentence(classification);
		}

		// Create the description sentence
		List<Sentence> descParts = new List<Sentence>();
		foreach (String dname in folDSDomain.getDescriptionDataSetNames()) {
			String foldDName = folDSDomain.getFOLName(dname);
			terms = new List<Term>();
			terms.Add(ithExampleConstant);
			// If multivalued becomes a two place predicate
			// e.g: Patrons(X1, Some)
			// otherwise: Hungry(X1) or ~ Hungry(X1)
			// see pg 769 of AIMA
			Sentence part = null;
			if (folDSDomain.isMultivalued(dname)) {
				terms.Add(new Constant(folDSDomain.getFOLName(example
						.getAttributeValueAsString(dname))));
				part = new Predicate(foldDName, terms);
			} else {
				part = new Predicate(foldDName, terms);
				// Need to determine if false
				if (!folDSDomain.getTrueGoalValue().Equals(
						example.getAttributeValueAsString(dname))) {
					part = new NotSentence(part);
				}
			}
			descParts.Add(part);
		}
		if (descParts.Count == 1) {
			description = descParts[0];
		} else if (descParts.Count > 1) {
			description = new ConnectedSentence(Connectors.AND, descParts
					[0], descParts[1]);
			for (int i = 2; i < descParts.Count; i++) {
				description = new ConnectedSentence(Connectors.AND,
						description, descParts[i]);
			}
		}
	}
 protected void testDefiniteClauseKBKingsQueryRichardEvilFalse(
         InferenceProcedure infp)
 {
     FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory
             .createKingsKnowledgeBase(infp);
     List<Term> terms = new List<Term>();
     terms.Add(new Constant("Richard"));
     Predicate query = new Predicate("Evil", terms);
     InferenceResult answer = kkb.ask(query);
     Assert.IsTrue(null != answer);
     Assert.IsTrue(answer.isPossiblyFalse());
     Assert.IsFalse(answer.isTrue());
     Assert.IsFalse(answer.isUnknownDueToTimeout());
     Assert.IsFalse(answer.isPartialResultDueToTimeout());
     Assert.IsTrue(0 == answer.getProofs().Count);
 }
Beispiel #6
0
        public void testSimpleVariableUnification()
        {
            Variable var1 = new Variable("x");
            List<Term> terms1 = new List<Term>();
            terms1.Add(var1);
            Predicate p1 = new Predicate("King", terms1); // King(x)

            List<Term> terms2 = new List<Term>();
            terms2.Add(new Constant("John"));
            Predicate p2 = new Predicate("King", terms2); // King(John)

            Dictionary<Variable, Term> result = unifier.unify(p1, p2, theta);
            Assert.AreEqual(theta, result);
            Assert.AreEqual(1, theta.Keys.Count);
            Assert.IsTrue(theta.ContainsKey(new Variable("x"))); // x =
            Assert.AreEqual(new Constant("John"), theta[var1]); // John
        }
        protected void testDefiniteClauseKBKingsQueryEvilXReturnsJohnSucceeds(
                InferenceProcedure infp)
        {
            FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory
                    .createKingsKnowledgeBase(infp);
            List<Term> terms = new List<Term>();
            terms.Add(new Variable("x"));
            Predicate query = new Predicate("Evil", terms);
            InferenceResult answer = kkb.ask(query);

            Assert.IsTrue(null != answer);
            Assert.IsFalse(answer.isPossiblyFalse());
            Assert.IsTrue(answer.isTrue());
            Assert.IsFalse(answer.isUnknownDueToTimeout());
            Assert.IsFalse(answer.isPartialResultDueToTimeout());
            Assert.IsTrue(1 == answer.getProofs().Count);
            Assert.IsTrue(1 == answer.getProofs()[0].getAnswerBindings()
                    .Count);
            Assert.AreEqual(new Constant("John"), answer.getProofs()[0]
                    .getAnswerBindings()[new Variable("x")]);
        }
        protected void testDefiniteClauseKBKingsQueryKingXReturnsJohnAndRichardSucceeds(
                InferenceProcedure infp)
        {
            FOLKnowledgeBase kkb = FOLKnowledgeBaseFactory
                    .createKingsKnowledgeBase(infp);
            List<Term> terms = new List<Term>();
            terms.Add(new Variable("x"));
            Predicate query = new Predicate("King", terms);
            InferenceResult answer = kkb.ask(query);

            Assert.IsTrue(null != answer);
            Assert.IsFalse(answer.isPossiblyFalse());
            Assert.IsTrue(answer.isTrue());
            Assert.IsFalse(answer.isUnknownDueToTimeout());
            Assert.IsFalse(answer.isPartialResultDueToTimeout());
            Assert.IsTrue(2 == answer.getProofs().Count);
            Assert.IsTrue(1 == answer.getProofs()[0].getAnswerBindings()
                    .Count);
            Assert.IsTrue(1 == answer.getProofs()[1].getAnswerBindings()
                    .Count);

            bool gotJohn, gotRichard;
            gotJohn = gotRichard = false;
            Constant cJohn = new Constant("John");
            Constant cRichard = new Constant("Richard");
            foreach (Proof p in answer.getProofs())
            {
                Dictionary<Variable, Term> ans = p.getAnswerBindings();
                Assert.AreEqual(1, ans.Count);
                if (cJohn.Equals(ans[new Variable("x")]))
                {
                    gotJohn = true;
                }
                if (cRichard.Equals(ans[new Variable("x")]))
                {
                    gotRichard = true;
                }
            }
            Assert.IsTrue(gotJohn);
            Assert.IsTrue(gotRichard);
        }
        protected void testEqualityAndSubstitutionNoAxiomsKBabcdPFFASucceeds(
                InferenceProcedure infp, bool expectedToFail)
        {
            FOLKnowledgeBase akb = FOLKnowledgeBaseFactory
                    .createABCDEqualityAndSubstitutionKnowledgeBase(infp, false);

            List<Term> terms = new List<Term>();
            terms.Add(new Constant("A"));
            Function fa = new Function("F", terms);
            terms = new List<Term>();
            terms.Add(fa);
            Function ffa = new Function("F", terms);
            terms = new List<Term>();
            terms.Add(ffa);
            Predicate query = new Predicate("P", terms);

            InferenceResult answer = akb.ask(query);

            Assert.IsTrue(null != answer);
            if (expectedToFail)
            {
                Assert.IsTrue(answer.isPossiblyFalse());
                Assert.IsFalse(answer.isTrue());
                Assert.IsFalse(answer.isUnknownDueToTimeout());
                Assert.IsFalse(answer.isPartialResultDueToTimeout());
                Assert.IsTrue(0 == answer.getProofs().Count);
            }
            else
            {
                Assert.IsFalse(answer.isPossiblyFalse());
                Assert.IsTrue(answer.isTrue());
                Assert.IsFalse(answer.isUnknownDueToTimeout());
                Assert.IsFalse(answer.isPartialResultDueToTimeout());
                Assert.IsTrue(1 == answer.getProofs().Count);
                Assert.IsTrue(0 == answer.getProofs()[0]
                        .getAnswerBindings().Count);
            }
        }
        protected void testFullFOLKBLovesAnimalQueryKillsJackTunaFalse(
                InferenceProcedure infp, bool expectedToTimeOut)
        {
            FOLKnowledgeBase akb = FOLKnowledgeBaseFactory
                    .createLovesAnimalKnowledgeBase(infp);
            List<Term> terms = new List<Term>();
            terms.Add(new Constant("Jack"));
            terms.Add(new Constant("Tuna"));
            Predicate query = new Predicate("Kills", terms);

            InferenceResult answer = akb.ask(query);

            Assert.IsTrue(null != answer);
            if (expectedToTimeOut)
            {
                Assert.IsFalse(answer.isPossiblyFalse());
                Assert.IsFalse(answer.isTrue());
                Assert.IsTrue(answer.isUnknownDueToTimeout());
                Assert.IsFalse(answer.isPartialResultDueToTimeout());
                Assert.IsTrue(0 == answer.getProofs().Count);
            }
            else
            {
                Assert.IsTrue(answer.isPossiblyFalse());
                Assert.IsFalse(answer.isTrue());
                Assert.IsFalse(answer.isUnknownDueToTimeout());
                Assert.IsFalse(answer.isPartialResultDueToTimeout());
                Assert.IsTrue(0 == answer.getProofs().Count);
            }
        }
        protected void testHornClauseKBRingOfThievesQuerySkisXReturnsNancyRedBertDrew(
                InferenceProcedure infp)
        {
            FOLKnowledgeBase rotkb = FOLKnowledgeBaseFactory
                    .createRingOfThievesKnowledgeBase(infp);
            List<Term> terms = new List<Term>();
            terms.Add(new Variable("x"));
            Predicate query = new Predicate("Skis", terms);

            InferenceResult answer = rotkb.ask(query);

            Assert.IsTrue(null != answer);
            Assert.IsFalse(answer.isPossiblyFalse());
            Assert.IsTrue(answer.isTrue());
            Assert.IsFalse(answer.isUnknownDueToTimeout());
            // DB can expand infinitely so is only partial.
            Assert.IsTrue(answer.isPartialResultDueToTimeout());
            Assert.AreEqual(4, answer.getProofs().Count);
            Assert.AreEqual(1, answer.getProofs()[0].getAnswerBindings()
                    .Count);
            Assert.AreEqual(1, answer.getProofs()[1].getAnswerBindings()
                    .Count);
            Assert.AreEqual(1, answer.getProofs()[2].getAnswerBindings()
                    .Count);
            Assert.AreEqual(1, answer.getProofs()[3].getAnswerBindings()
                    .Count);

            List<Constant> expected = new List<Constant>();
            expected.Add(new Constant("Nancy"));
            expected.Add(new Constant("Red"));
            expected.Add(new Constant("Bert"));
            expected.Add(new Constant("Drew"));
            foreach (Proof p in answer.getProofs())
            {
                expected.Remove((Constant)p.getAnswerBindings()[new Variable("x")]);
            }
            Assert.AreEqual(0, expected.Count);
        }
 public Object visitPredicate(Predicate p, Object arg)
 {
     List<Predicate> predicates = (List<Predicate>)arg;
     predicates.Add(p);
     return predicates;
 }
Beispiel #13
0
 public Object visitPredicate(Predicate p, Object arg)
 {
     return p;
 }
Beispiel #14
0
 public Object visitPredicate(Predicate p, Object arg)
 {
     ArgData ad = (ArgData)arg;
     if (ad.negated)
     {
         ad.clauses[ad.clauses.Count - 1].addNegativeLiteral(p);
     }
     else
     {
         ad.clauses[ad.clauses.Count - 1].addPositiveLiteral(p);
     }
     return p;
 }
 //
 // START-FOLVisitor
 public Object visitPredicate(Predicate p, Object arg)
 {
     List<Term> newTerms = new List<Term>();
     foreach (Term t in p.getTerms())
     {
         Term subsTerm = (Term)t.accept(this, arg);
         newTerms.Add(subsTerm);
     }
     return new Predicate(p.getPredicateName(), newTerms);
 }