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

时间:2013-02-08 14:49:02

标签: z3

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

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

1 个答案:

答案 0 :(得分:5)

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")

结束编辑