package alice.tuprolog; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Before; import org.junit.Test; import alice.tuprolog.lib.DCGLibrary; public class PhraseTest { Prolog engine; @Before public void setUp() { engine = new Prolog(); try { engine.loadLibrary(new DCGLibrary()); } catch (InvalidLibraryException e) { } } @Test public void simpleGrammar() throws PrologException { engine.setTheory(new Theory("a --> [].")); SolveInfo solution = engine.solve("phrase(a, [])."); assertTrue(solution.isSuccess()); } @Test public void nonTerminalSymbol() throws PrologException { engine.setTheory(new Theory( "a --> [a], b.\n" + "b --> [].")); SolveInfo solution = engine.solve("phrase(a, [a])."); assertTrue(solution.isSuccess()); solution = engine.solve("phrase(b, [])."); assertTrue(solution.isSuccess()); } @Test public void multipleProductionsForASymbol() throws PrologException { engine.setTheory(new Theory( "a --> [a], a, [d].\n" + "a --> [b], a, [d].\n" + "a --> [c].")); SolveInfo solution = engine.solve("phrase(a, [a, b, a, a, c, d, d, d, d])."); assertTrue(solution.isSuccess()); } @Test public void useVariableInProduction() throws PrologException { engine.setTheory(new Theory( "x(V) --> [a], x(V), [a].\n" + "x(V) --> [V].")); SolveInfo solution = engine.solve("phrase(x(1), [a, a, a, 1, a, a, a])."); assertTrue(solution.isSuccess()); } @Test public void dcgAction() throws PrologException { engine.setTheory(new Theory( "x --> [a], x, [a].\n" + "x --> [V], { number(V) }.")); SolveInfo solution = engine.solve("phrase(x, [a, a, a, 151, a, a, a])."); assertTrue(solution.isSuccess()); } @Test public void parseSums() throws PrologException { engine.setTheory(new Theory( "e --> o, et.\n" + "et --> [].\n" + "et --> ['+'], e.\n" + "o --> ['('], e, [')'].\n" + "o --> [X], { number(X) }.")); SolveInfo solution = engine.solve("phrase(e, [1, '+', '(', 2, '+', 3, ')', '+', 4])."); assertTrue(solution.isSuccess()); } @Test public void evaluateSums() throws PrologException { engine.setTheory(new Theory( "e(V) --> o(V1), et(V1, V).\n" + "et(V, V) --> [].\n" + "et(VI, VO) --> ['+'], o(V1), { VI1 is VI + V1 }, et(VI1, VO).\n" + "o(V) --> ['('], e(V), [')'].\n" + "o(X) --> [X], { number(X) }.")); SolveInfo solution = engine.solve("phrase(e(V), [1, '+', '(', 2, '+', 3, ')'])."); assertTrue(solution.isSuccess()); assertEquals(new Int(6), solution.getTerm("V")); } @Test public void parseConjunctions() throws PrologException { engine.setTheory(new Theory( "e --> t, et.\n" + "et --> [].\n" + "et --> [and], e.\n" + "t --> ['0'].\n" + "t --> ['1'].")); SolveInfo solution = engine.solve("phrase(e, ['0'])."); assertTrue(solution.isSuccess()); } @Test public void evaluateConjunctions() throws PrologException { engine.setTheory(new Theory( "e(V) --> t(W), et(W, V).\n" + "et(V, V) --> [].\n" + "et(W, V) --> [and], t(V1), { W = 1, V1 = 1, !, W2 = 1 ; W2 = 0 }, et(W2, V).\n" + "t(0) --> ['0'].\n" + "t(1) --> ['1'].")); SolveInfo solution = engine.solve("phrase(e(V), ['1'])."); assertTrue(solution.isSuccess()); assertEquals(new Int(1), solution.getTerm("V")); } }