如何使用 Z 3 Python API 获得 SMT LIB 格式的求解器(问题)?

How do I get a solver (problem) in an SMTLIB format using the Z3 Python API?

我想打印问题的 SMTLIB 字符串。例如,将构建的问题保存到文件,运行 其他求解器等

我知道 sexpr()to_smt2() 函数,但后者的行为方式出乎意料。特别是它不添加函数定义。在以下脚本之后:

solv = z3.Solver()
n = z3.Int("n")
f = z3.RecFunction("f", [z3.IntSort(), z3.IntSort()])
z3.RecAddDefinition(f, n, n * 5 )
solv.add(f(2) == 10)

现在sexpr()returns

(define-funs-rec ( ( f ((x!1 Int)) Int)) ( (* x!1 5)))
(assert (= ((_ f 0) 2) 10))

缺少例如 set-infocheck-sat 命令。 to_smt2() 另一方面 returns

(set-info :status unknown)
(assert (= ((_ f 0) 2) 10)) 
(check-sat)

打印 set-info/check-sat 这是我所期望的,但不包括 f 的函数定义。如何获得包含定义等以及 check-sat/set-info 等命令的 SMTLIB2 字符串?

没有。只需使用 sexpr 并自己添加额外的位即可。