javasmt-solver-cvc4

SMT solver CVC4 for use in JavaSMT

License

License

Categories

Categories

ASM Application Layer Libs Bytecode Manipulation
GroupId

GroupId

org.sosy-lab
ArtifactId

ArtifactId

javasmt-solver-cvc4
Last Version

Last Version

1.8-prerelease-2020-06-24-g7825d8f28
Release Date

Release Date

Type

Type

so
Description

Description

javasmt-solver-cvc4
SMT solver CVC4 for use in JavaSMT
Project URL

Project URL

https://github.com/sosy-lab/java-smt
Project Organization

Project Organization

Software Systems Lab
Source Code Management

Source Code Management

https://github.com/sosy-lab/java-smt/

Download javasmt-solver-cvc4

Dependencies

There are no dependencies for this project. It is a standalone project that does not depend on any other jars.

Project Modules

There are no modules declared in this project.

JavaSMT

Build Status Build Status on Windows Code Quality Test Coverage Apache 2.0 License Maven Central

JavaSMT is a common API layer for accessing various SMT solvers. The API is optimized for performance (using JavaSMT has very little runtime overhead compared to using the solver API directly), customizability (features and settings exposed by various solvers should be visible through the wrapping layer) and type-safety (it shouldn't be possible to add boolean terms to integer ones at compile time) sometimes at the cost of verbosity.

Quick links

Getting Started | Documentation | Known Issues | Documentation for Developers | Changelog | Configuration Options

References

Feature overview

JavaSMT can express formulas in the following theories:

  • Integer
  • Rational
  • Bitvector
  • Floating point
  • Array
  • Uninterpreted Function

Currently JavaSMT supports several SMT solvers (see Getting Started for installation):

SMT Solver Linux64 Windows64 MacOS Description
Boolector ✔️ a fast solver for bitvector logic, misses formula introspection
CVC4 ✔️
MathSAT5 ✔️ ✔️
OptiMathSAT ✔️ same as MathSAT5, but with support for optimization
Princess ✔️ ✔️ ✔️ Java-based SMT solver
SMTInterpol ✔️ ✔️ ✔️ Java-based SMT solver
Yices2 ✔️ soon
Z3 ✔️ ✔️ ✔️ mature and well-known solver

The following features are supported (depending on the used SMT solver):

  • Satisfiability checking
  • Quantifiers and quantifier elimination
  • Incremental solving with assumptions
  • Incremental solving with push/pop
  • Multiple independent contexts
  • Model generation
  • Interpolation, including tree and sequential structure
  • Formula transformation using built-in tactics
  • Formula introspection using visitors

We aim for supporting more important features, more SMT solvers, and more systems. If something specific is missing, please look for or file an issue.

Multithreading Support

The solvers Z3(w and w/o Optimization), SMTInterpol, Princess, MathSAT5, Boolector and CVC4 support multithreading, provided that different threads use different contexts, and all operations on a single context are performed from a single thread. Interruption using ShutdownNotifier may be used to interrupt a a solver from any thread. CVC4 supports multithreading on a single context with multiple stacks(=provers).

Garbage Collection in Native Solvers

JavaSMT exposes an API for performing garbage collection on solvers implemented in a native language. As a native solver has no way of knowing whether the created formula object is still referenced by the client application, this API is necessary to avoid leaking memory. Note that several solvers already support hash consing and thus, there is never more than one copy of an identical formula object in memory. Consequently, if all created formulas are later re-used (or re-created) in the application, it is not necessary to perform any garbage collection at all.

Z3

The parameter solver.z3.usePhantomReferences may be used to control whether JavaSMT will attempt to decrease references on Z3 formula objects once they are no longer referenced.

MathSAT5

Currently we do not support performing garbage collection for MathSAT5.

Getting started

Installation is possible via Maven, Ivy, or manually. Please see our Getting Started Guide.

Usage

// Instantiate JavaSMT with SMTInterpol as backend (for dependencies cf. documentation)
try (SolverContext context = SolverContextFactory.createSolverContext(
        config, logger, shutdownNotifier, Solvers.SMTINTERPOL)) {
  IntegerFormulaManager imgr = context.getFormulaManager().getIntegerFormulaManager();

  // Create formula "a = b" with two integer variables
  IntegerFormula a = imgr.makeVariable("a");
  IntegerFormula b = imgr.makeVariable("b");
  BooleanFormula f = imgr.equal(a, b);

  // Solve formula, get model, and print variable assignment
  try (ProverEnvironment prover = context.newProverEnvironment(ProverOptions.GENERATE_MODELS)) {
    prover.addConstraint(f);
    boolean isUnsat = prover.isUnsat();
    assert !isUnsat;
    try (Model model = prover.getModel()) {
      System.out.printf("SAT with a = %s, b = %s", model.evaluate(a), model.evaluate(b));
    }
  }
}

Authors

org.sosy-lab

SoSy-Lab

Versions

Version
1.8-prerelease-2020-06-24-g7825d8f28