mirror of
https://github.com/AdaCore/cvc5.git
synced 2026-02-12 12:32:16 -08:00
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:
@@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user