Z3_benchmark_to_smtlib_string()的输入参数

时间:2012-03-27 13:00:59

标签: z3

我正在尝试使用函数Z3_benchmark_to_smtlib_string()。以下是我正在使用的论据:

Z3_benchmark_to_smtlib_string(
                   ctx,          /* this one is valid */
                   "test",       /* this one is random, I don't understand it */
                   "QF_UFBV",    /* I got this name from the smtlib website, valid ? */
                   "sat",        /* not sure about this one either */
                   NULL,         /* not sure about this one either */
                   nb_assumptions, /* should be ok */
                   assumptions,    /* should be ok too */
                   NULL);          /* not sure about this one, is this mandatory ? */

欢迎任何帮助。

与此同时,我正在使用:

动态显示我的假设

Z3_set_ast_print_mode(CTX,Z3_PRINT_SMTLIB2_COMPLIANT);

得到奇怪的字符,如:?x21,?x24,?x37,(见下文)。有什么提示可以解决这个问题吗?

提前致谢,

A.G。

(let((?x21(bvand(_ bv582 32)(ite(=((_ sign_extend 24)(_ bv98 8))((_ sign_extend 24)| Mem5 [8] |))(_ bv64 32 )(_ bv0 32))))) (let((?x24(bvand?x21(ite(bvsgt((_ sign_extend 24)(_ bv98 8))((_ sign_extend 24)| Mem5 [8] |))(_ bv128 32)(_ bv0 32) )))) (let((?x37(bvand?x24(ite(=((_ sign_extend 24)(_ bv97 8))((_ sign_extend 24)| Mem6 [8] |))(_ bv64 32)(_ bv0 32) )))) (bvand?x37(ite(bvsgt((_ sign_extend 24)(_ bv97 8))((_ sign_extend 24)| Mem6 [8] |))(_ bv128 32)(_ bv0 32))))))< / p>

1 个答案:

答案 0 :(得分:2)

这个功能很老了。它是在SMT 2.0不存在时创建的。 SMT 1.0基准测试看起来像这样:

(benchmark example
:status sat
:logic QF_LIA
:extrafuns ((x1 Int) (x2 Int) (x3 Int) (x4 Int) (x5 Int))
:assumption (>= (- x1 x2) 1)
:assumption (>= (- x1 x2) 3)
:assumption (= x3 x5)
:formula (= x2 (* 6 x4))
)

您正在使用的功能是用于以此格式生成基准。这就是为什么我们有namelogicstatus等参数。它们对应于上例中的注释。此外,SMT 1.0问题由0个或更多假设和1个公式组成。

当引入SMT 2.0时,我们已经扩展到以SMT 2.0格式打印基准

Z3_set_ast_print_mode(ctx,Z3_PRINT_SMTLIB2_COMPLIANT);

奇怪的字符只是辅助let声明,用于避免在打印公式时出现指数爆炸。请注意,Z3 AST是DAG而不是树。使用具有大量共享的C API创建DAG非常容易。例如:

 a_1 = Z3_mk_bvadd(b, c)
 a_2 = Z3_mk_bvmul(a1, a1)
 a_3 = Z3_mk_bvadd(a2, a2)
 a_4 = Z3_mk_bvmul(a3, a3)
 ...

AST a_100是内存中非常紧凑的对象。如果我们尝试在不使用辅助let声明的情况下将其打印为树,则输出将非常大。

请注意,此功能产生的输出绝不会被人类消耗。它主要用于为SMT-LIB存储库生成基准。