package com.igormaznitsa.prol.test;
import com.igormaznitsa.prol.data.Term;
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 java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
public class EightQueens extends TestCase {
@Test
public void testEightQueens() throws Throwable {
final String[] etal = new String[]{"[4,2,7,3,6,8,5,1]", "[5,2,4,7,3,8,6,1]", "[3,5,2,8,6,4,7,1]", "[3,6,4,2,8,5,7,1]", "[5,7,1,3,8,6,4,2]",
"[4,6,8,3,1,7,5,2]",
"[3,6,8,1,4,7,5,2]",
"[5,3,8,4,7,1,6,2]",
"[5,7,4,1,3,8,6,2]",
"[4,1,5,8,6,3,7,2]",
"[3,6,4,1,8,5,7,2]",
"[4,7,5,3,1,6,8,2]",
"[6,4,2,8,5,7,1,3]",
"[6,4,7,1,8,2,5,3]",
"[1,7,4,6,8,2,5,3]",
"[6,8,2,4,1,7,5,3]",
"[6,2,7,1,4,8,5,3]",
"[4,7,1,8,5,2,6,3]",
"[5,8,4,1,7,2,6,3]",
"[4,8,1,5,7,2,6,3]",
"[2,7,5,8,1,4,6,3]",
"[1,7,5,8,2,4,6,3]",
"[2,5,7,4,1,8,6,3]",
"[4,2,7,5,1,8,6,3]",
"[5,7,1,4,2,8,6,3]",
"[6,4,1,5,8,2,7,3]",
"[5,1,4,6,8,2,7,3]",
"[5,2,6,1,7,4,8,3]",
"[6,3,7,2,8,5,1,4]",
"[2,7,3,6,8,5,1,4]",
"[7,3,1,6,8,5,2,4]",
"[5,1,8,6,3,7,2,4]",
"[1,5,8,6,3,7,2,4]",
"[3,6,8,1,5,7,2,4]",
"[6,3,1,7,5,8,2,4]",
"[7,5,3,1,6,8,2,4]",
"[7,3,8,2,5,1,6,4]",
"[5,3,1,7,2,8,6,4]",
"[2,5,7,1,3,8,6,4]",
"[3,6,2,5,8,1,7,4]",
"[6,1,5,2,8,3,7,4]",
"[8,3,1,6,2,5,7,4]",
"[2,8,6,1,3,5,7,4]",
"[5,7,2,6,3,1,8,4]",
"[3,6,2,7,5,1,8,4]",
"[6,2,7,1,3,5,8,4]",
"[3,7,2,8,6,4,1,5]",
"[6,3,7,2,4,8,1,5]",
"[4,2,7,3,6,8,1,5]",
"[7,1,3,8,6,4,2,5]",
"[1,6,8,3,7,4,2,5]",
"[3,8,4,7,1,6,2,5]",
"[6,3,7,4,1,8,2,5]",
"[7,4,2,8,6,1,3,5]",
"[4,6,8,2,7,1,3,5]",
"[2,6,1,7,4,8,3,5]",
"[2,4,6,8,3,1,7,5]",
"[3,6,8,2,4,1,7,5]",
"[6,3,1,8,4,2,7,5]",
"[8,4,1,3,6,2,7,5]",
"[4,8,1,3,6,2,7,5]",
"[2,6,8,3,1,4,7,5]",
"[7,2,6,3,1,4,8,5]",
"[3,6,2,7,1,4,8,5]",
"[4,7,3,8,2,5,1,6]",
"[4,8,5,3,1,7,2,6]",
"[3,5,8,4,1,7,2,6]",
"[4,2,8,5,7,1,3,6]",
"[5,7,2,4,8,1,3,6]",
"[7,4,2,5,8,1,3,6]",
"[8,2,4,1,7,5,3,6]",
"[7,2,4,1,8,5,3,6]",
"[5,1,8,4,2,7,3,6]",
"[4,1,5,8,2,7,3,6]",
"[5,2,8,1,4,7,3,6]",
"[3,7,2,8,5,1,4,6]",
"[3,1,7,5,8,2,4,6]",
"[8,2,5,3,1,7,4,6]",
"[3,5,2,8,1,7,4,6]",
"[3,5,7,1,4,2,8,6]",
"[5,2,4,6,8,3,1,7]",
"[6,3,5,8,1,4,2,7]",
"[5,8,4,1,3,6,2,7]",
"[4,2,5,8,6,1,3,7]",
"[4,6,1,5,2,8,3,7]",
"[6,3,1,8,5,2,4,7]",
"[5,3,1,6,8,2,4,7]",
"[4,2,8,6,1,3,5,7]",
"[6,3,5,7,1,4,2,8]",
"[6,4,7,1,3,5,2,8]",
"[4,7,5,2,6,1,3,8]",
"[5,7,2,6,3,1,4,8]"};
// check the knowledge base export data process
//--
final ProlContext context0 = new ProlContext("test", DefaultProlStreamManagerImpl.getInstance());
final ProlConsult consult0 = new ProlConsult("solution([]). solution([X/Y|Others]):-solution(Others),member(Y,[1,2,3,4,5,6,7,8]),notattack(X/Y,Others). notattack(_,[]). notattack(X/Y,[X1/Y1 | Others]):- Y=\\=Y1, Y1-Y=\\=X1-X, Y1-Y=\\=X-X1, notattack(X/Y,Others). member(Item,[Item|Rest]). member(Item,[First|Rest]):-member(Item,Rest). template([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]).", context0);
consult0.consult();
ByteArrayOutputStream buffer = new ByteArrayOutputStream(1024);
PrintWriter src = new PrintWriter(buffer);
context0.getKnowledgeBase().write(src);
src.flush();
src.close();
//--
final ProlContext context = new ProlContext("test", DefaultProlStreamManagerImpl.getInstance());
final ProlConsult consult = new ProlConsult(new ByteArrayInputStream(buffer.toByteArray()), context);
consult.consult();
final Goal goal = new Goal("solution([1/Y1,2/Y2,3/Y3,4/Y4,5/Y5,6/Y6,7/Y7,8/Y8]),Res = [Y1,Y2,Y3,Y4,Y5,Y6,Y7,Y8].", context);
int combinatioCounter = 0;
for (int li = 0; li < etal.length; li++) {
assertNotNull(goal.solve());
assertEquals(goal.getVarAsText("Res"), etal[li]);
}
assertNull(goal.solve());
}
}