Étant donné une formule Z3 dans CNF, est-il possible de la convertir en une liste de listes avec Z3Py? Je voudrais le faire pour faciliter l'accès et la manipulation des littéraux. Si Python était un langage fonctionnel, je pourrais faire quelque chose commeConversion de la formule CNF Z3 en représentation de liste de listes à l'aide de Z3Py
def cnf2list(fm) :
match fm with
| And(P,Q) -> cnf2list(P) + cnf2list(Q)
| P -> clause2list(P)
def clause2list(fm) :
match fm with
| Or(P,Q) -> clause2list(P) + clause2list(Q)
| P -> [P]
Mais je ne suis pas sûr que je peux le faire en Python. Est-il possible d'effectuer un appariement de modèles comme ci-dessus (ou d'utiliser une méthode entièrement différente) pour obtenir une représentation par liste de listes d'une formule CNF Z3?
Ceci est une conséquence inévitable de la coutume '__eq__'. –
Le test d'appartenance de liste 'x in xs' est à peu près équivalent à' any (bool (x == el) pour el dans xs) ', et' bool () 'est toujours vrai selon [ces règles] (https://docs.python.org/3/reference/datamodel.html#object.__bool__). Ce comportement n'est certainement pas assez problématique pour sacrifier la commodité du symbolique '==', mais je pense qu'une amélioration mineure est possible. Envisagez d'ajouter la méthode '__bool__' qui déclenche une exception, afin d'éviter une telle utilisation. Je suis à peu près sûr que la majorité des cas où l'expression booléenne symbolique est utilisée dans un contexte booléen concret sont des erreurs. –
C'est super, merci d'avoir expliqué que @VladShcherbina! Je vais aller de l'avant et ajouter la méthode __bool__. –