LIBSMT — SMT Solver Abstraction Layer
A unified abstraction layer over multiple SMT solver backends.
Headers: include/Solvers/SMT/LIBSMT/
Implementation: lib/Solvers/SMT/LIBSMT/
Build target: CanarySMT
Overview
LIBSMT provides a solver-agnostic interface for SMT (Satisfiability Modulo Theories) solving. It abstracts over solver-specific details (Z3, etc.) so that Lotus analyses can issue SMT queries without depending on any single solver backend.
Components
SMTSolver
Abstract base class defining the solver interface:
push()/pop()— Assertion stack management.assertExpr(SMTExpr)— Add a formula to the solver context.check()— Check satisfiability of the current context.getModel()— Retrieve a satisfying model.reset()— Clear all assertions.
SMTExpr and SMTObject
Expression tree representation used to build formulas:
SMTExpr— Typed expression with a solver-specific handle.SMTObject— Base class for all SMT entities (sorts, functions, variables).
SMTFactory
Factory for creating SMT sorts, variables, and expressions:
#include "Solvers/SMT/LIBSMT/SMTFactory.h"
auto &factory = SMTFactory::instance();
auto intSort = factory.getSort("Int");
auto x = factory.makeVariable(intSort, "x");
auto y = factory.makeVariable(intSort, "y");
auto expr = factory.makeEQ(x, y);
Z3Expr and Z3Plus
Z3-specific expression handling and extended operations (quantifier support, optimisation queries, model parsing).
CNF and SATSolver
CNF formula representation and SAT solver interface for boolean-level reasoning:
CNF— Conjunctive normal form representation.SATSolver— SAT solver wrapper (useful for eager bit-blasting).
SMTModel
Represents a satisfying assignment from a solver query, providing value lookup by variable name.
SMTConfigure
Configuration and option management for solver backends.
Usage
#include "Solvers/SMT/LIBSMT/SMTSolver.h"
#include "Solvers/SMT/LIBSMT/SMTFactory.h"
auto &factory = SMTFactory::instance();
auto solver = factory.createSolver();
auto intSort = factory.getSort("Int");
auto x = factory.makeVariable(intSort, "x");
auto gt = factory.makeGT(x, factory.makeIntVal(0));
solver->assertExpr(gt);
auto result = solver->check();
if (result == SmtResult::Sat) {
auto model = solver->getModel();
auto val = model->getValue(x);
// ...
}
See Also
SMT (Satisfiability Modulo Theories) — SMT solver backend (Z3)
CUDD (Binary Decision Diagrams) — BDD solver backend (CUDD)
WPDS (Weighted Pushdown Systems) — Weighted pushdown systems