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 junit.framework.TestCase;
import org.junit.Test;
import static org.junit.Assert.*;
public class NonDeterministicAutomata extends TestCase {
@Test
public void testNondeterministicAutomata() throws Throwable {
final ProlContext context = new ProlContext("test", DefaultProlStreamManagerImpl.getInstance());
final ProlConsult consult = new ProlConsult("final(s3).trans(s1,a,s1).trans(s1,a,s2).trans(s1,b,s1).trans(s2,b,s3).trans(s3,b,s4).silent(s2,s4).silent(s3,s1).accepts(State,[]):-final(State).accepts(State,[X|Rest]):-trans(State,X,State1),accepts(State1,Rest).accepts(State,String):-silent(State,State1),accepts(State1,String).", context);
consult.consult();
final String[] etal = new String[]{
"['a','a','a','a','a','a','b']",
"['a','a','a','a','b','a','b']",
"['a','a','a','a','b','a','b']",
"['a','a','a','b','a','a','b']",
"['a','a','a','b','b','a','b']",
"['a','a','a','b','a','a','b']",
"['a','a','a','b','b','a','b']",
"['a','a','b','a','a','a','b']",
"['a','a','b','a','b','a','b']",
"['a','a','b','a','b','a','b']",
"['a','a','b','b','a','a','b']",
"['a','a','b','b','b','a','b']",
"['a','a','b','a','a','a','b']",
"['a','a','b','a','b','a','b']",
"['a','a','b','a','b','a','b']",
"['a','a','b','b','a','a','b']",
"['a','a','b','b','b','a','b']",
"['a','b','a','a','a','a','b']",
"['a','b','a','a','b','a','b']",
"['a','b','a','a','b','a','b']",
"['a','b','a','b','a','a','b']",
"['a','b','a','b','b','a','b']",
"['a','b','a','b','a','a','b']",
"['a','b','a','b','b','a','b']",
"['a','b','b','a','a','a','b']",
"['a','b','b','a','b','a','b']",
"['a','b','b','a','b','a','b']",
"['a','b','b','b','a','a','b']",
"['a','b','b','b','b','a','b']",
"['a','b','a','a','a','a','b']",
"['a','b','a','a','b','a','b']",
"['a','b','a','a','b','a','b']",
"['a','b','a','b','a','a','b']",
"['a','b','a','b','b','a','b']",
"['a','b','a','b','a','a','b']",
"['a','b','a','b','b','a','b']",
"['a','b','b','a','a','a','b']",
"['a','b','b','a','b','a','b']",
"['a','b','b','a','b','a','b']",
"['a','b','b','b','a','a','b']",
"['a','b','b','b','b','a','b']",
"['b','a','a','a','a','a','b']",
"['b','a','a','a','b','a','b']",
"['b','a','a','a','b','a','b']",
"['b','a','a','b','a','a','b']",
"['b','a','a','b','b','a','b']",
"['b','a','a','b','a','a','b']",
"['b','a','a','b','b','a','b']",
"['b','a','b','a','a','a','b']",
"['b','a','b','a','b','a','b']",
"['b','a','b','a','b','a','b']",
"['b','a','b','b','a','a','b']",
"['b','a','b','b','b','a','b']",
"['b','a','b','a','a','a','b']",
"['b','a','b','a','b','a','b']",
"['b','a','b','a','b','a','b']",
"['b','a','b','b','a','a','b']",
"['b','a','b','b','b','a','b']",
"['b','b','a','a','a','a','b']",
"['b','b','a','a','b','a','b']",
"['b','b','a','a','b','a','b']",
"['b','b','a','b','a','a','b']",
"['b','b','a','b','b','a','b']",
"['b','b','a','b','a','a','b']",
"['b','b','a','b','b','a','b']",
"['b','b','b','a','a','a','b']",
"['b','b','b','a','b','a','b']",
"['b','b','b','a','b','a','b']",
"['b','b','b','b','a','a','b']",
"['b','b','b','b','b','a','b']"
};
final Goal goal = new Goal("X=[_,_,_,_,_,_,_],accepts(s1,X).", context);
for (int li = 0; li < etal.length; li++) {
assertNotNull(goal.solve());
assertEquals(goal.getVarAsText("X"), etal[li]);
}
assertNull(goal.solve());
}
}