AIMA.Test.Core.Unit.Logic.FOL.KB.Data.ClauseTest.testNonTrivialFactors C# (CSharp) Method

testNonTrivialFactors() private method

private testNonTrivialFactors ( ) : void
return void
        public void testNonTrivialFactors()
        {
            FOLDomain domain = new FOLDomain();
            domain.addConstant("A");
            domain.addConstant("B");
            domain.addFunction("F");
            domain.addFunction("G");
            domain.addFunction("H");
            domain.addPredicate("P");
            domain.addPredicate("Q");

            FOLParser parser = new FOLParser(domain);

            // p(x,y), q(a,b), p(b,a), q(y,x)
            Clause c = new Clause();
            c.addPositiveLiteral((Predicate)parser.parse("P(x,y)"));
            c.addPositiveLiteral((Predicate)parser.parse("Q(A,B)"));
            c.addNegativeLiteral((Predicate)parser.parse("P(B,A)"));
            c.addPositiveLiteral((Predicate)parser.parse("Q(y,x)"));

            Assert.AreEqual("[[~P(B,A), P(B,A), Q(A,B)]]", c
                    .getNonTrivialFactors().ToString());

            // p(x,y), q(a,b), p(b,a), q(y,x)
            c = new Clause();
            c.addPositiveLiteral((Predicate)parser.parse("P(x,y)"));
            c.addPositiveLiteral((Predicate)parser.parse("Q(A,B)"));
            c.addNegativeLiteral((Predicate)parser.parse("P(B,A)"));
            c.addNegativeLiteral((Predicate)parser.parse("Q(y,x)"));

            Assert.AreEqual("[]", c.getNonTrivialFactors().ToString());

            // p(x,f(y)), p(g(u),x), p(f(y),u)
            c = new Clause();
            c.addPositiveLiteral((Predicate)parser.parse("P(x,F(y))"));
            c.addPositiveLiteral((Predicate)parser.parse("P(G(u),x)"));
            c.addPositiveLiteral((Predicate)parser.parse("P(F(y),u)"));

            // Should be: [{P(F(c#),F(c#)),P(G(F(c#)),F(c#))}]
            c = c.getNonTrivialFactors().First();
            Literal p = c.getPositiveLiterals()[0];
            Assert.AreEqual("P", p.getAtomicSentence().getSymbolicName());
            Function f = (Function)p.getAtomicSentence().getArgs()[0];
            Assert.AreEqual("F", f.getFunctionName());
            Variable v = (Variable)f.getTerms()[0];
            f = (Function)p.getAtomicSentence().getArgs()[1];
            Assert.AreEqual("F", f.getFunctionName());
            Assert.AreEqual(v, f.getTerms()[0]);

            //
            p = c.getPositiveLiterals()[1];
            f = (Function)p.getAtomicSentence().getArgs()[0];
            Assert.AreEqual("G", f.getFunctionName());
            f = (Function)f.getTerms()[0];
            Assert.AreEqual("F", f.getFunctionName());
            Assert.AreEqual(v, f.getTerms()[0]);
            f = (Function)p.getAtomicSentence().getArgs()[1];
            Assert.AreEqual("F", f.getFunctionName());
            Assert.AreEqual(v, f.getTerms()[0]);

            // p(g(x)), q(x), p(f(a)), p(x), p(g(f(x))), q(f(a))
            c = new Clause();
            c.addPositiveLiteral((Predicate)parser.parse("P(G(x))"));
            c.addPositiveLiteral((Predicate)parser.parse("Q(x)"));
            c.addPositiveLiteral((Predicate)parser.parse("P(F(A))"));
            c.addPositiveLiteral((Predicate)parser.parse("P(x)"));
            c.addPositiveLiteral((Predicate)parser.parse("P(G(F(x)))"));
            c.addPositiveLiteral((Predicate)parser.parse("Q(F(A))"));

            Assert.AreEqual("[[P(F(A)), P(G(F(F(A)))), P(G(F(A))), Q(F(A))]]",
                    c.getNonTrivialFactors().ToString());
        }