2016-04-04 4 views
1

Ich möchte Gleichungen/Ungleichungen in Z3Py automatisch mit einem Algorithmus erzeugen, den ich entwickle. Um dies zu erreichen, muss ich Operatoren wie ==, +, * als Funktionen verwenden.Z3Py: Erhalten der Funktion, die jedem Operator entspricht, z. '*', '==', '-'

Zum Beispiel in Sympy, kann ich zwei Symbole hinzufügen, wie

import sympy as sp 
sp.Add(x, y) 

, die in x + y ergibt folgt.

Kann ich dasselbe in Z3Py tun?

Für Berechnungsgeschwindigkeit glaube ich, dass es keine gute Idee ist, von oder in eine Zeichenfolgendarstellung des Ausdrucks zu konvertieren.

+1

Vielleicht sehen Sie sich das ['operator'-Modul] (https://docs.python.org/2/library/operator.html#operator.add) an. –

+0

Als ich in der Vergangenheit mit z3py gespielt hatte, war es hilfreich für mich, einfach den [Quellcode] (https://github.com/Z3Prover/z3/tree/master/src/api/python) zu lesen, um zu sehen, was war dort. Es ist nicht sehr gut dokumentiert, aber die tatsächliche Python-Wrapper-Quelle ist relativ klein im Vergleich zu Z3 selbst, die in C++ geschrieben ist. – asmeurer

Antwort

2

Ich kann keine Dokumentation finden (und ich nehme an, Sie können auch nicht) für die direkte Unterstützung durch z3py jedoch alle impliziten Operationen in Python haben aufrufbaren Funktionen im Modul operator :

import operator 

x,y = Ints("x y") 

a = operator.add(x,y) 

, wenn Sie die Funktionen auf ihre Symbole zuordnen möchten Sie eine dict verwenden können:

ops = {"+":operator.add, "*":operator.mul} #etc. 
1

Wie wäre:

import z3 

x, y = z3.Ints('x y') 
print z3.ExprRef.__eq__(x, y) 
+0

Wie würdest du das für so etwas wie '3 <= x <= 7' machen? –

+0

@ TadhgMcDonald-Jensen '3 <= x <= 7' ist kein Operator in Python. Python kettet automatisch relationale Operatoren, aber es macht es so, dass Programme wie Z3 und SymPy sie nicht symbolisch darstellen können. Sie können http://docs.sympy.org/latest/modules/core.html#greaterthan für eine Diskussion darüber sehen. Um das darzustellen, müssen Sie 'And (3 <= x, x <= 7)' verwenden (was auch immer Und in Z3 genannt wird, wahrscheinlich '(3 <= x) & (x <= 7)' funktioniert auch , aber Sie müssen auf den Vorrang achten). – asmeurer

Verwandte Themen