1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
/******************************************************************************
* Top contributors (to current version):
* Alex Ozdemir, Daniel Larraz, Mudathir Mohamed
*
* This file is part of the cvc5 project.
*
* Copyright (c) 2009-2025 by the authors listed in the file AUTHORS
* in the top-level source directory and their institutional affiliations.
* All rights reserved. See the file COPYING in the top-level source
* directory for licensing information.
* ****************************************************************************
*
* An example of solving finite field problems with cvc5's Java API
*
*/
import io.github.cvc5.*;
import java.util.*;
public class FiniteField
{
public static void main(String args[]) throws CVC5ApiException
{
TermManager tm = new TermManager();
Solver slv = new Solver(tm);
{
slv.setLogic("QF_FF"); // Set the logic
Sort f5 = tm.mkFiniteFieldSort("5", 10);
Term a = tm.mkConst(f5, "a");
Term b = tm.mkConst(f5, "b");
Term z = tm.mkFiniteFieldElem("0", f5, 10);
System.out.println("is ff: " + f5.isFiniteField());
System.out.println("ff size: " + f5.getFiniteFieldSize());
System.out.println("is ff value: " + z.isFiniteFieldValue());
System.out.println("ff value: " + z.getFiniteFieldValue());
Term inv = tm.mkTerm(Kind.EQUAL,
tm.mkTerm(Kind.FINITE_FIELD_ADD,
tm.mkTerm(Kind.FINITE_FIELD_MULT, a, b),
tm.mkFiniteFieldElem("-1", f5, 10)),
z);
Term aIsTwo = tm.mkTerm(
Kind.EQUAL, tm.mkTerm(Kind.FINITE_FIELD_ADD, a, tm.mkFiniteFieldElem("-2", f5, 10)), z);
slv.assertFormula(inv);
slv.assertFormula(aIsTwo);
Result r = slv.checkSat();
System.out.println("is sat: " + r.isSat());
Term bIsTwo = tm.mkTerm(
Kind.EQUAL, tm.mkTerm(Kind.FINITE_FIELD_ADD, b, tm.mkFiniteFieldElem("-2", f5, 10)), z);
slv.assertFormula(bIsTwo);
r = slv.checkSat();
System.out.println("is sat: " + r.isSat());
}
Context.deletePointers();
}
}
|