繁体   English   中英

将Z3模型值导入C ++

[英]Import Z3 model value to C++

我正在编写一些代码来生成Z3的约束,然后求解结果。 我可以通过命令Z3_model_to_string(ctx,m)打印出结果,结果显示x1-> 1 x2->100 ,其中x1和x2都是int。 我的问题是如何将这些整数值保存到C ++变量中以供将来分析?

这是我为Z3编写的代码部分

Z3_model m;
context ctx;
Z3_ast fs;
string str = "(declare-const x1 Int) (assert (> x1 0)) (declare-const x2 Int) (assert (not (< x2 100)))" //Generated by some other function
fs  = Z3_parse_smtlib2_string(Z3_context(ctx), str, 0, 0, 0, 0, 0, 0);
Z3_assert_cnstr(Z3_context(ctx), fs);
Z3_lbool result = Z3_check_and_get_model(Z3_context(ctx), &m);
switch (result) {
case Z3_L_FALSE:
    printf("unsat\n");
    break;
case Z3_L_UNDEF:
    printf("unknown\n");
    printf("potential model:\n%s\n", Z3_model_to_string(Z3_context(ctx), m));
    break;
case Z3_L_TRUE:
    printf("sat\n%s\n", Z3_model_to_string(Z3_context(ctx), m));
    break;
}
int num_constants = Z3_get_model_num_constants(Z3_context(ctx), m);
model aaa(ctx,m);
for (i = 0; i< num_constants; i++) {
    z3::expr r = aaa.get_const_interp(aaa.get_func_decl(i));
}

获得模型m ,可以使用类模型中的get_const_intrp和get_func_interp函数来获取它们的值。 对于简单整数变量的情况,模型中应该有n常量(即常量函数),即m.num_consts() = n

expr r = m.get_const_interp(m.get_const_decl(i));

将返回模型中第i个常量的解释。 对于简单整数约束的情况,结果通常是描述数值的expr ,即r.is_numeral()应为true。 我们可以通过以下函数获得这些模型值的不同表示:

对于整数和其他类型:

Z3_get_numeral_string
Z3_get_numeral_decimal_string
Z3_get_numeral_int
Z3_get_numeral_uint
Z3_get_numeral_uint64
Z3_get_numeral_int64

对于实数/有理数:

Z3_get_numeral_small
Z3_get_numerator
Z3_get_denominator
Z3_get_numeral_rational_int64

名称的最后一部分表示将返回什么类型的对象。 请注意,如果模型值不适合返回类型,则这些函数将返回false (例如,对于int范围,数字太大)。 如果预计所有模型值都很小,我们当然可以使用这些函数。 安全(和慢)的方法是请求一个字符串,然后将它转换为您用于应用程序的大整数表示。

注意:C ++ API只是C API之上的一个薄层,这两个API可以一起使用。 许多函数只存在于C层,C ++对象(如asts和exprs)应自动转换为适合C API的指针。

以下是此特定案例的完整示例。 我冒昧地用更像C ++的样式重写一些代码:

#include <string>
using namespace std;

#include <z3++.h>
using namespace z3;

void main() {
    try {        
        context ctx;        
        Z3_string str = "(declare-const x1 Int) (assert (> x1 0)) (declare-const x2 Int) (assert (not (< x2 100)))"; //Generated by some other function
        expr fs(ctx, Z3_parse_smtlib2_string(Z3_context(ctx), str, 0, 0, 0, 0, 0, 0));

        solver s(ctx);
        s.add(fs);
        check_result cr = s.check();

        model aaa(ctx, s.get_model());
        int num_constants = aaa.num_consts();
        for (int i = 0; i < num_constants; i++) {
            func_decl fd = aaa.get_const_decl(i);
            z3::expr r = aaa.get_const_interp(fd);
        }
    }
    catch (z3::exception e) {
        std::cout << e.msg() << std::endl;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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