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.

questionAnswers(1)

yourAnswerToTheQuestion