z3-solver的安装和使用
Z3的安装和使用
Windows上的安装
可以直接在Z3的GitHub主页上下载对应版本的,然后直接配置路径即可。
使用下面的命令检查是否安装成功:
1 | z3 --version |
如果安装成功了会显示z3的版本信息。
Z3的使用
Z3使用SMTLIB格式。具体的可以学习:Introduction | Online Z3 Guide。这是一种类似于Lisp的语言。关于Lisp,我推荐学习SICP(Structure and Interpretation of Computer Science)。
基本命令
基本运行方法
打印:(echo "starting z3...")
。
声明常量:(declare-const a Int)
。
声明函数:(declare-fun f (Int Bool) Int)
。
如果你在example.smt2文件中写入下面的代码(我这里就使用Lisp的高亮了):
1 | (echo "starting Z3...") |
并且运行:
1 | z3 example.smt2 |
你应该可以看见:
1 | starting Z3... |
被打印出来了。
求解SAT问题
下面我们介绍Z3中比较重要的几个命令:
添加约束:(assert (< a 10))
。
判断是否可满足(satisfiable):(check-sat)
。
要求给出可满足的一个赋值:(get-model)
。
1 | (declare-const a Int) |
对于这段代码实际上就是在求解下面这个SAT问题是否可满足:
对于这个问题,Z3给出的答案是:
1 | sat |
这里的常量
设置作用域(Scopes)
push
命令将会创建一个新的作用域,里面存储着所有全局的定义、约束等。
pop
则将会将作用域里所有的语句弹出。
1 | (declare-const x Int) |
配置Z3(Configuration)
使用set-option
,下面是一个例子:
1 | (set-option :print-success true) |
其他命令
(display t)
会把式子变得漂亮一点,(simplify t)
则会化简式子。
(define-sort [symbol] ([params_type]+) [sort])
表示创建一个新的数据类型。
1 | (define-sort List-Set (T) (Array (List T) Bool)) |
就会创建一个类型List-Set
,这个类型要求一个参数T
,并且返回一个类似于Map
的数据类型。
命题逻辑(Propositional Logic)
Z3中已经预先定义好了Bool
类型,并且支持and
、or
、xor
、=>
、ite
(if-then-else)、=
(实际上意味着
1 | (declare-const p Bool) |
define-fun
实际上定义了一个Macro。
如果要证明一个公式
不可满足的核心(Unsatisfiable Cores)
1 | (set-option :produce-unsat-cores true) |
我们在这里把公式+p
。
1 | unsat |
最后发现产生矛盾的核心集是:
未解读的函数和变量
我们完全可以扔给Z3一些它不知道什么含义的函数和变量,让它计算出一个理论,使得约束满足。
例如:
1 | (declare-sort A) |
代表约束:
Z3给出的结果是:
1 | sat |
这个解读代表着:类型
创建新的类型
可以参看 Lisp 的语法。
理论(Theory)
理论大约等于一组公理。
Z3支持的理论有:Arithmetic、Bitvectors、IEEE Floats、Arrays、Datatypes、Strings、Sequences、Sequences、Regular Expressions、Unicode Characters、Special Relations。
Arithmetic
Logic | Fragment | Solver | Example |
---|---|---|---|
LRA | Linear Real Arithmetic | Dual Simplex | |
LIA | Linear Integer Arithmetic | CutSat | |
LIRA | Mixed Real/Integer | Cuts + Branch | |
IDL | Integer Difference Logic | Floyd-Warshall | |
RDL | Real Difference Logic | Bellman-Ford | |
UTVPI | Unit two-variable per inequality | ||
NRA | Polynomial Real Arithmetic | Model based CAD, Incremental Linearization |
策略(Strategies)
这个其实和 Coq证明器有点像,请参看Software Foundations。