В моем инструменте я использую условия, которые сравнивают константы с целыми переменными (например, y < 100). Часто для одной переменной существует несколько условий, и я хочу упростить эти случаи. Например: y & y! = 99 должно стать y < 99. Эта тактика упрощения не делает этого, и ни один из аргументов для упрощения звука, как они могут помочь.Как реализовать обычную упрощенную тактику в Z3?
В Код:
context c;
goal g(c);
expr x = c.int_const("x");
expr y = c.int_const("y");
solver s(c);
expr F = y < 100 && y != 99;
g.add(F);
tactic t = tactic(c, "simplify");
apply_result r = t(g);
for (unsigned i = 0; i < r.size(); i++) {
std::cout << "subgoal " << i << "\n" << r[i] << "\n";
}
Выход в конце концов возвращается: subgoal 0 (goal (not (<= 100 y)) (not (= y 99)))
и не subgoal 0(goal(not(<= 99 y))
или что-то подобное, как я хочу, чтобы это было.
Поэтому я хочу реализовать свою тактику упрощения. К сожалению, я не могу найти, как это сделать. Я знаю, что тактика должна быть реализована на C++, но как я могу представить свою тактику для Z3?