2016-04-04 5 views
1

Я хочу генерировать уравнения/неравенства в Z3Py автоматически используя алгоритм, который я разрабатываю. Для этого мне нужно использовать такие операторы, как ==, +, * как функции.Z3Py: получение функции, соответствующей каждому оператору, например. '*', '==', '-'

Например, в Sympy, я могу добавить два символа следующим образом

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

, что приводит к x + y.

Могу ли я сделать то же самое в Z3Py?

Для скорости вычислений я считаю, что преобразовать из или в строковое представление выражения нехорошо.

+1

, возможно, посмотрите на модуль '' operator' (https://docs.python.org/2/library/operator.html#operator.add). –

+0

Когда я играл с z3py в прошлом, мне было полезно просто прочитать [исходный код] (https://github.com/Z3Prover/z3/tree/master/src/api/python), чтобы узнать, что был здесь. Он не документирован очень хорошо, но фактический источник оболочки Python относительно невелик по сравнению с самим Z3, который написан на C++. – asmeurer

ответ

2

Я не могу найти никакой документации (и я предполагаю, что вы не можете либо) для непосредственной поддержки z3py, однако все неявные операции в питоне есть вызываемые функции в модуле operator :

import operator 

x,y = Ints("x y") 

a = operator.add(x,y) 

, если вы хотите, чтобы отобразить функции их символов, которые вы можете использовать Dict:

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

Как насчет:

import z3 

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

как бы вы сделали это для чего-то вроде '3 <= x <= 7'? –

+0

@ TadhgMcDonald-Jensen '3 <= x <= 7' не является оператором в Python. Python автоматически связывает реляционные операторы, но делает это таким образом, что такие программы, как Z3 и SymPy, не могут символически представлять их. Вы можете посмотреть http://docs.sympy.org/latest/modules/core.html#greaterthan для обсуждения этого вопроса. Чтобы представить это, вы должны использовать 'And (3 <= x, x <= 7)' (используя то, что И вызывается в Z3, возможно, '(3 <= x) & (x <= 7)' работает также , но вы должны быть осторожны с приоритетом). – asmeurer