Использование ядер z3py unsat вместе с z3.Optimize ()

1

Я использую z3 python api. Я хотел бы использовать ненасытную базовую функциональность Z3 с одной стороны и иметь возможность делать оптимизацию по некоторым критериям с другой.

Поэтому, если я использую unsat ядра, я делаю следующее:

self.solver = z3.Solver()
self._solver.assert_and_track(constraint1, error_message1)
self._solver.assert_and_track(constraint2, error_message2)
...
self._solver.check()

if len(self._solver.unsat_core()) > 0
  print (self._solver.unsat_core())

Это работает отлично. Но я мог бы дополнительно использовать функции maximize() и minim() из z3.Optimize(). Этот экземпляр решателя, по-видимому, не предлагает ненасыщенных ядер. Можно ли использовать их вместе?

Также я видел онлайн, что вместо использования функции assert_and_track() можно использовать импликацию для отслеживания несвязанных ядер: Implies (p1, constraint1). В чем тут разница?

Теги:
z3
z3py

1 ответ

0

Z3 не поддерживает оптимизацию и ненасыщенную генерацию в одно и то же время. Вот соответствующий билет около двух месяцев назад: https://github.com/Z3Prover/z3/issues/1577

Обратите внимание, что это происходит не потому, что он не может быть реализован: просто он еще не реализовал это. Регистрация вашего запроса может побудить их добавить поддержку!

Что касается вашего вопроса для отслеживания unsat-core с использованием импликации: я считаю, что, по сути дела, что делает assert_and_track. Вы можете увидеть его исходный код здесь: https://github.com/Z3Prover/z3/blob/d2c937a989ea360e9cba06583ecca257c75870f/src/api/python/z3/z3.py#L6418-L6446 Разве это не работает для вас по какой-то причине?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню