Z3:将 Z3py 表达式从 Solver 对象转换为 SMT-LIB2

标签 z3

这个问题非常类似于:Z3: convert Z3py expression to SMT-LIB2?

是否可以从 Solver 对象生成 SMT-LIB2 输出?

最佳答案

Solver 类具有名为 assertions() 的方法。它将断言的所有公式返回到给定的求解器中。提取断言后,我们可以使用与上一个问题相同的方法。这是对

的快速修改
def toSMT2Benchmark(f, status="unknown", name="benchmark", logic=""):
  v = (Ast * 0)()
  if isinstance(f, Solver):
    a = f.assertions()
    if len(a) == 0:
      f = BoolVal(True)
    else:
      f = And(*a)
  return Z3_benchmark_to_smtlib_string(f.ctx_ref(), name, logic, status, "", 0, v, f.as_ast())

这是一个例子(also available online at here)

s = Solver()
print toSMT2Benchmark(s, logic="QF_LIA")
a, b = Ints('a b')
s.add(a > 1)
s.add(Or(a < 1, b < 2))
print toSMT2Benchmark(s, logic="QF_LIA")

编辑 我们可以使用以下脚本以 SMTLIB 1.x 格式显示输出(也可在线获得 here)。请注意,SMTLIB 1.x 非常有限,有几个功能不受支持。 我们还强烈建议所有用户迁移到 SMTLIB 2.x。

def toSMTBenchmark(f, status="unknown", name="benchmark", logic=""):
  v = (Ast * 0)()
  if isinstance(f, Solver):
    a = f.assertions()
    if len(a) == 0:
      f = BoolVal(True)
    else:
      f = And(*a)
  Z3_set_ast_print_mode(f.ctx_ref(), Z3_PRINT_SMTLIB_COMPLIANT)  # Set SMTLIB 1.x pretty print mode  
  r = Z3_benchmark_to_smtlib_string(f.ctx_ref(), name, logic, status, "", 0, v, f.as_ast())
  Z3_set_ast_print_mode(f.ctx_ref(), Z3_PRINT_SMTLIB2_COMPLIANT) # Restore SMTLIB 2.x pretty print mode
  return r

s = Solver()
print toSMTBenchmark(s, logic="QF_LIA")
a, b = Ints('a b')
s.add(a > 1)
s.add(Or(a < 1, b < 2))
print toSMTBenchmark(s, logic="QF_LIA")

结束编辑

关于Z3:将 Z3py 表达式从 Solver 对象转换为 SMT-LIB2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14775122/

相关文章:

z3 - Z3如何处理非线性整数运算?

z3 - 了解生产证明、字段名称和中间检查对性能的影响

z3 - Presburger 公式与 z3 的可满足性

java - 如何在 Z3 Java API 中设置选项 pp.decimal?

triggers - 试图证明一个人时的令人惊讶的行为

java - Z3:解析SMTLIB2文件/字符串

z3 - 如何更改 get-model 或 get-value 输出以打印小数而不是分数

z3 - 有没有办法在SMTLIB中表达 "if and only if"?

c# - 在 Azure 上运行时 F# 中的异常

z3 - Z3 中带有量词的函数