Я работаю с Python API Z3, пытаясь включить его поддержку в инструмент исследования, который я пишу. У меня вопрос по извлечению неудовлетворительного ядра с помощью интерфейса Python.
У меня такой простой запрос:
(set-option :produce-unsat-cores true)
(assert (! (not (= (_ bv0 32) (_ bv0 32))) :named __constraint0))
(check-sat)
(get-unsat-core)
(exit)
Запустив этот запрос через исполняемый файл z3 (для Z3 4.1), я получаю ожидаемый результат:
unsat
(__constraint0)
Для Z3 4.3 я получаю ошибку сегментации:
unsat
Segmentation fault
Это не главный вопрос, хотя наблюдение было интригующим. Затем я изменил запрос (внутри файла) как
(assert (! (not (= (_ bv0 32) (_ bv0 32))) :named __constraint0))
(exit)
Используя обработчик файлов, я передал содержимое этого файла (в переменной queryStr) в следующий код Python:
import z3
...
solver = z3.Solver()
solver.reset()
solver.add(z3.parse_smt2_string(queryStr))
querySatResult = solver.check()
if querySatResult == z3.sat:
...
elif querySatResult == z3.unsat:
print solver.unsat_core()
Я получаю пустой список от функции `unsat_core ': []. Я неправильно использую эту функцию? Строка документации для функции предполагает, что вместо этого я должен сделать что-то похожее на
solver.add(z3.Implies(p1, z3.Not(0 == 0)))
Однако мне было интересно, можно ли по-прежнему использовать запрос как есть, поскольку он соответствует стандартам SMT-LIB v2.0 (я полагаю), и упустил ли я что-то очевидное.