Z3是由微软公司开发的一个优秀的SMT求解器(也就定理证明器),它能够检查逻辑表达式的可满足性。
最近要在Java代码使用Z3,走了很多弯路,费了大约一周时间才搭好环境,所以写下此经验帖,对于其他语言的绑定应该同理:
下载
准备必要的组件:下载对应版本的Z3 编译文件,我的电脑是WIN10 64位版本的,所以下载了z3-4.8.1.016872a5e0f6-x64-win.zip【注意:这个编译文件是JDK11编译的,所以需要JDK11以上才能运行,否则会报java.lang.UnsupportedClassVersionError错误】。
解压缩
解压缩第1步下载的压缩包,暂时称为文件夹z3吧
项目导入
在Java项目中新建一个libs文件夹(如果没有的话),将z3\bin目录下的com.microsoft.z3.jar这个JAR包复制进去,并且在eclipse中导入。(不会导入请看:eclipse中的java工程项目如何引用外部jar包和dll动态链接库?,不需要导入dll文件)
组件复制
将z3\bin目录下libz3java.dll和libz3.dll文件复制到jdk\bin目录下,也就是你的JAVA_HOME\bin里。
代码导入
在需要z3的java文件导入jar包:
import com.microsoft.z3.*;
代码编写
编写z3相应代码,运行即可。
Demo
附上网上找的一段Demo,作者dingbao:
import java.util.HashMap;
import com.microsoft.z3.*;
/**
* a simple example
* solve equation: x + y*c*e = d + a using z3
* @author dingbao
*
*/
public class z3Demo {
public static void main(String[] args){
try{
HashMap<String, String> cfg = new HashMap<String, String>();
cfg.put("model", "true");
Context ctx = new Context(cfg);
Solver s = ctx.mkSolver();
RealExpr a = ctx.mkRealConst("a");
RealExpr c = ctx.mkRealConst("c");
RealExpr d = ctx.mkRealConst("d");
RealExpr e = ctx.mkRealConst("e");
RealExpr x = ctx.mkRealConst("x");
RealExpr y = ctx.mkRealConst("y");
ArithExpr left = ctx.mkAdd(x, ctx.mkMul(y, c, e));
ArithExpr right = ctx.mkAdd(d, a);
BoolExpr equation = ctx.mkEq(left, right);
s.add(equation);
s.add(ctx.mkGt(a, ctx.mkReal(0)));
Status result = s.check();
if (result == Status.SATISFIABLE){
System.out.println("model for: x + y*c*e = d + a, a > 0");
System.out.print(s.getModel());
System.out.println(a.toString());
Expr a_value = s.getModel().evaluate(a, false);
System.out.println(a_value.toString());
}
else if(result == Status.UNSATISFIABLE)
System.out.println("unsat");
else
System.out.println("unknow");
}catch(Exception e){
System.out.println("z3 exception");
e.printStackTrace();
}
}
}
如果你有什么疑问,可以在下面留言。