Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将Z3模型值导入C++;_C++_Z3 - Fatal编程技术网

C++ 将Z3模型值导入C++;

C++ 将Z3模型值导入C++;,c++,z3,C++,Z3,我正在编写一些代码来为Z3生成约束,然后求解结果。我可以用命令 Z3OMDEMYTUR-ToSHIPE(CTX,M)< /COD>打印结果,结果显示X1> 1 X2-> 100代码> X1和X2都在INT中。我的问题是如何将这些整数值保存到C++变量中进行分析?< /P> 这是我为Z3编写的部分代码 Z3_model m; context ctx; Z3_ast fs; string str = "(declare-const x1 Int) (assert (> x1 0)) (decl

我正在编写一些代码来为Z3生成约束,然后求解结果。我可以用命令<代码> Z3OMDEMYTUR-ToSHIPE(CTX,M)< /COD>打印结果,结果显示X1> 1 X2-> 100代码> X1和X2都在INT中。我的问题是如何将这些整数值保存到C++变量中进行分析?< /P> 这是我为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));
}
Z3_模型m;
上下文ctx;
Z3_-ast-fs;
string str=“(declare const x1 Int)(assert(>x1 0))(declare const x2 Int)(assert(not(
一旦有了模型
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_numeric()
应为真。我们可以通过这些函数获得这些模型值的不同表示形式:

对于整数和其他类型:

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
其中名称的最后一部分指示将返回的对象类型。请注意,如果模型值不适合返回类型(例如,对于int范围而言,数字太大),则这些函数将返回
false
。如果预期所有模型值都很小,我们当然可以使用这些函数。安全(且缓慢)的方法是请求字符串,然后将其转换为应用程序使用的任何大整数表示形式

<>注释:C++ API只不过是C API之上的一个薄层,这两个API就意味着要一起使用。许多功能只存在于C层,C++对象如ASE和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;
    }
}
#包括
使用名称空间std;
#包括
使用名称空间z3;
void main(){
试试{
上下文ctx;
Z3_string str=“(声明常量x1 Int)(断言(>x1 0))(声明常量x2 Int)(断言(非(std::cout这里可能是一个愚蠢的问题。
m
的类型是Z3_模型,因为我使用了C API,我尝试了
int num=m.get_const_int()
但是g++报告的
get_const_int是Z3_模型的非类类型{aka_Z3_model*}我必须要在C++ API中的模型和C API中的Z3L模型之间进行转换吗?我想问的另一件事是使用<代码> Z3GETGULL NULTALALION,我必须传递一个AST参数,我猜它应该来自Z3M模型M。有没有方法从模型中获得AST?C++ API有一个类叫做“模型”和C API H。C++类有一个操作符,它将模型自动转换为“Z3YMART”,但不是相反的。但是,可以从Z3L模型(即,模型(CTX,M))构造一个模型,每个EXPR是AST(在C++ API中,你可以看到EXPR是从AST中派生的)。GETXMULTALALIONT采用C等价,即Z3AAST。在C++中,转换应该是通过类AST中定义的转换操作符自动实现的。GETSyTracyItIp在模型中得到相应的解释,这是EXPR(因此也是AST)。从Z3GETGETMULTALALIN的结果已经是Z3AAST。我尝试创建C++上下文并转换为C Z3LY上下文,然后求解结果。G+抱怨类Z3::模型没有成员名为GETYNUMYSTATOSCONSH(),所以我使用了代码> Z3GETGOMDEMLYNUMIX常数(Z3LIVE(CTX),M)
相反。当尝试执行
expr r=m.get_const_interp(m.get_func_decl(i));
终端在抛出z3::exception实例后调用terminate,然后中止。我已将相关代码上载到问题部分。您能看一下吗?