package com.igormaznitsa.prol.test;
import com.igormaznitsa.prol.io.DefaultProlStreamManagerImpl;
import com.igormaznitsa.prol.logic.Goal;
import com.igormaznitsa.prol.logic.ProlContext;
import com.igormaznitsa.prol.parser.ProlConsult;
import com.igormaznitsa.prol.trace.TraceListener;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import junit.framework.TestCase;
import org.junit.Test;
public class EinsteinTest extends TestCase implements TraceListener {
@Test
public void testEinstein() throws Throwable {
final ProlContext context = makeContext("next_to(X,Y,List) :- iright(X,Y,List)."
+ "next_to(X,Y,List) :- iright(Y,X,List)."
+ "einstein(Houses,Fish_Owner) :-"
+ "Houses=[ [house,norwegian,_,_,_,_] , _ , [house,_,_,_,milk,_] , _ , _ ],"
+ "member2([house,brit,_,_,_,red] , Houses),"
+ "member2([house,swede,dog,_,_,_] , Houses),"
+ "member2([house,dane,_,_,tea,_] , Houses),"
+ "iright([house,_,_,_,_,green] , [house,_,_,_,_,white], Houses),"
+ "member2([house,_,_,_,coffee,green] , Houses),"
+ "member2([house,_,bird,pallmall,_,_] , Houses),"
+ "member2([house,_,_,dunhill,_,yellow] , Houses),"
+ "next_to([house,_,_,dunhill,_,_] , [house,_,horse,_,_,_], Houses),"
+ "member2([house,_,_,_,milk,_] , Houses),"
+ "next_to([house,_,_,marlboro,_,_] , [house,_,cat,_,_,_], Houses),"
+ "next_to([house,_,_,marlboro,_,_] , [house,_,_,_,water,_], Houses),"
+ "member2([house,_,_,winfield,beer,_] , Houses),"
+ "member2([house,german,_,rothmans,_,_] , Houses),"
+ "next_to([house,norwegian,_,_,_,_] , [house,_,_,_,_,blue] , Houses),"
+ "member2([house, Fish_Owner , fish , _ , _ , _ ] , Houses)."
+ "iright(L,R,[L,R|_]). iright(L,R,[_|Rest]) :- iright(L,R,Rest)."
+ "member2(E,[E|_]). member2(E,[_|L]) :- member2(E,L).");
final Goal goal = new Goal("einstein(_,X).", context);
assertNotNull(goal.solve());
assertEquals(goal.getVarAsText("X"), "'german'");
assertNull(goal.solve());
}
private ProlContext makeContext(final String knowledgeBase) throws Exception {
final ProlContext context = new ProlContext("PreparedGoal test", DefaultProlStreamManagerImpl.getInstance());
final ProlConsult consult = new ProlConsult(knowledgeBase, context);
consult.consult();
// check that kb is right in its data export
final ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
final PrintWriter out = new PrintWriter(baos);
context.getKnowledgeBase().write(out);
out.flush();
out.close();
//System.out.println(new String(baos.toByteArray()));
final ProlContext context1 = new ProlContext("PreparedGoal test", DefaultProlStreamManagerImpl.getInstance());
final ProlConsult consult1 = new ProlConsult(new ByteArrayInputStream(baos.toByteArray()), context1);
consult1.consult();
return context1;
}
@Override
public boolean onProlGoalCall(Goal goal) {
if (allowedPredicate(goal)) {
System.out.println("Call: " + goal.getGoalTerm());
}
return true;
}
@Override
public boolean onProlGoalRedo(Goal goal) {
if (allowedPredicate(goal)) {
System.out.println("Redo: " + goal.getGoalTerm());
}
return true;
}
@Override
public void onProlGoalFail(Goal goal) {
if (allowedPredicate(goal)) {
System.out.println("Fail: " + goal.getGoalTerm());
}
}
@Override
public void onProlGoalExit(Goal goal) {
if (allowedPredicate(goal)) {
System.out.println("Exit: " + goal.getGoalTerm());
}
}
private boolean allowedPredicate(Goal goal) {
final String signature = goal.getGoalTerm().getSignature();
return !(signature.equals(",/2") || signature.equals(";/2"));
}
}