use of com.sri.ai.grinder.api.Context in project aic-expresso by aic-sri-international.
the class UnificationStepSolverTest method advancedDifferenceArithmeticTest.
@Ignore("TODO - context implementation currently does not support these more advanced/indirect comparisons")
@Test
public void advancedDifferenceArithmeticTest() {
TheoryTestingSupport theoryTestingSupport = TheoryTestingSupport.make(seededRandom, new DifferenceArithmeticTheory(true, true));
// NOTE: passing explicit FunctionTypes will prevent the general variables' argument types being randomly changed.
theoryTestingSupport.setVariableNamesAndTypesForTesting(map("I", TESTING_INTEGER_INTERVAL_TYPE, "J", TESTING_INTEGER_INTERVAL_TYPE, "K", TESTING_INTEGER_INTERVAL_TYPE, "unary_dar/1", new FunctionType(TESTING_INTEGER_INTERVAL_TYPE, TESTING_INTEGER_INTERVAL_TYPE), "binary_dar/2", new FunctionType(TESTING_INTEGER_INTERVAL_TYPE, TESTING_INTEGER_INTERVAL_TYPE, TESTING_INTEGER_INTERVAL_TYPE)));
Context rootContext = theoryTestingSupport.makeContextWithTestingInformation();
UnificationStepSolver unificationStepSolver = new UnificationStepSolver(parse("binary_dar(I, unary_dar(I))"), parse("binary_dar(unary_dar(J), J)"));
Context localTestContext = rootContext.conjoinWithConjunctiveClause(parse("I = 0 and J = 1 and unary_dar(J) = 0 and unary_dar(I) = 1"), rootContext);
StepSolver.Step<Boolean> step = unificationStepSolver.step(localTestContext);
Assert.assertEquals(false, step.itDepends());
Assert.assertEquals(true, step.getValue());
localTestContext = rootContext.conjoinWithConjunctiveClause(parse("I = 1 and J = 1 and unary_dar(J) = 0 and unary_dar(I) = 1"), rootContext);
step = unificationStepSolver.step(localTestContext);
Assert.assertEquals(false, step.itDepends());
Assert.assertEquals(false, step.getValue());
localTestContext = rootContext.conjoinWithConjunctiveClause(parse("I = 0 and J = 1 and unary_dar(1) = 0 and unary_dar(0) = 1"), rootContext);
step = unificationStepSolver.step(localTestContext);
Assert.assertEquals(false, step.itDepends());
Assert.assertEquals(true, step.getValue());
}
use of com.sri.ai.grinder.api.Context in project aic-expresso by aic-sri-international.
the class BasicTest method debug.
public void debug(Expression problem, Expression expectedSolution) {
CompoundTheory theory = new CompoundTheory(new EqualityTheory(false, true), new DifferenceArithmeticTheory(false, false), new LinearRealArithmeticTheory(false, false), new TupleTheory(), new PropositionalTheory(), new BruteForceFunctionTheory());
Context context = new TrueContext(theory);
context = context.makeNewContextWithAddedType(BOOLEAN_TYPE);
context = context.makeCloneWithAdditionalRegisteredSymbolsAndTypes(map(makeSymbol("P"), makeSymbol("Boolean")));
Expression symbolicSolution = theory.evaluate(problem, context);
println(symbolicSolution);
Assert.assertEquals(expectedSolution, symbolicSolution);
}
use of com.sri.ai.grinder.api.Context in project aic-expresso by aic-sri-international.
the class CompoundTheoryWithDifferenceArithmeticTest method runCompleteSatisfiabilityTest.
/**
* @param conjunction
* @param expected
*/
private void runCompleteSatisfiabilityTest(String conjunction, Expression expected, Map<String, Type> variableNamesAndTypesForTesting) {
TheoryTestingSupport equalityTheoryTestingSupport = TheoryTestingSupport.make(makeRandom(), new EqualityTheory(true, true));
equalityTheoryTestingSupport.setVariableNamesAndTypesForTesting(variableNamesAndTypesForTesting);
TheoryTestingSupport theoryTestingSupport = TheoryTestingSupport.make(makeRandom(), equalityTheoryTestingSupport, TheoryTestingSupport.make(makeRandom(), new PropositionalTheory()));
Context context = theoryTestingSupport.makeContextWithTestingInformation();
Constraint constraint = new CompleteMultiVariableContext(theoryTestingSupport.getTheory(), context);
for (Expression literal : And.getConjuncts(parse(conjunction))) {
constraint = constraint.conjoin(literal, context);
}
assertEquals(expected, constraint);
}
use of com.sri.ai.grinder.api.Context in project aic-expresso by aic-sri-international.
the class CompoundTheoryWithoutDifferenceArithmeticTest method basicTests.
@Test
public void basicTests() {
TheoryTestingSupport theoryTestingSupport = makeTheoryTestingSupport();
Expression condition = parse("X = Y and Y = X and P and not Q and P and X = a and X != b");
Context context = theoryTestingSupport.extendWithTestingInformation(new TrueContext(theoryTestingSupport.getTheory()));
Constraint constraint = new CompleteMultiVariableContext(theoryTestingSupport.getTheory(), context);
constraint = constraint.conjoin(condition, context);
Expression expected = parse("(Y = a) and not Q and P and (X = Y)");
assertEquals(expected, constraint);
}
use of com.sri.ai.grinder.api.Context in project aic-expresso by aic-sri-international.
the class BasicTest method isLiteralTests.
@Test
public void isLiteralTests() {
Expression expression;
boolean expected;
Context context = new TrueContext();
context = context.makeCloneWithAdditionalRegisteredSymbolsAndTypes(map(parse("X"), parse("Integer"), parse("Y"), parse("Integer"), parse("Z"), parse("Integer"), parse("W"), parse("Real")));
// Difference arithmetic literals include up to two integer variables with coefficient
// -1 or +1 (each no more than once) and an optional numeric constant.
expression = parse("1 >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("X >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("-X >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("X + Y >= 0");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y + 3 >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y + 3 + Z >= Z");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("X - X + X - Y + Y - Z + 1 - 5 >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
// Final variables coefficients must be 1 or -1
expression = parse("X >= -X");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y >= -X");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X + Y >= -X");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y + 3 >= -X");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y + 3 + Z >= Z - X");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X - X + X - Y + Y - Z + 1 - 5 >= -X");
expected = false;
runIsLiteralTest(expression, expected, context);
// Final variables coefficients must be 1 or -1
// Coefficients may be present in the initial expression
expression = parse("X*2 >= 0");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("2*X - Y >= 0");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("2*X - Y - X >= 0");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("2*X - Y >= X");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("X + Y >= 2*Y");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("3*X - Y + 3 >= X");
expected = false;
runIsLiteralTest(expression, expected, context);
expression = parse("X - Y + 3 + 2*Z >= 2*Z");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("2*X - 2*X + X - 2*Y + 2*Y - 2*Z + 1 - 5 >= -Z");
expected = true;
runIsLiteralTest(expression, expected, context);
// Variables must be integer
expression = parse("2*X - 2*X + X - 2*W + 2*W - 2*Z + 1 - 5 >= -Z");
expected = true;
runIsLiteralTest(expression, expected, context);
expression = parse("W - X >= 0");
expected = false;
runIsLiteralTest(expression, expected, context);
// Sides should be polynomials
expression = parse("f()*2 > 0");
expected = false;
runIsLiteralTest(expression, expected, context);
}
Aggregations