该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())
Run Code Online (Sandbox Code Playgroud)
这是一个例子(也可以在这里在线获得)
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")
Run Code Online (Sandbox Code Playgroud)
编辑我们可以使用以下脚本以SMTLIB 1.x格式显示输出(也可在此处在线获取).请注意,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")
Run Code Online (Sandbox Code Playgroud)
结束编辑
| 归档时间: |
|
| 查看次数: |
855 次 |
| 最近记录: |