跳到内容

sosy-lab/java-smt

存储库文件导航

JavaSMT软件

生成状态 Windows上的生成状态 测试覆盖范围 Apache 2.0许可证 Maven中央

JavaSMT是用于访问各种SMT解算器的通用API层。API针对性能进行了优化(使用JavaSMT时运行时间非常少与直接使用解算器API相比的开销)、可定制性(各种解算器暴露的功能和设置应通过包装层)和类型安全(不可能添加布尔术语到整数位编译有时以冗长为代价。

快速链接

入门|文档|已知问题|开发人员文档|变更日志|配置选项

工具书类

功能概述

JavaSMT可以用以下理论表达公式:

  • 整数
  • 理性
  • 位向量
  • 浮点型
  • 阵列
  • 未解释函数
  • 字符串和RegEx

对某一理论的具体支持取决于底层SMT求解器。只有少数SMT解算器支持数组、浮点、字符串或正则表达式等理论。

目前,JavaSMT支持多个SMT解算器(请参见入门用于安装):

SMT解算器 Linux 64 Windows 64 MacOS操作系统 描述
转向器 ✔️ 位向量逻辑的快速求解器遗漏了公式自省
CVC4型 ✔️
CVC5型 ✔️ 新的!
数学SAT5 ✔️ ✔️
开放式SMT ✔️ 新的!
优化数学卫星 ✔️ 基于MathSAT5,支持优化
公主 ✔️ ✔️ ✔️ 基于Java的SMT求解器
SMT互联网 ✔️ ✔️ ✔️ 基于Java的SMT求解器
Yices2号机组 ✔️ 很快
Z3公司 ✔️ ✔️ ✔️ 成熟而知名的解决方案

支持以下功能(取决于使用的SMT解算器):

  • 满意度检查
  • 量词和量词消除
  • 带假设的增量求解
  • 使用推送/弹出进行增量求解
  • 多个独立上下文
  • 模型生成
  • 插值,包括树和序列结构
  • 使用内置策略进行公式转换
  • 使用访问者进行公式内省

我们的目标是支持更重要的功能、更多SMT解算器和更多系统。如果缺少特定内容,请查找或提交问题

多线程支持

SMT解算器 并发上下文使用¹ 并行校准仪使用²
转向器 ✔️
CVC4型 ✔️ ✔️
CVC5公司
数学SAT5 ✔️
开放式SMT
优化数学卫星 ✔️
公主 ✔️
SMT互联网 ✔️
Yices2号机组
Z3公司 ✔️

使用中断关机通知程序可用于中断任何线程的解算器。公式可以在上下文/证明者/线程之间进行翻译,使用FormulaManager.translateFrom()

¹多个上下文,但每个上下文上的所有操作仅来自单个线程。²在一个或多个上下文中使用多个谚语,每个谚语使用自己的线程。

本机解算器中的垃圾收集

JavaSMT公开了用于在解算器上执行垃圾收集的API用母语实现。作为本地解算器,无法知道创建的公式是否对象仍被客户端应用程序引用,则此API为以避免内存泄漏。请注意,已有几个解算器支持散列一致因此,有内存中同一公式对象的副本永远不会超过一个。因此,如果以后重新使用(或重新创建)所有创建的公式在应用程序中,不需要执行任何垃圾处理完全收集。

Z3公司

参数solver.z3.use幻影参考可用于控制JavaSMT是否会尝试减少对Z3公式的引用对象一旦不再被引用。

数学SAT5

目前我们不支持对MathSAT5执行垃圾收集。

入门

可以通过以下方式进行安装马文,常春藤,或手动请参阅我们的入门指南

用法

//以SMTInterpol作为后端实例化JavaSMT(有关依赖关系,请参阅文档)
尝试(解算器上下文 上下文=SolverContextFactory解决方案上下文工厂创建SolverContext(配置,记录器,shutdownNotifier(关闭通知程序),解算器SMTINTERPOL公司)) {整数公式管理器 imgr公司=上下文获取公式管理器().获取整数公式管理器();//使用两个整数变量创建公式“a=b”
  整数公式 =imgr公司makeVariable(标记变量)(“a”);整数公式 b条=集成电路管理器makeVariable(标记变量)(“b”);布尔公式 (f)=imgr公司平等的(,b条);//求解公式、获取模型并打印变量赋值
  尝试(验证人环境 检定器=上下文新验证程序环境(校准仪选项生成_模型)) {校准仪添加约束((f));布尔值 是Unsat=校准仪是Unsat();断言!是Unsat;尝试(模型 模型=校准仪获取模型()) {系统外面的打印(“a=%s,b=%s的SAT”,模型评价(),模型评价(b条));}}}

作者