package com.igormaznitsa.prol.test;
import com.igormaznitsa.prol.data.Term;
import com.igormaznitsa.prol.data.TermStruct;
import com.igormaznitsa.prol.data.Var;
import com.igormaznitsa.prol.logic.Goal;
import com.igormaznitsa.prol.logic.PreparedGoal;
import com.igormaznitsa.prol.logic.ProlContext;
import com.igormaznitsa.prol.parser.ProlConsult;
import junit.framework.TestCase;
import org.junit.Test;
public class OperatorTest extends TestCase {
@Test
public void testOperatorDefs() {
try {
final ProlContext context = new ProlContext("Operator_test");
final ProlConsult consult = new ProlConsult(":-op(800,xfx,'<===>'). :-op(700,xfy,'v'). :-op(600,xfy,'&'). :-op(500,fy,'~'). moon <===> earth.", context);
consult.consult();
PreparedGoal prepGoal = new PreparedGoal("~(xxx & yyy) <===> ~xxx v ~yyy.", context);
TermStruct root = (TermStruct) prepGoal.getParsedGoal();
assertEquals(root.getText(), "<===>");
assertEquals(root.getArity(), 2);
TermStruct lefttree = (TermStruct) root.getElement(0);
TermStruct righttree = (TermStruct) root.getElement(1);
assertEquals(lefttree.getText(), "~");
assertEquals(lefttree.getArity(), 1);
assertEquals(righttree.getText(), "v");
assertEquals(righttree.getArity(), 2);
final TermStruct prevrighttree = righttree;
lefttree = (TermStruct) lefttree.getElement(0);
righttree = (TermStruct) righttree.getElement(0);
assertEquals(lefttree.getText(), "&");
assertEquals(lefttree.getArity(), 2);
assertEquals(lefttree.getElement(0).getTermType(), Term.TYPE_ATOM);
assertEquals(lefttree.getElement(1).getTermType(), Term.TYPE_ATOM);
assertEquals(lefttree.getElement(0).getText(), "xxx");
assertEquals(lefttree.getElement(1).getText(), "yyy");
lefttree = (TermStruct) prevrighttree.getElement(0);
righttree = (TermStruct) prevrighttree.getElement(1);
assertEquals(lefttree.getArity(), 1);
assertEquals(lefttree.getText(), "~");
assertEquals(righttree.getArity(), 1);
assertEquals(righttree.getText(), "~");
assertEquals(lefttree.getElement(0).getTermType(), Term.TYPE_ATOM);
assertEquals(lefttree.getElement(0).getText(), "xxx");
assertEquals(righttree.getElement(0).getTermType(), Term.TYPE_ATOM);
assertEquals(righttree.getElement(0).getText(), "yyy");
final PreparedGoal prepGoal2 = new PreparedGoal("moon <===> X.", context);
int solvecounter = 0;
Term result = null;
final Goal gl = prepGoal2.getNonparametrizedGoalInstance();
String text = null;
while (true) {
final Term curresult = gl.solve();
if (curresult == null) {
break;
}
text = gl.getVarForName("X").getValue().getText();
result = curresult;
solvecounter++;
}
assertEquals(solvecounter, 1);
assertEquals(text, "earth");
}
catch (Exception ex) {
ex.printStackTrace();
fail(ex.toString());
}
}
}