Unsat ядро ​​от Z3 (версия 4)

Я использую Ocaml API Z3 версии 4.0 в течение последнего года или около того, в основном теорию битового вектора. Теперь мне нужно извлечь неподтвержденные ядра после выполнения Z3.solver_check, и, к сожалению, в версии 4 такой возможности нет. Я могу переписать, чтобы использовать предположения для обозначения каждого уравнения битового вектора в формуле, а затем получить ядро ​​unsat, но это критическая часть кода, это может повлиять на общую производительность.

Есть ли способ получить ядро ​​unsat, не делая предположений для версии 4? Долгосрочным решением, конечно же, является переход на последнюю версию, но если есть менее разрушительное решение, это было бы неплохо. Например, есть ли способ извлечь ядро ​​unsat из доказательства unsat (возвращенного Z3.solver_get_proof)?

Спасибо!


person user5754881    schedule 08.08.2016    source источник


Ответы (1)


Если вы используете функцию assert_and_track из модуля Solver, тогда get_unsat_core, также в модуле Solver, возвращает набор литералов отслеживания, соответствующих отслеживаемым утверждениям. Есть пример использования assert_and_track для C # API в методе UnsatCoreAndProofExample2, а также в Java (https://github.com/Z3Prover/z3/blob/master/examples/java/JavaExample.java). В образце ML нет соответствующего примера, но перевод на OCaml не должен быть слишком сложным.

person Nikolaj Bjorner    schedule 09.08.2016
comment
В Z3 версии 4 нет функции Z3.solver_assert_and_track или чего-то подобного. Мой вопрос касался версии 4. Спасибо. - person user5754881; 16.08.2016