Núcleos Insaturáveis no Python Z3
Eu estou trabalhando com a API Python do Z3 em uma tentativa de incluir suporte para ele em uma ferramenta de pesquisa que estou escrevendo. Eu tenho uma pergunta sobre como extrair o núcleo insatisfeito usando a interface do Python.
Eu tenho a seguinte consulta simples:
(set-option :produce-unsat-cores true)
(assert (! (not (= (_ bv0 32) (_ bv0 32))) :named __constraint0))
(check-sat)
(get-unsat-core)
(exit)
Executando esta consulta através do executável z3 (porZ3 4,1), Recebo o resultado esperado:
unsat
(__constraint0)
ParaZ3 4,3, Obtenho uma falha de segmentação:
unsat
Segmentation fault
Essa não é a questão principal, embora essa tenha sido uma observação intrigante. Eu então modifiquei a consulta (dentro de um arquivo) como
(assert (! (not (= (_ bv0 32) (_ bv0 32))) :named __constraint0))
(exit)
Usando um manipulador de arquivos, passei o conteúdo deste arquivo (em uma variável `queryStr ') para o seguinte código 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()
Eu recebo a lista vazia da função `unsat_core ': []. Estou usando essa função incorretamente? O docstring para a função sugere que eu deveria estar fazendo algo semelhante a
solver.add(z3.Implies(p1, z3.Not(0 == 0)))
No entanto, eu estava me perguntando se ainda era possível usar a consulta como está, uma vez que está em conformidade com os padrões SMT-LIB v2.0 (creio eu), e se eu estava faltando alguma coisa óbvia.