如何将旧的 z3::expr(Oldvec) 更改为新的 z3::expr(Vec)?
How to change an old z3::expr(Oldvec) to a new z3::expr(Vec)?
我想像这样更改旧 z3::expr(Oldvec):
OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
像这样的新 z3::expr(Vec):
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
我曾尝试将字符串更改为 z3::expr,如下所示:
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;
}
我打印了 Oldvec 和 Vec,它们看起来一样:
OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
changeZ3
返回后,我Solver.add(Vec)
是这样的:
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^
changeZ3(Vec);
Solver.add(Vec);
然后当我这样做 Solver.add(Vec)
时出现异常:
terminate called after throwing an instance of 'z3::exception'
为什么会这样?还有其他方法可以更改 z3::expr?
一般来说,调用parse_file
需要被告知范围内的排序和声明是什么。也就是说,虽然您在 Vec
中成功构造了 "expression",但您仍然必须将排序 Int
和 R4
、R7
的声明插入到上下文中, 和 R6
.
这是 z3 编程中的一个常见陷阱:您必须牢记,当您调用 Solver.add
时,必须为这些公式适当地设置 Ctx
到 "make sense"。
一般来说,您应该避开 "parsing" 这样的字符串并将它们添加到求解器中。相反,您应该在现有的上下文中工作,并使用表达式 AST 直接创建表达式。
我想像这样更改旧 z3::expr(Oldvec):
OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
像这样的新 z3::expr(Vec):
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
我曾尝试将字符串更改为 z3::expr,如下所示:
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;
}
我打印了 Oldvec 和 Vec,它们看起来一样:
OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
Vec is:(and (= (= R4 0) false) (= (= R6 R7) true))
changeZ3
返回后,我Solver.add(Vec)
是这样的:
z3::expr Vec = Ctx.parse_file(FormulaFile); //FormulaFile save z3::expr which looked like "s" on the top|^
changeZ3(Vec);
Solver.add(Vec);
然后当我这样做 Solver.add(Vec)
时出现异常:
terminate called after throwing an instance of 'z3::exception'
为什么会这样?还有其他方法可以更改 z3::expr?
一般来说,调用parse_file
需要被告知范围内的排序和声明是什么。也就是说,虽然您在 Vec
中成功构造了 "expression",但您仍然必须将排序 Int
和 R4
、R7
的声明插入到上下文中, 和 R6
.
这是 z3 编程中的一个常见陷阱:您必须牢记,当您调用 Solver.add
时,必须为这些公式适当地设置 Ctx
到 "make sense"。
一般来说,您应该避开 "parsing" 这样的字符串并将它们添加到求解器中。相反,您应该在现有的上下文中工作,并使用表达式 AST 直接创建表达式。