Papers
Topics
Authors
Recent
2000 character limit reached

Smt-Switch: a solver-agnostic C++ API for SMT Solving (2007.01374v2)

Published 2 Jul 2020 in cs.LO

Abstract: This extended abstract describes work in progress on Smt-Switch, an open-source, solver-agnostic API for SMT solving. Smt-Switch provides an abstract interface, which can be implemented by different SMT solvers. Smt-Switch provides simple, uniform, and high-performance access to SMT solving for applications in areas such as automated reasoning, planning, and formal verification. The interface allows the user to create, traverse, and manipulate terms, as well as to dynamically dispatch queries to different underlying SMT solvers.

Citations (12)

Summary

  • The paper introduces Smt-Switch, a solver-agnostic C++ API that unifies interaction with multiple SMT solvers for improved performance.
  • The API employs abstract classes like AbsTerm and AbsSmtSolver to delegate operations effectively, ensuring minimal memory overhead.
  • The paper outlines future enhancements including support for additional solvers, quantifiers, and more robust error handling.

Smt-Switch: A Solver-Agnostic C++ API for SMT Solving

The paper under review provides an extended abstract on the development and progress of Smt-Switch, an open-source, solver-agnostic API designed for Satisfiability Modulo Theories (SMT) solving. The API aims to facilitate high-performance and uniform interaction with various SMT solvers through an abstract interface. This work is engineered in C++, with capabilities for Python bindings via Cython, and is influenced by constraints and limitations observed in existing technologies like SMT-LIB and PySMT.

Architectural Overview

Smt-Switch is constructed around an architecture that delegates a significant portion of its functionality to the underlying SMT solvers, effectively minimizing overhead and streamlining maintenance. The API operates through abstract classes such as AbsSort, AbsTerm, and AbsSmtSolver, which must be implemented by the wrapper for each solver. The interface is succinctly designed to handle the traversal and manipulation of terms, alongside the dispatching of queries to different underlying solvers.

The interface focuses on supporting quantifier-free formulas over a variety of domains, including booleans, bitvectors, integers, reals, uninterpreted functions, and arrays. This diversity underscores its utility in domains such as formal verification, automated reasoning, and planning.

Implementation and Technical Insights

Smt-Switch's key design intent is to maintain low memory overhead by serving as a light wrapper on C or C++ APIs of the underlying solvers. It currently supports solvers like Boolector, CVC4, MathSAT, and Yices2, with the possibility of extension to include additional solvers like Z3. Developers aiming to include a new solver must implement the abstract interface for the new solver's API, demonstrating the system's extensibility.

The project employs CMake for the build infrastructure, which allows modular integration of backend solvers. Each backend yields a separate library, facilitating selective linking in user projects. For testing, the API integrates GoogleTest for C++ and Pytest for Python, ensuring robustness across supported platforms.

Functional Aspects

The abstract interface of Smt-Switch augments its versatility. The AbsSort class provides representations for various theories, while the Op struct efficiently covers both primitive and indexed operators. The AbsTerm and AbsSmtSolver classes collectively encapsulate term building and solver operations respectively.

An innovative mechanism is its logging feature, which, when enabled, tracks the term DAG within Smt-Switch, instead of relying solely on the underlying solver's representation. This functionality can be particularly beneficial for solvers that perform on-the-fly rewriting or alias sorts.

To handle anomalies, Smt-Switch defines a specific set of exceptions derived from std::exception, such as NotImplementedException and InternalSolverException, to ensure structured error management across its framework.

Comparison and Future Directions

Smt-Switch differentiates itself from similar frameworks like PySMT, smt-kit, and metaSMT by avoiding separate term representations, aiming instead for minimal overhead and simplicity. Unlike metaSMT, which extensively uses C++ template meta-programming, Smt-Switch employs more straightforward design choices to facilitate runtime decisions for expression building.

Looking ahead, the development roadmap includes integration with additional solvers such as Z3, extension of the interface to support quantifiers and inductive datatypes, and potential performance optimization utilizing advanced data structures.

Conclusion

Smt-Switch, with its solver-agnostic approach, represents a significant utility in the field of performant SMT solving, especially within C++ environments. Its capacity to seamlessly interface with multiple SMT solvers, combined with modest complexity, presents both immediate and long-term benefits for researchers engaged in the development of applications demanding dynamic solver adaptations.

This system's availability on GitHub, coupled with existing utilitarian applications in projects like Pono, underscores its value to the research community, fostering a collaborative trajectory for further enhancements and adoption in diverse applications.

Dice Question Streamline Icon: https://streamlinehq.com

Open Problems

We haven't generated a list of open problems mentioned in this paper yet.

Lightbulb Streamline Icon: https://streamlinehq.com

Continue Learning

We haven't generated follow-up questions for this paper yet.

List To Do Tasks Checklist Streamline Icon: https://streamlinehq.com

Collections

Sign up for free to add this paper to one or more collections.

X Twitter Logo Streamline Icon: https://streamlinehq.com

Tweets

This paper has been mentioned in 1 tweet and received 4 likes.

Upgrade to Pro to view all of the tweets about this paper: