Library / SDK
cvc5/cvc5 avatar
cvc5/cvc5

cvc5: First-Order SMT Solving for Verification and Libraries

cvc5 is an open-source automatic theorem prover for Satisfiability Modulo Theories (SMT) problems.

1,388 stars313 forksSMTNOASSERTION

At a glance

What is it?
cvc5 checks satisfiability for first-order formulas over one or more theories, either as a stand-alone tool or through library APIs. It is best suited to symbolic verification, theorem-proving research, and applications that need formal SMT reasoning.
Who is it for?
Adopt cvc5 when a project needs an extensible first-order SMT engine available as a binary or C++ library with APIs for selected languages. Do not choose it solely as a beginner example or assume that the repository metadata resolves licensing.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 2 days ago.
What is it written in?
Mainly SMT, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on November 7, 2026, and from our analysis. They are not legal advice.

From daily snapshots

Star history

  • cvc5/cvc51,388 ★ · +17
Star history
Repository2026-10-172026-11-07
cvc5/cvc51.4k1.4k

17 Stars in the last 21 days, measured from the daily GitHub snapshot. Compare with other projects

Editorial analysis

The first-order satisfiability problem addressed by cvc5

cvc5 addresses a precise symbolic reasoning problem: deciding whether a first-order formula is satisfiable modulo a theory or a combination of theories. In practical terms, a caller encodes a formula, declares the relevant theories, and asks whether a satisfying assignment exists within the rules and constraints of those theories. This places cvc5 closer to formal verification, proof engineering, compiler verification, constraint analysis, and theorem-proving research than to ordinary numerical optimization.

The README identifies cvc5 as the fifth member of the Cooperating Validity Checker family, following CVC, CVC Lite, CVC3, and CVC4. Although it belongs to that lineage, it does not directly incorporate code from versions before CVC4. This detail matters when comparing its architecture with older CVC systems because family continuity does not imply a shared codebase.

The intended audience is split between people who want to invoke an SMT solver directly and developers who want to embed one in another application. The repository supports both paths. It is written entirely in C++, can operate as a stand-alone tool, and exposes APIs for languages including Python and Java. The README does not provide a list of supported theories or claim suitability for every class of symbolic decision problem, so a prospective adopter would need to verify that cvc5 supports the exact theory combination in the application.

Repository structure behind the cvc5 solver interfaces

Based on the repository layout, cvc5 is divided into public headers, C++ implementation sources, tests, examples, proofs, documentation, and CMake-based build configuration. The top-level `CMakeLists.txt` and `cmake/` directory establish the build system. `include/` and `src/` contain the software interface and implementation, while `test/` provides the repository's test organization. This separation is important for an embedded solver because integration concerns differ from solver development.

The `examples/` directory makes the intended integration paths concrete. It contains C++ examples named `simple_vc_cxx.cpp` and `simple_vc_quant_cxx.cpp`, a Java example named `SimpleVC.java`, an API directory, and its own `CMakeLists.txt` and `README.md`. The C++ examples include a basic validation context and a quantified example, but their complete contents are not shown here. Consequently, this review can identify the examples but cannot quote their APIs or claim their exact calls.

Internally, the presence of `proofs/` indicates that proof-related material has a dedicated place in the project. The README does not describe the internal search loop, theory solver dispatch, preprocessing pipeline, or proof-generation architecture. It does state that cvc5 was designed to improve performance and reduce memory overhead compared with predecessors. That design goal should not be treated as a benchmark claim, because no measurements or comparison results are documented in the README.

For maintainers, `CONTRIBUTING.md`, `.clang-format`, `.clang-tidy`, and the continuous integration configuration under `.github/` provide visible entry points. The README also links to the Developer Guide for development documentation. The repository has not been archived, and its last push was on 2026-10-14, but recent repository activity alone does not establish that every theory or API is stable.

Installing cvc5 and locating the first validation example

The README does not give a self-contained shell installation tutorial or a package-manager command. It directs users to `INSTALL.rst` for detailed Linux, macOS, and Windows build and installation instructions. Source tarballs and binaries for `main` are linked from the repository's releases page, while nightly builds are listed on the cvc5 website. A user should first identify which distribution matches the required platform and whether a release binary is acceptable for the intended environment.

The documented platform constraint is specific. cvc5 can be built on Linux and macOS. On Windows, the documented build routes are MSYS2 or cross-compilation with Mingw-w64. The README does not claim native Windows support, so a Windows requirement should be resolved through one of those stated build paths before source compilation is scheduled.

For a first real use, the repository provides `examples/simple_vc_cxx.cpp` for C++ and `SimpleVC.java` for Java. These are better starting references than an invented input because they are files maintained in the repository. The developer-facing examples directory also contains `simple_vc_quant_cxx.cpp`, which is the relevant starting point when the first formula needs quantifiers.

No executable input, command-line invocation, output transcript, or complete API snippet can be reproduced from the README. Copying one here would risk inventing an unsupported flag or method. The concrete first step is therefore to follow `INSTALL.rst`, then open `examples/README.md` and the named example matching the chosen interface.

Standalone operation versus Python, Java, and C++ integration

cvc5 can serve two different integration models. As a stand-alone tool, it fits a workflow where formulas are prepared outside the solver and passed into the executable. As a library, it can become part of an application that constructs formulas, configures solver behavior, invokes checks, and consumes results through an API. The README explicitly confirms Python and Java APIs and identifies the implementation as C++, but it does not document the Python binding name, Java package name, method signatures, or supported ABI.

That distinction affects adoption. A stand-alone deployment keeps the solver behind a process interface and may simplify replacement or isolation. Library integration avoids that boundary, although it couples the application to available headers, build configuration, language bindings, and API compatibility. The repository's separate C++, Java, Python, and API documentation paths suggest multiple integration options, but they do not guarantee identical feature coverage.

The `examples/CMakeLists.txt` is relevant to C++ integration because it is the build metadata for the repository examples. It should be consulted alongside the example source instead of assuming a system-wide install layout. The project documentation is split between the online user documentation and the wiki Developer Guide. This is a practical maintenance consideration for teams adopting an API: they need both the user-facing contract and the build guidance relevant to their language.

SMT boundary cases and unsupported assumptions in cvc5

The clearest limitation is scope. cvc5 decides satisfiability of first-order formulas modulo a first-order theory or combination of theories. The README does not present cvc5 as a general-purpose optimizer, theorem database, proof-producing replacement for every formal method, or solver for arbitrary second-order logic. A requirement that extends beyond the documented SMT model would need separate evaluation.

The absence of a theory matrix is also significant. cvc5 supports theory combinations in principle, but the README does not enumerate them, state completeness conditions, or identify decision procedures. This means an answer such as "cvc5 can solve it" is insufficient during selection. The formula's quantifier structure, theory interactions, expected result form, and resource limits determine practical suitability.

The README also does not document rollback, solver result reconstruction, or production-grade service behavior. Those are not conventional requirements for a local solver, but they matter when embedding it in a long-running application. Teams should not infer missing operational contracts from the existence of tests or continuous integration.

A direct solver can also be the wrong tool when the intended problem is merely numeric optimization and no formal satisfiability question exists. Similarly, a formula whose supported theory or quantifier profile falls outside cvc5's implementation should not be accepted based solely on the solver's general description. The project must be checked against the actual input class.

Alternative proof engines and their different operating model

The practical difference is not the existence of an SMT interface. It is the implementation, supported input behavior, APIs, build system, proof facilities, and results on the formulas an application must solve.

cvc5 is written entirely in C++ and follows the CVC family, but it does not directly incorporate code from versions before CVC4. Without API documentation or benchmark results in the README, this review cannot claim that one engine has better coverage, faster checks, or lower memory use for a particular workload.

Another alternative is a general-purpose constraint solver. Such a solver may be more appropriate when the application is primarily optimizing a numerical assignment rather than proving a modular or first-order property. cvc5's documented purpose is semantic decision about formulas under theories. A constraint solver centered on constraints and search objectives addresses a different problem, even if both tools return variables and Boolean outcomes.

The correct comparison therefore starts with representative formulas, required theory combinations, quantifiers, desired output, and integration language. It should not rely on project descriptions alone.

Release cadence, build cost, and cvc5 licensing evidence

The release information contains recent named versions `cvc5-1.4.1` and `cvc5-1.4.2`, dated 2026-09-25 and 2026-10-08 respectively. The repository's last push was on 2026-10-14, and it is not archived. These facts support recent project activity, but the README does not provide a backward-compatibility policy, support window, migration guide, or release schedule.

Build cost cannot be quantified from the README. The C++ codebase, CMake files, platform dependencies, optional language bindings, and examples indicate that installation is not equivalent to installing a single interpreted package. `INSTALL.rst` is the authoritative project-specific route for dependency and build choices. Upgrades may also require reviewing changes between named releases and recompiling embedded code.

Licensing requires a direct file check. The README badge and text describe cvc5 as released under a BSD 3-Clause open-source license and point to `COPYING`. The repository metadata separately classifies the license as a custom type that GitHub cannot classify. That discrepancy should be resolved by reading `COPYING` and any files under `licenses/` before redistribution or incorporation into software. This is not legal advice; it is a statement that the README and repository metadata are not sufficiently aligned to substitute for checking the project's own license text.

Editorial conclusion

Adopt cvc5 when a project needs an extensible first-order SMT engine available as a binary or C++ library with APIs for selected languages. Do not choose it solely as a beginner example or assume that the repository metadata resolves licensing. Before adoption, inspect COPYING and INSTALL.rst, confirm that the available build supports the intended theories and platform, and compare one representative formula against the application's required solver behavior.

Frequently asked questions

What kinds of problems can cvc5 solve?

cvc5 checks whether a first-order formula is satisfiable modulo a theory or a combination of theories. The README does not enumerate the complete theory list.

Can cvc5 be used as a library instead of a stand-alone solver?

Yes. The README says cvc5 can run as a stand-alone tool or as a library, with APIs including Python and Java. Its implementation is written in C++.

Which platforms does cvc5 support?

The README documents builds on Linux and macOS. It also identifies MSYS2 and cross-compilation with Mingw-w64 as build routes for Windows.

Official sources

  1. cvc5/cvc5 on GitHub
  2. Issues
  3. README
  4. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/cvc5-cvc5.svg)](https://hysenlabs.com/projects/cvc5-cvc5)

Star history chart for your README

markdown
[![Star history](https://hysenlabs.com/chart/cvc5-cvc5.svg)](https://hysenlabs.com/projects/cvc5-cvc5)

Was this useful?