原文:https://ericpony.github.io/z3py-tutorial/guide-examples.htm
练习:http://3xp10it.cc/auxilary/2017/11/14/z3-solver%E5%AD%A6%E4%B9%A0/
注:该翻译用于自嗨
Python中使用Z3 API
z3是Microsoft Research开发的高性能的定理证明工具。z3常常被用在许多应用中,如:软件/硬件的验证和测试,约束求解问题,混合系统分析,安全领域,生物学和几何问题。
本教程演示z3py的主要功能,即在python中使用z3 api,请务必跟着一起动手实验。
开始
我们来看一个简单的例子:
x = Int('x')
y = Int('y')
solve(x > 2, y < 10, x + 2*y == 7)
Int('x')函数创建了一个z3的整形变量名为x,solve函数求解了一个约束系统,这个例子使用了两个变量x和y,以及3个约束条件。z3py和python一样使用"="来进行赋值,使用<, <=, >, >=, ==, !=来进行比较。在以上例子中,表达式"x + 2*y == 7"是一个z3约束条件。
默认的,z3py显示公式或表达式时使用数学的标记法,通常用∧来表示逻辑符号与,用∨来表示逻辑符号或,等等。命令set_option(html_mode=True/False)可以用来设置表达式的格式,True使用数学标记法,而False使用z3py的标记法,这也是离线版的z3py默认的模式
x = Int('x')
y = Int('y')
print x**2 + y**2 >= 1
set_option(html_mode=False)
print x**2 + y**2 >= 1
z3提供了一些函数来遍历表达式内容
x = Int('x')
y = Int('y')
n = x + y >= 3
print "num args: ", n.num_args()
print "children: ", n.children()
print "1st child:", n.arg(0)
print "2nd child:", n.arg(1)
print "operator: ", n.decl()
print "op name: ", n.decl().name() #返回str
z3提供所有基本的数学运算符。z3py使用与python相同的运算优先级。和python一样,**代表幂运算。z3可以求解非线性的多项式条件约束。
x = Real('x')
y = Real('y')
solve(x**2 + y**2 > 3, x**3 + y < 5)
过程Real('x')创建了一个实数变量x。z3py可以表示任意大的整数,有理数和无理数。一个无理数是整数系数多项式的根。在内部,z3py精确的表示这些数,无理数以十进制小数的方式来表示,这方便读取结果。
x = Real('x')
y = Real('y')
solve(x**2 + y**2 ==