Как реализовать собственную тактику упрощения в Z3?

В своем инструменте я использую условия, которые сравнивают константы с целочисленными переменными (например, y < 100). Часто существует несколько условий для одной переменной, и я хочу упростить эти случаи. Например: у < 100 && у! = 99 должно стать у < 99. Тактика упрощения не делает этого, и ни один из аргументов в пользу упрощения не может помочь.

В коде:

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?

2

Решение

Тактика Z3 хранится в каталоге: src/tactic, Арифметика, связанная с тактикой, находится в подкаталоге arith, Вы должны использовать существующую тактику в качестве «шаблона» для реализации своей тактики.
Хороший пример
https://z3.codeplex.com/SourceControl/latest#src/tactic/arith/normalize_bounds_tactic.cpp

Чтобы сделать новую тактику доступной в интерфейсе API и SMT 2.0, мы должны включить комментарий, содержащий ADD_TACTIC команда. Эта команда инструктирует Z3 mk_make Скрипт, чтобы склеить все вместе. Аргументы: название тактики, описание и код C ++ для создания тактики.

/*
ADD_TACTIC("normalize-bounds",
"replace a variable x with lower bound k <= x with x' = x - k.",
"mk_normalize_bounds_tactic(m, p)")
*/

Кстати, вы также можете попытаться реализовать новую функцию, расширив существующую тактику, такую ​​как:
https://z3.codeplex.com/SourceControl/latest#src/tactic/arith/propagate_ineqs_tactic.cpp

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]