获得SMT2格式的求解器

时间:2014-08-01 18:50:28

标签: z3 z3py

我正在使用java API生成代码,但我想向用户显示SMT2格式的代码,有没有办法从java API中获取它?

让我说我想要一些像这样生成的代码......

(forall ((task Task)) (not (mustPrecede task task)))
(forall ((t1 Task) (t2 Task) (t3 Task))
(=> (and (mustPrecede t1 t2) (mustPrecede t2 t3)) (mustPrecede t1 t3)))

可以解析成这样的东西

(declare-fun TaskUser (Task User) Bool)
(declare-fun mustPrecede (Task Task) Bool)
(assert(forall((t Task)) (not (mustPrecede t t))))
(assert(forall((t1 Task)(t2 Task)(t3 Task)) (implies (and (mustPrecede t1 t2)     (mustPrecede t2 t3)) (mustPrecede t1 t3))))
(assert(forall((t Task)(u User)) (TaskUser t u)))

1 个答案:

答案 0 :(得分:0)

如果我们将AST的打印模式设置为相应的选项,则表达式将以SMT2语法打印,例如

ctx.setPrintMode(Z3_PRINT_SMTLIB2_COMPLIANT);

每当调用AST或Expr上的.toString()函数时,它将符合SMT2。

请注意,.toString()函数只会打印表达式本身,而不会打印它们可能依赖的任何声明。如果需要声明,很可能在客户端代码中的某处有一个列表,但如果不是这种情况,则需要遍历表达式以查找它们所依赖的所有函数声明。可以通过在Expr。

上调用.getFuncDecl()来获取函数声明