Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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::expr(Oldvec)更改为新的z3::expr(Vec)?_C++_Z3 - Fatal编程技术网

C++ 如何将旧的z3::expr(Oldvec)更改为新的z3::expr(Vec)?

C++ 如何将旧的z3::expr(Oldvec)更改为新的z3::expr(Vec)?,c++,z3,C++,Z3,我想更改一个旧的z3::exprOldvec,如下所示: OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true)) Vec is:(and (= (= R4 0) false) (= (= R6 R7) true)) void changeZ3(z3::expr &OldVec) { std::string s="(set-info :status unknown)\n" "(declare-

我想更改一个旧的z3::exprOldvec,如下所示:

OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
void changeZ3(z3::expr &OldVec) {
    std::string s="(set-info :status unknown)\n"
                  "(declare-fun R4 () Int)\n"
                  "(declare-fun R7 () Int)\n"
                  "(declare-fun R6 () Int)\n"
                  "(assert\n"
                  " (= (= R4 0) false))\n"
                  "(assert\n"
                  " (= (= R6 R7) true))\n"
                  "(check-sat)";
    std::cout<<"OldVec is:"<<OldVec<<"\n";
    z3::expr Vec=C.parse_string(s.data());
    std::cout<<"Vec is:"<<Vec<<"\n";
    OldVec=Vec;
}
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^    
changeZ3(Vec);
Solver.add(Vec);
terminate called after throwing an instance of 'z3::exception' 
对于新的z3::exprVec,如下所示:

OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
void changeZ3(z3::expr &OldVec) {
    std::string s="(set-info :status unknown)\n"
                  "(declare-fun R4 () Int)\n"
                  "(declare-fun R7 () Int)\n"
                  "(declare-fun R6 () Int)\n"
                  "(assert\n"
                  " (= (= R4 0) false))\n"
                  "(assert\n"
                  " (= (= R6 R7) true))\n"
                  "(check-sat)";
    std::cout<<"OldVec is:"<<OldVec<<"\n";
    z3::expr Vec=C.parse_string(s.data());
    std::cout<<"Vec is:"<<Vec<<"\n";
    OldVec=Vec;
}
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^    
changeZ3(Vec);
Solver.add(Vec);
terminate called after throwing an instance of 'z3::exception' 
我尝试将字符串更改为z3::expr,如下所示:

OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
void changeZ3(z3::expr &OldVec) {
    std::string s="(set-info :status unknown)\n"
                  "(declare-fun R4 () Int)\n"
                  "(declare-fun R7 () Int)\n"
                  "(declare-fun R6 () Int)\n"
                  "(assert\n"
                  " (= (= R4 0) false))\n"
                  "(assert\n"
                  " (= (= R6 R7) true))\n"
                  "(check-sat)";
    std::cout<<"OldVec is:"<<OldVec<<"\n";
    z3::expr Vec=C.parse_string(s.data());
    std::cout<<"Vec is:"<<Vec<<"\n";
    OldVec=Vec;
}
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^    
changeZ3(Vec);
Solver.add(Vec);
terminate called after throwing an instance of 'z3::exception' 
changeZ3返回后,我执行了Solver.addVec,如下所示:

OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
void changeZ3(z3::expr &OldVec) {
    std::string s="(set-info :status unknown)\n"
                  "(declare-fun R4 () Int)\n"
                  "(declare-fun R7 () Int)\n"
                  "(declare-fun R6 () Int)\n"
                  "(assert\n"
                  " (= (= R4 0) false))\n"
                  "(assert\n"
                  " (= (= R6 R7) true))\n"
                  "(check-sat)";
    std::cout<<"OldVec is:"<<OldVec<<"\n";
    z3::expr Vec=C.parse_string(s.data());
    std::cout<<"Vec is:"<<Vec<<"\n";
    OldVec=Vec;
}
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^    
changeZ3(Vec);
Solver.add(Vec);
terminate called after throwing an instance of 'z3::exception' 
然后我在执行Solver.addVec时遇到了一个异常,如下所示:

OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
void changeZ3(z3::expr &OldVec) {
    std::string s="(set-info :status unknown)\n"
                  "(declare-fun R4 () Int)\n"
                  "(declare-fun R7 () Int)\n"
                  "(declare-fun R6 () Int)\n"
                  "(assert\n"
                  " (= (= R4 0) false))\n"
                  "(assert\n"
                  " (= (= R6 R7) true))\n"
                  "(check-sat)";
    std::cout<<"OldVec is:"<<OldVec<<"\n";
    z3::expr Vec=C.parse_string(s.data());
    std::cout<<"Vec is:"<<Vec<<"\n";
    OldVec=Vec;
}
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^    
changeZ3(Vec);
Solver.add(Vec);
terminate called after throwing an instance of 'z3::exception' 
为什么会这样?是否有其他方法来更改z3::expr?

通常,需要告知对parse_文件的调用作用域中的排序和声明是什么。也就是说,虽然您成功地在Vec中构造了表达式,但仍然需要在上下文中插入sort Int以及R4、R7和R6的声明

这是z3编程中的一个常见问题:您必须记住,在调用Solver.add时,必须为这些公式适当设置Ctx,以使其有意义

通常,您应该避免像这样解析字符串并将其添加到解算器中。相反,您应该在现有的上下文中工作,并使用表达式AST直接创建表达式