public void testExhaustsSearchSpace()
{
// Taken from AIMA pg 679
FOLDomain domain = new FOLDomain();
domain.addPredicate("alternate");
domain.addPredicate("bar");
domain.addPredicate("fri_sat");
domain.addPredicate("hungry");
domain.addPredicate("patrons");
domain.addPredicate("price");
domain.addPredicate("raining");
domain.addPredicate("reservation");
domain.addPredicate("type");
domain.addPredicate("wait_estimate");
domain.addPredicate("will_wait");
domain.addConstant("Some");
domain.addConstant("Full");
domain.addConstant("French");
domain.addConstant("Thai");
domain.addConstant("Burger");
domain.addConstant("$");
domain.addConstant("_30_60");
domain.addConstant("X0");
FOLParser parser = new FOLParser(domain);
// The hypothesis
String c1 = "patrons(v,Some)";
String c2 = "patrons(v,Full) AND (hungry(v) AND type(v,French))";
String c3 = "patrons(v,Full) AND (hungry(v) AND (type(v,Thai) AND fri_sat(v)))";
String c4 = "patrons(v,Full) AND (hungry(v) AND type(v,Burger))";
String sh = "FORALL v (will_wait(v) <=> (" + c1 + " OR (" + c2
+ " OR (" + c3 + " OR (" + c4 + ")))))";
Sentence hypothesis = parser.parse(sh);
Sentence desc = parser
.parse("(((((((((alternate(X0) AND NOT(bar(X0))) AND NOT(fri_sat(X0))) AND hungry(X0)) AND patrons(X0,Full)) AND price(X0,$)) AND NOT(raining(X0))) AND NOT(reservation(X0))) AND type(X0,Thai)) AND wait_estimate(X0,_30_60))");
Sentence classification = parser.parse("will_wait(X0)");
FOLKnowledgeBase kb = new FOLKnowledgeBase(domain,
new FOLOTTERLikeTheoremProver(false));
kb.tell(hypothesis);
kb.tell(desc);
InferenceResult ir = kb.ask(classification);
Assert.IsFalse(ir.isTrue());
Assert.IsTrue(ir.isPossiblyFalse());
Assert.IsFalse(ir.isUnknownDueToTimeout());
Assert.IsFalse(ir.isPartialResultDueToTimeout());
Assert.AreEqual(0, ir.getProofs().Count);
}