2016-07-25 50 views
0

Kürzlich arbeite ich mit Boolean Netzwerk und ich benutze Sympy, um boolesche Funktionen zu manipulieren. Ich denke, das kann eine sehr grundlegende Frage sein, aber ich konnte keine Ahnung finden.In Sympy, wie funktionale Ausdruck in Operator überladenen Ausdruck übersetzt werden kann?

Folgende Linie funktioniert gut.

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

Hier habe ich sehr einfache Frage. Wie kann der Ausdruck 'Und (Oder (x, y), x)' ausgedrückt werden als '(x | y) & x'?

Dank

Antwort

0

Sympy macht ausgiebig Gebrauch von Python Betreiber Überlastung Fähigkeiten. In Python kann jede Klasse definieren, wie jeder mathematische Operator wirksam wird, indem Methoden mit speziellen Namen definiert werden - diese Methoden werden immer vorangestellt und mit __ postfixiert und sind in der Python Data Model beschrieben.

Sympy-Symbole und -Ausdrücke sind Objekte, die alle operatorbezogenen Methoden zum Ausführen einer Operation neu definieren, die ein Sympy-Ausdrucksobjekt anstelle eines numerischen Ergebnisses zurückgeben.

So sind die Betreiber für bynary und & ein dbinary oder | sind nur ein Teil dessen, was Sympy der Fall ist, und die langen englischen Versionen And und Or Funktionsaufrufe sind auch für einfache Eingabe und Lesbarkeit in bestimmten Kontexten zur Verfügung gestellt.

+0

Vielen Dank für die freundliche detaillierte Antwort. Gibt es eine einfache Funktion, um die String-Variable 'And (Or (x, y), x)' in die String-Variable '(x | y) & x' zu übersetzen? Wenn die Lösung nicht einfach ist, können Sie dann einen Hinweis darauf geben? –

0

Wenn Sie nur schöner Druck möchten, können Sie

init_printing() 

laufen und es wird es mit Unicode-Zeichen drucken, oder sogar LaTeX, wenn es (wie in der Jupyter Notebook)

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

verfügbar ist Sie können auch die pprint() Funktion verwenden, um dies direkt zu erhalten.

Es sieht aus wie die Standard-SymPy Drucker verwenden And und Or anstelle der & und | Symbole logischen Ausdrücken zu drucken, wenn Sie also explizit diejenigen wollen, würden Sie brauchen sympy.printing.str.StrPrinter Unterklasse und überschreiben _print_And und _print_Or (siehe current implementation zu eine Vorstellung davon bekommen, wie das funktionieren würde).

+0

Ich habe ein Problem geöffnet, um den Standarddruck in SymPy zu ändern https://github.com/sympy/sympy/issues/11435 – asmeurer

+0

Ich fand es eine gute Lösung für mein Problem. Danke für den guten Hinweis. –