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 ListTest extends TestCase { @Test public void testRunningOne() throws Throwable { final ProlContext context = makeContext("member2(E,[E|_]). member2(E,[_|L]) :- member2(E,L). runningOne(X):-X=[_,_,_,_],member2(1,X)."); final Goal testgoal = new Goal("runningOne(X).", context); final String[] etalon = new String[]{ "[1,_,_,_]", "[_,1,_,_]", "[_,_,1,_]", "[_,_,_,1]" }; for (int li = 0; li < etalon.length; li++) { assertNotNull(testgoal.solve()); assertEquals(etalon[li], testgoal.getVarAsText("X")); } assertNull(testgoal.solve()); } @Test public void testRomenum() throws Throwable { final ProlContext context = makeContext("rome(1,'I'). rome(2,'II'). rome(3,'III'). rome(4,'IV'). rome(5,'V'). rome(6,'VI'). rome(7,'VII'). rome(8,'VIII'). rome(9,'IX'). rome(_,'_'). romenum([],[]). romenum([X|Xt],[S|St]):-rome(X,S), romenum(Xt,St)."); final Goal testgoal = new Goal("romenum([1,2,3],X).", context); final String[] etalon = new String[]{ "['I','II','III']", "['I','II','_']", "['I','_','III']", "['I','_','_']", "['_','II','III']", "['_','II','_']", "['_','_','III']", "['_','_','_']" }; for (int li = 0; li < etalon.length; li++) { assertNotNull(testgoal.solve()); assertEquals(etalon[li], testgoal.getVarAsText("X")); } assertNull(testgoal.solve()); } @Test public void testPrime() throws Throwable { final ProlContext context = makeContext("is_prime2(N,1):-!.is_prime2(N,X) :- N =\\= (N // X)*X, X1 is X-1,is_prime2(N,X1).is_prime(1):-!,fail.is_prime(N):-N1 is N-1, is_prime2(N,N1),!.prime_interval(_,N,[]):-N<2,!.prime_interval(S,N,[]):-S>=N,!.prime_interval(S,N,L):- S<N,S1 is S+1,(is_prime(S),L=[S|Tail],prime_interval(S1,N,Tail);prime_interval(S1,N,L)),!.prime_list(N,L) :- prime_interval(1,N,L)."); final Goal testgoal = new Goal("prime_list(100,X).", context); assertNotNull(testgoal.solve()); assertEquals("[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); } @Test public void testFillNatural() throws Throwable { final ProlContext context = makeContext("fill_list(N,N,[N]).fill_list(S,N,[S|S1t]):-S<N,S1 is S+1,fill_list(S1,N,S1t).fill_natural(N,L):-fill_list(1,N,L)."); final Goal testgoal = new Goal("fill_natural(10,L).", context); assertNotNull(testgoal.solve()); assertEquals("[1,2,3,4,5,6,7,8,9,10]", testgoal.getVarAsText("L")); assertNull(testgoal.solve()); } @Test public void testShift() throws Throwable { final ProlContext context = makeContext("appendlast([],X,[X]):-!.appendlast([X|Xt],X1,[X|Yt]):-appendlast(Xt,X1,Yt).removelast([X],X,[]):-!.removelast([X|Xt],L,[X|Yt]):-removelast(Xt,L,Yt).rcshift([],[]):-!.rcshift(S,[X|D]) :- removelast(S,X,D).lcshift([],[]):-!.lcshift([X|Xt],R):-appendlast(Xt,X,R)."); Goal testgoal = new Goal("rcshift(X,[1,2,3,4,5,6,7]).", context); assertNotNull(testgoal.solve()); assertEquals("[2,3,4,5,6,7,1]", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); testgoal = new Goal("lcshift(X,[1,2,3,4,5,6,7]).", context); assertNotNull(testgoal.solve()); assertEquals("[7,1,2,3,4,5,6]", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); } @Test public void testSublist() throws Throwable { final ProlContext context = makeContext("sub2([],_,_,[]). sub2([X|Xt],SN,N,Y):-SN<N,SN1 is SN+1,sub2(Xt,SN1,N,Y). sub2([X|Xt],SN,N,[X|Yt]):-SN>=N,SN1 is SN+1,sub2(Xt,SN1,N,Yt). sublist(S,P,R):-sub2(S,0,P,R)."); final Goal testgoal = new Goal("sublist([a,b,c,d,e],2,X).", context); assertNotNull(testgoal.solve()); assertEquals("['c','d','e']", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); } @Test public void testReplace() throws Throwable { final ProlContext context = makeContext("replace([],_,_,[]):-!. replace([X],X,N,[N]):-!. replace([X|St],X,N,[N|Lt]):-replace(St,X,N,Lt),!. replace([Y|St],X,N,[Y|Lt]):-replace(St,X,N,Lt)."); final Goal testgoal = new Goal("replace([a,b,c,d,e,f,g],e,1,X).", context); assertNotNull(testgoal.solve()); assertEquals("['a','b','c','d',1,'f','g']", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); } @Test public void testBubble() throws Throwable { final ProlContext context = makeContext("reverse([X,Y|L],[Y,X|L]):-X>Y, !. reverse([X|L],[X|LRes]):-reverse(L,LRes). bubble(L,Res):-reverse(L,Res1), !, bubble(Res1,Res). bubble(L,L)."); final Goal testgoal = new Goal("bubble([3,1,99,3,7,5,20],X).", context); assertNotNull(testgoal.solve()); assertEquals("[1,3,3,5,7,20,99]", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); } @Test public void testReverse() throws Throwable { final ProlContext context = makeContext("reverse([], []). reverse([A|B], Z) :- reverse(B, Brev), append(Brev, [A], Z). append([], Z, Z).append([A|B], Z, [A|Z2]) :- append(B, Z, Z2)."); final Goal testgoal = new Goal("reverse([1,2,3,4,5,6],X).", context); assertNotNull(testgoal.solve()); assertEquals("[6,5,4,3,2,1]", testgoal.getVarAsText("X")); assertNull(testgoal.solve()); } @Test public void testAppend() throws Throwable { final ProlContext context = makeContext("append([], Z, Z).append([A|B], Z, [A|Z2]) :- append(B, Z, Z2)."); final Goal testgoal = new Goal("append(X,Y,[1,2,3,4,5,6]).", context); final String[] etalon = new String[]{ "[]", "[1,2,3,4,5,6]", "[1]", "[2,3,4,5,6]", "[1,2]", "[3,4,5,6]", "[1,2,3]", "[4,5,6]", "[1,2,3,4]", "[5,6]", "[1,2,3,4,5]", "[6]", "[1,2,3,4,5,6]", "[]" }; for (int li = 0; li < etalon.length; li += 2) { assertNotNull(testgoal.solve()); assertEquals(etalon[li], testgoal.getVarAsText("X")); assertEquals(etalon[li + 1], testgoal.getVarAsText("Y")); } assertNull(testgoal.solve()); } @Test public void testTakeListFromBase1() throws Throwable { final ProlContext context = makeContext("a(X):-X=[_,_,_,4].b(X):-X=[1,_,_,_].c(X):-X=[_,2,_,_].d(X):-X=[_,_,3,_].test(X):-X=A,A=B,B=C,C=D,a(A),b(B),c(C),d(D)."); final Goal testgoal = new Goal("test(R).", context); assertNotNull(testgoal.solve()); assertEquals(testgoal.getVarAsText("R"), "[1,2,3,4]"); assertNull(testgoal.solve()); } @Test public void testTakeListFromBase2() throws Throwable { final ProlContext context = makeContext("a([1,2,3,4,5]).a([a,b,c,d,e]).a([cafebabe])."); final Goal testgoal = new Goal("a(X).", context); final String[] etalon = new String[]{"[1,2,3,4,5]", "['a','b','c','d','e']", "['cafebabe']"}; for (int li = 0; li < etalon.length; li++) { Term nextTerm = testgoal.solve(); assertNotNull(nextTerm); assertEquals(etalon[li], testgoal.getVarAsText("X")); } assertNull(testgoal.solve()); } @Test public void testAtList() throws Throwable { final ProlContext context = makeContext("atlist([],X):-fail,!. atlist([X],X):-!. atlist([X|Tail],X). atlist([X|Tail],Y):-atlist(Tail,Y)."); final Goal testgoal = new Goal("atlist([0,1,2,3,4,5,6,7,8,9,10],X).", context); int etalon = 0; while (true) { final Term result = testgoal.solve(); if (result == null) { break; } assertEquals(etalon, testgoal.getVarAsNumber("X").intValue()); etalon++; } assertEquals(etalon, 11); } @Test public void testAnonymVariables() throws Throwable { final ProlContext context = makeContext("a([a,_,_,d]). a([_,b,c,_]). test(X):-X=[1,_,_,4],a(X)."); final Goal testgoal = new Goal("test(X).", context); assertNotNull(testgoal.solve()); assertEquals(testgoal.getVarAsText("X"), "[1,'b','c',4]"); assertNull(testgoal.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(); return context; } }