2016-07-25 2 views
0

Récemment, je travaille avec un réseau booléen et j'utilise sympy pour manipuler les fonctions booléennes. Je pense que cela peut être une question très simple, mais je n'ai pas pu trouver la moindre idée.En sympy, comment l'expression fonctionnelle peut-elle être traduite en une expression surchargée par l'opérateur?

La ligne suivante fonctionne bien.

>>>from sympy import * 
>>>x,y = symbols("x y") 
>>>(x | y) & x 
And(Or(x, y), x) 

Ici, j'ai une question très simple. Comment l'expression 'And (Or (x, y), x)' peut-elle être exprimée comme '(x | y) & x'?

Merci

Répondre

0

sympy fait un usage intensif des capacités de surcharge de l'opérateur Python. En Python chaque classe peut définir comme n'importe quel opérateur mathématique prendra effet, en définissant des méthodes avec des noms spéciaux - ces méthodes sont toujours préfixées et postfixées avec __, et sont décrites dans le Python Data Model.

Les symboles et expressions Sympy sont des objets qui redéfinissent toutes les méthodes liées à l'opérateur pour effectuer une opération qui renvoie un objet d'expression Sympy au lieu d'un résultat numérique.

Ainsi, les opérateurs de bynary et & un dbinary ou | ne sont qu'une partie de ce que sympy fait, et les longues versions anglaises And et Or appels de fonction sont également fournis pour faciliter la saisie et la lisibilité dans certains contextes.

+0

Merci pour une réponse détaillée. Existe-t-il une fonction simple pour traduire la variable de chaîne 'And (Or (x, y), x)' en variable de chaîne '(x | y) & x'? Si la solution n'est pas simple, alors pouvez-vous donner un indice pour le faire? –

0

Si vous voulez juste plus belle impression, vous pouvez exécuter

init_printing() 

et il l'imprimer en utilisant des caractères Unicode, ou même LaTeX si elle est disponible (comme dans le cahier Jupyter)

In [1]: (x | y) & x 
Out[1]: x ∧ (x ∨ y) 

Vous pouvez également utiliser la fonction pprint() pour l'obtenir directement.

Il ressemble à la valeur par défaut des imprimantes sympy utilisent And et Or au lieu des symboles & et | d'imprimer des expressions logiques, donc si vous voulez explicitement ceux-ci, vous devez sous-classe sympy.printing.str.StrPrinter et passer outre _print_And et _print_Or (voir le current implementation à avoir une idée de comment cela fonctionnerait).

+0

J'ai ouvert un problème pour modifier l'impression par défaut dans SymPy https://github.com/sympy/sympy/issues/11435 – asmeurer

+0

J'ai trouvé que c'était une bonne solution à mon problème. Merci pour le bon indice. –