我正在使用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)))
答案 0 :(得分:0)
如果我们将AST的打印模式设置为相应的选项,则表达式将以SMT2语法打印,例如
ctx.setPrintMode(Z3_PRINT_SMTLIB2_COMPLIANT);
每当调用AST或Expr上的.toString()
函数时,它将符合SMT2。
请注意,.toString()
函数只会打印表达式本身,而不会打印它们可能依赖的任何声明。如果需要声明,很可能在客户端代码中的某处有一个列表,但如果不是这种情况,则需要遍历表达式以查找它们所依赖的所有函数声明。可以通过在Expr。
.getFuncDecl()
来获取函数声明