package aima.test.core.unit.logic.fol.inference;
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.domain.FOLDomain;
import aima.core.logic.fol.inference.Demodulation;
import aima.core.logic.fol.kb.data.Clause;
import aima.core.logic.fol.kb.data.Literal;
import aima.core.logic.fol.parsing.FOLParser;
import aima.core.logic.fol.parsing.ast.Predicate;
import aima.core.logic.fol.parsing.ast.TermEquality;
/**
* @author Ciaran O'Reilly
*
*/
public class DemodulationTest {
private Demodulation demodulation = null;
@Before
public void setUp() {
demodulation = new Demodulation();
}
// Note: Based on:
// http://logic.stanford.edu/classes/cs157/2008/lectures/lecture15.pdf
// Slide 22.
@Test
public void testSimpleAtomicExamples() {
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addConstant("C");
domain.addConstant("D");
domain.addConstant("E");
domain.addPredicate("P");
domain.addFunction("F");
domain.addFunction("G");
domain.addFunction("H");
domain.addFunction("J");
FOLParser parser = new FOLParser(domain);
Predicate expression = (Predicate) parser
.parse("P(A,F(B,G(A,H(B)),C),D)");
TermEquality assertion = (TermEquality) parser.parse("B = E");
Predicate altExpression = (Predicate) demodulation.apply(assertion,
expression);
Assert.assertFalse(expression.equals(altExpression));
Assert.assertEquals("P(A,F(E,G(A,H(B)),C),D)", altExpression.toString());
altExpression = (Predicate) demodulation
.apply(assertion, altExpression);
Assert.assertEquals("P(A,F(E,G(A,H(E)),C),D)", altExpression.toString());
assertion = (TermEquality) parser.parse("G(x,y) = J(x)");
altExpression = (Predicate) demodulation.apply(assertion, expression);
Assert.assertEquals("P(A,F(B,J(A),C),D)", altExpression.toString());
}
// Note: Based on:
// http://logic.stanford.edu/classes/cs157/2008/lectures/lecture15.pdf
// Slide 23.
@Test
public void testSimpleAtomicNonExample() {
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addConstant("C");
domain.addConstant("D");
domain.addConstant("E");
domain.addPredicate("P");
domain.addFunction("F");
domain.addFunction("G");
domain.addFunction("H");
domain.addFunction("J");
FOLParser parser = new FOLParser(domain);
Predicate expression = (Predicate) parser.parse("P(A,G(x,B),C)");
TermEquality assertion = (TermEquality) parser.parse("G(A,y) = J(y)");
Predicate altExpression = (Predicate) demodulation.apply(assertion,
expression);
Assert.assertNull(altExpression);
}
@Test
public void testSimpleClauseExamples() {
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addConstant("C");
domain.addConstant("D");
domain.addConstant("E");
domain.addPredicate("P");
domain.addPredicate("Q");
domain.addPredicate("W");
domain.addFunction("F");
domain.addFunction("G");
domain.addFunction("H");
domain.addFunction("J");
FOLParser parser = new FOLParser(domain);
List<Literal> lits = new ArrayList<Literal>();
Predicate p1 = (Predicate) parser.parse("Q(z, G(D,B))");
Predicate p2 = (Predicate) parser.parse("P(x, G(A,C))");
Predicate p3 = (Predicate) parser.parse("W(z,x,u,w,y)");
lits.add(new Literal(p1));
lits.add(new Literal(p2));
lits.add(new Literal(p3));
Clause clExpression = new Clause(lits);
TermEquality assertion = (TermEquality) parser.parse("G(x,y) = x");
Clause altClExpression = demodulation.apply(assertion, clExpression);
Assert.assertEquals("[P(x,G(A,C)), Q(z,D), W(z,x,u,w,y)]",
altClExpression.toString());
altClExpression = demodulation.apply(assertion, altClExpression);
Assert.assertEquals("[P(x,A), Q(z,D), W(z,x,u,w,y)]",
altClExpression.toString());
}
@Test
public void testSimpleClauseNonExample() {
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addConstant("C");
domain.addPredicate("P");
domain.addFunction("F");
FOLParser parser = new FOLParser(domain);
List<Literal> lits = new ArrayList<Literal>();
Predicate p1 = (Predicate) parser.parse("P(y, F(A,y))");
lits.add(new Literal(p1));
Clause clExpression = new Clause(lits);
TermEquality assertion = (TermEquality) parser.parse("F(x,B) = C");
Clause altClExpression = demodulation.apply(assertion, clExpression);
Assert.assertNull(altClExpression);
}
@Test
public void testBypassReflexivityAxiom() {
FOLDomain domain = new FOLDomain();
domain.addConstant("A");
domain.addConstant("B");
domain.addConstant("C");
domain.addPredicate("P");
domain.addFunction("F");
FOLParser parser = new FOLParser(domain);
List<Literal> lits = new ArrayList<Literal>();
Predicate p1 = (Predicate) parser.parse("P(y, F(A,y))");
lits.add(new Literal(p1));
Clause clExpression = new Clause(lits);
TermEquality assertion = (TermEquality) parser.parse("x = x");
Clause altClExpression = demodulation.apply(assertion, clExpression);
Assert.assertNull(altClExpression);
}
}