Enable CI for Junit tests (#7436)

This PR enables CI for java tests by adding --java-bindings to ci.yml.
It also replaces the unreliable finalize method and instead uses AutoCloseable and explicit close method to clean up dynamic memory allocated by java native interface.
The PR fixes compile errors for SolverTest.java and runtime errors for Solver.defineFun.
This commit is contained in:
mudathirmahgoub
2021-11-03 16:32:10 -05:00
committed by GitHub
parent b8504ef92e
commit 690a392656
57 changed files with 1281 additions and 1202 deletions

View File

@@ -69,129 +69,131 @@ public class Relations
{
public static void main(String[] args) throws CVC5ApiException
{
Solver solver = new Solver();
try (Solver solver = new Solver())
{
// Set the logic
solver.setLogic("ALL");
// Set the logic
solver.setLogic("ALL");
// options
solver.setOption("produce-models", "true");
solver.setOption("finite-model-find", "true");
solver.setOption("sets-ext", "true");
solver.setOption("output-language", "smt2");
// options
solver.setOption("produce-models", "true");
solver.setOption("finite-model-find", "true");
solver.setOption("sets-ext", "true");
solver.setOption("output-language", "smt2");
// (declare-sort Person 0)
Sort personSort = solver.mkUninterpretedSort("Person");
// (declare-sort Person 0)
Sort personSort = solver.mkUninterpretedSort("Person");
// (Tuple Person)
Sort tupleArity1 = solver.mkTupleSort(new Sort[] {personSort});
// (Set (Tuple Person))
Sort relationArity1 = solver.mkSetSort(tupleArity1);
// (Tuple Person)
Sort tupleArity1 = solver.mkTupleSort(new Sort[] {personSort});
// (Set (Tuple Person))
Sort relationArity1 = solver.mkSetSort(tupleArity1);
// (Tuple Person Person)
Sort tupleArity2 = solver.mkTupleSort(new Sort[] {personSort, personSort});
// (Set (Tuple Person Person))
Sort relationArity2 = solver.mkSetSort(tupleArity2);
// (Tuple Person Person)
Sort tupleArity2 = solver.mkTupleSort(new Sort[] {personSort, personSort});
// (Set (Tuple Person Person))
Sort relationArity2 = solver.mkSetSort(tupleArity2);
// empty set
Term emptySetTerm = solver.mkEmptySet(relationArity1);
// empty set
Term emptySetTerm = solver.mkEmptySet(relationArity1);
// empty relation
Term emptyRelationTerm = solver.mkEmptySet(relationArity2);
// empty relation
Term emptyRelationTerm = solver.mkEmptySet(relationArity2);
// universe set
Term universeSet = solver.mkUniverseSet(relationArity1);
// universe set
Term universeSet = solver.mkUniverseSet(relationArity1);
// variables
Term people = solver.mkConst(relationArity1, "people");
Term males = solver.mkConst(relationArity1, "males");
Term females = solver.mkConst(relationArity1, "females");
Term father = solver.mkConst(relationArity2, "father");
Term mother = solver.mkConst(relationArity2, "mother");
Term parent = solver.mkConst(relationArity2, "parent");
Term ancestor = solver.mkConst(relationArity2, "ancestor");
Term descendant = solver.mkConst(relationArity2, "descendant");
// variables
Term people = solver.mkConst(relationArity1, "people");
Term males = solver.mkConst(relationArity1, "males");
Term females = solver.mkConst(relationArity1, "females");
Term father = solver.mkConst(relationArity2, "father");
Term mother = solver.mkConst(relationArity2, "mother");
Term parent = solver.mkConst(relationArity2, "parent");
Term ancestor = solver.mkConst(relationArity2, "ancestor");
Term descendant = solver.mkConst(relationArity2, "descendant");
Term isEmpty1 = solver.mkTerm(EQUAL, males, emptySetTerm);
Term isEmpty2 = solver.mkTerm(EQUAL, females, emptySetTerm);
Term isEmpty1 = solver.mkTerm(EQUAL, males, emptySetTerm);
Term isEmpty2 = solver.mkTerm(EQUAL, females, emptySetTerm);
// (assert (= people (as univset (Set (Tuple Person)))))
Term peopleAreTheUniverse = solver.mkTerm(EQUAL, people, universeSet);
// (assert (not (= males (as emptyset (Set (Tuple Person))))))
Term maleSetIsNotEmpty = solver.mkTerm(NOT, isEmpty1);
// (assert (not (= females (as emptyset (Set (Tuple Person))))))
Term femaleSetIsNotEmpty = solver.mkTerm(NOT, isEmpty2);
// (assert (= people (as univset (Set (Tuple Person)))))
Term peopleAreTheUniverse = solver.mkTerm(EQUAL, people, universeSet);
// (assert (not (= males (as emptyset (Set (Tuple Person))))))
Term maleSetIsNotEmpty = solver.mkTerm(NOT, isEmpty1);
// (assert (not (= females (as emptyset (Set (Tuple Person))))))
Term femaleSetIsNotEmpty = solver.mkTerm(NOT, isEmpty2);
// (assert (= (intersection males females) (as emptyset (Set (Tuple
// Person)))))
Term malesFemalesIntersection = solver.mkTerm(INTERSECTION, males, females);
Term malesAndFemalesAreDisjoint =
solver.mkTerm(EQUAL, malesFemalesIntersection, emptySetTerm);
// (assert (= (intersection males females) (as emptyset (Set (Tuple
// Person)))))
Term malesFemalesIntersection = solver.mkTerm(INTERSECTION, males, females);
Term malesAndFemalesAreDisjoint = solver.mkTerm(EQUAL, malesFemalesIntersection, emptySetTerm);
// (assert (not (= father (as emptyset (Set (Tuple Person Person))))))
// (assert (not (= mother (as emptyset (Set (Tuple Person Person))))))
Term isEmpty3 = solver.mkTerm(EQUAL, father, emptyRelationTerm);
Term isEmpty4 = solver.mkTerm(EQUAL, mother, emptyRelationTerm);
Term fatherIsNotEmpty = solver.mkTerm(NOT, isEmpty3);
Term motherIsNotEmpty = solver.mkTerm(NOT, isEmpty4);
// (assert (not (= father (as emptyset (Set (Tuple Person Person))))))
// (assert (not (= mother (as emptyset (Set (Tuple Person Person))))))
Term isEmpty3 = solver.mkTerm(EQUAL, father, emptyRelationTerm);
Term isEmpty4 = solver.mkTerm(EQUAL, mother, emptyRelationTerm);
Term fatherIsNotEmpty = solver.mkTerm(NOT, isEmpty3);
Term motherIsNotEmpty = solver.mkTerm(NOT, isEmpty4);
// fathers are males
// (assert (subset (join father people) males))
Term fathers = solver.mkTerm(JOIN, father, people);
Term fathersAreMales = solver.mkTerm(SUBSET, fathers, males);
// fathers are males
// (assert (subset (join father people) males))
Term fathers = solver.mkTerm(JOIN, father, people);
Term fathersAreMales = solver.mkTerm(SUBSET, fathers, males);
// mothers are females
// (assert (subset (join mother people) females))
Term mothers = solver.mkTerm(JOIN, mother, people);
Term mothersAreFemales = solver.mkTerm(SUBSET, mothers, females);
// mothers are females
// (assert (subset (join mother people) females))
Term mothers = solver.mkTerm(JOIN, mother, people);
Term mothersAreFemales = solver.mkTerm(SUBSET, mothers, females);
// (assert (= parent (union father mother)))
Term unionFatherMother = solver.mkTerm(UNION, father, mother);
Term parentIsFatherOrMother = solver.mkTerm(EQUAL, parent, unionFatherMother);
// (assert (= parent (union father mother)))
Term unionFatherMother = solver.mkTerm(UNION, father, mother);
Term parentIsFatherOrMother = solver.mkTerm(EQUAL, parent, unionFatherMother);
// (assert (= parent (union father mother)))
Term transitiveClosure = solver.mkTerm(TCLOSURE, parent);
Term descendantFormula = solver.mkTerm(EQUAL, descendant, transitiveClosure);
// (assert (= parent (union father mother)))
Term transitiveClosure = solver.mkTerm(TCLOSURE, parent);
Term descendantFormula = solver.mkTerm(EQUAL, descendant, transitiveClosure);
// (assert (= parent (union father mother)))
Term transpose = solver.mkTerm(TRANSPOSE, descendant);
Term ancestorFormula = solver.mkTerm(EQUAL, ancestor, transpose);
// (assert (= parent (union father mother)))
Term transpose = solver.mkTerm(TRANSPOSE, descendant);
Term ancestorFormula = solver.mkTerm(EQUAL, ancestor, transpose);
// (assert (forall ((x Person)) (not (member (mkTuple x x) ancestor))))
Term x = solver.mkVar(personSort, "x");
DatatypeConstructor constructor = tupleArity2.getDatatype().getConstructor(0);
Term xxTuple = solver.mkTerm(APPLY_CONSTRUCTOR, constructor.getConstructorTerm(), x, x);
Term member = solver.mkTerm(MEMBER, xxTuple, ancestor);
Term notMember = solver.mkTerm(NOT, member);
// (assert (forall ((x Person)) (not (member (mkTuple x x) ancestor))))
Term x = solver.mkVar(personSort, "x");
DatatypeConstructor constructor = tupleArity2.getDatatype().getConstructor(0);
Term xxTuple = solver.mkTerm(APPLY_CONSTRUCTOR, constructor.getConstructorTerm(), x, x);
Term member = solver.mkTerm(MEMBER, xxTuple, ancestor);
Term notMember = solver.mkTerm(NOT, member);
Term quantifiedVariables = solver.mkTerm(BOUND_VAR_LIST, x);
Term noSelfAncestor = solver.mkTerm(FORALL, quantifiedVariables, notMember);
Term quantifiedVariables = solver.mkTerm(BOUND_VAR_LIST, x);
Term noSelfAncestor = solver.mkTerm(FORALL, quantifiedVariables, notMember);
// formulas
solver.assertFormula(peopleAreTheUniverse);
solver.assertFormula(maleSetIsNotEmpty);
solver.assertFormula(femaleSetIsNotEmpty);
solver.assertFormula(malesAndFemalesAreDisjoint);
solver.assertFormula(fatherIsNotEmpty);
solver.assertFormula(motherIsNotEmpty);
solver.assertFormula(fathersAreMales);
solver.assertFormula(mothersAreFemales);
solver.assertFormula(parentIsFatherOrMother);
solver.assertFormula(descendantFormula);
solver.assertFormula(ancestorFormula);
solver.assertFormula(noSelfAncestor);
// formulas
solver.assertFormula(peopleAreTheUniverse);
solver.assertFormula(maleSetIsNotEmpty);
solver.assertFormula(femaleSetIsNotEmpty);
solver.assertFormula(malesAndFemalesAreDisjoint);
solver.assertFormula(fatherIsNotEmpty);
solver.assertFormula(motherIsNotEmpty);
solver.assertFormula(fathersAreMales);
solver.assertFormula(mothersAreFemales);
solver.assertFormula(parentIsFatherOrMother);
solver.assertFormula(descendantFormula);
solver.assertFormula(ancestorFormula);
solver.assertFormula(noSelfAncestor);
// check sat
Result result = solver.checkSat();
// check sat
Result result = solver.checkSat();
// output
System.out.println("Result = " + result);
System.out.println("people = " + solver.getValue(people));
System.out.println("males = " + solver.getValue(males));
System.out.println("females = " + solver.getValue(females));
System.out.println("father = " + solver.getValue(father));
System.out.println("mother = " + solver.getValue(mother));
System.out.println("parent = " + solver.getValue(parent));
System.out.println("descendant = " + solver.getValue(descendant));
System.out.println("ancestor = " + solver.getValue(ancestor));
// output
System.out.println("Result = " + result);
System.out.println("people = " + solver.getValue(people));
System.out.println("males = " + solver.getValue(males));
System.out.println("females = " + solver.getValue(females));
System.out.println("father = " + solver.getValue(father));
System.out.println("mother = " + solver.getValue(mother));
System.out.println("parent = " + solver.getValue(parent));
System.out.println("descendant = " + solver.getValue(descendant));
System.out.println("ancestor = " + solver.getValue(ancestor));
}
}
}