2015-10-22 2 views
0

Comment puis-je lister uniquement les résultats de contraintes spécifiques de mon noyau unsat? J'ai beaucoup de conditions et l'impression de tout le noyau n'imprime pas tout. J'ai lu que cela peut être fait avec les commandes assert_and_track et unsat_core. J'ai trouvé quelques exemples mais ils ne fonctionnent pas. Une expérience avec ça?Comment afficher la contrainte insat spécifique, pas le noyau entier (Z3, Python)

s.assert_and_track(A > B, 'p1') 
s.assert_and_track(B > C, 'p2') 
if s.check() == sat: 
    print('ok') 
else: 
    c = s.unsat_core 
    print(c) <- this print all core 

Alors, comment imprimer seulement p1 ou p2 (juste vrai/faux résultat)? par exemple. p2 = false, ou il peut être affiché tel qu'il est affiché en mode impression (c) - mais seulement pour p1.

Répondre

0

La meilleure façon d'y parvenir est d'enregistrer simplement une carte d'étiquettes à des contraintes, pour ce exemples que nous pouvons faire

M = {} 
M['p1'] = (A > B) 
M['p2'] = (B > C) 
M['p3'] = (C > A) 

afin que plus tard, nous pouvons imprimer le cœur en fonction de ces contraintes, par exemple comme suit

core = s.unsat_core() 
for e in core: 
    print(M[str(e)]) 

Bien sûr, cela fonctionnera également si vous ne voulez imprimer que certaines entrées au lieu de toutes.

+0

Cela ne fonctionne pas. Premièrement, je dois corriger l'erreur de syntaxe correcte 'print M [str (e)]' à 'print (M [str (e)])' et ensuite j'obtiens 'TypeError: 'méthode' objet n'est pas itérable' en ligne' pour e dans le noyau: '. Essayez aussi de l'afficher directement avec 'print (M ['p1'])' mais cet affichage 'A> B'. Donc, j'essaie de le convertir en booléen 'print (booléen (M ['p1']))' mais cette impression est toujours vraie quelles que soient les conditions (< > ==) je définis. –

+0

On dirait que vous utilisez Python 3.x alors que j'ai utilisé 2.x; Je vais devoir mettre à jour l'exemple pour qu'il fonctionne avec 3.x. –

+0

J'ai mis à jour l'exemple et j'ai corrigé un autre problème de Python 3.x, l'API de Z3. L'exemple fonctionne correctement avec mon Python 3.4.3 sous Windows. Utilisez-vous une ancienne version de Z3 ou de Python? –