C++ 如何将旧的z3::expr(Oldvec)更改为新的z3::expr(Vec)?
我想更改一个旧的z3::exprOldvec,如下所示: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-
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直接创建表达式