Я хочу изменить Старый z3 :: expr (Oldve c) следующим образом:
OldVec is:(and (= (= R4 0) true) (= (= R6 R7) true))
На новый z3 :: expr (Ve c) следующим образом:
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;
}
Я напечатал Oldve c и Ve c, они выглядят одинаково:
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?