繁体   English   中英

获取SMT2格式的求解器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM