Existe-t-il un moyen de faire fonctionner le code suivant et d'imprimer un cœur Unsat valide?Est-il possible d'utiliser solver.unsat_core sans utiliser solver.assert_and_track?
from z3 import *
a = Int('a')
b = Int('b')
s = Solver()
s.add(a == 1)
s.add(a == 2)
s.add(b == 3)
s.check()
# This prints [], and I would like it to print [a == 1, a == 2]
print(s.unsat_core())
Je sais que je pourrais le faire à la place:
from z3 import *
a = Int('a')
b = Int('b')
s = Solver()
s.assert_and_track(a == 1, 'p1')
s.assert_and_track(a == 2, 'p2')
s.assert_and_track(b == 3, 'p3')
s.check()
# This prints [p1, p2]
print(s.unsat_core())
Mais pour le vrai projet sur lequel je travaille, il serait pénible de passer et donner des noms à toutes les contraintes (en raison de leur volume, ainsi que comment ils sont générés.)
Ce que j'ai fini par faire était similaire à ce que vous suggérez. J'ai implémenté ma propre version de add, qui utilisait assert_and_track sous le capot (en utilisant: .assert_and_track (expr, str (expr))) – Others
Nice .. Si vous le pouvez, merci de l'ajouter à un repo et de le partager avec le reste de nous. Ou mieux encore, envoyez une demande de tirage aux gars du Z3 sur leur site github: https://github.com/Z3Prover/z3 –