Z3_benchmark_to_smtlib_string()的输入参数

Z3_benchmark_to_smtlib_string()的输入参数,z3,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",

我正在尝试使用函数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设置快速打印模式(ctx、Z3打印兼容SMTLIB2)

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

提前感谢,

A.G

(让((?x21(bvand(bv582 32)(ite(((签名)扩展24)(bv98 8))((签名)扩展24)(Mem5[8])(bv64 32)(bv0 32‘)) (let((?x24(bvs)和?x21(ite(bvsgt((bvs)扩展24)((bv98 8))((bvs)扩展24)| Mem5[8]|)(bv128 32)((bv0 32)| |) (let((?x37(bvand?x24)(ite((((bv97)8))(((bv97)24)Mem6[8]|)(bv64 32)((bv0 32);)
(bvand?x37(ite(bvsgt(((bv97)8))((bv97)8))((bv24)Mem6[8])((ubv128 32)((ubv0 32俬俬俬)))

此函数非常古老。它是在SMT2.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))
)
您正在使用的函数用于生成此格式的基准。这就是为什么我们有参数,如
名称
逻辑
状态
,等等。它们对应于上面示例中的注释。此外,SMT1.0问题由0个或多个假设和1个公式组成

当SMT2.0被引入时,这种方法被扩展到以SMT2.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
声明而尝试将其打印为树,那么输出将非常巨大

请注意,此函数产生的输出决不是供人类使用的。它主要用于为存储库生成基准