[英]Getting solver in SMT2 format
我正在使用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)))
如果我们将AST的打印模式设置为相应的选项,则将以SMT2语法打印表达式。
ctx.setPrintMode(Z3_PRINT_SMTLIB2_COMPLIANT);
每当调用AST或Expr上的.toString()
函数时,它就会符合SMT2。
请注意, .toString()
函数将仅打印表达式本身,而不打印它们可能依赖的任何声明。 如果需要声明,则可能在客户端代码中的某处存在它们的列表,但是如果不是这样,则需要遍历表达式以查找它们所依赖的所有函数声明。 可以通过在Expr上调用.getFuncDecl()
获得函数声明。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.