Z3_benchmark_to_smtlib_string()的输入参数
我正在尝试使用函数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(
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)
...
ASTa_100
是内存中非常紧凑的对象。如果我们不使用辅助的let
声明而尝试将其打印为树,那么输出将非常巨大
请注意,此函数产生的输出决不是供人类使用的。它主要用于为存储库生成基准